Bu uygulama sadece USB – TLL dönüştürücü ile yapılmalıdır. Bilgisayarın seri portu pin gerilimleri +5V’dan farklı olacağı için dikkatli olunmalıdır.
Selamlar.
Heyecanlı bir konu için yine birlikteyiz. Bir kaç gün önce forumları karıştırırken eski bir soruya rastladım. “Seri port üzerinden, mcu kullanmadan led yakabilir miyiz?”
Seri port pinlerinin iki tanesi karşı cihaza haber vermek için kullanılmakta. Yani çıkış yapılabiliyor. Bunlar DTR ve RTS pinleri. İki led kontrol edilebilir. Ya daha fazlasını istiyorsam?

Üstteki resimde görüldüğü üzere sadece üç adet çıkış bulunmakta: Tx, DTR ve RTS.
Bu yöntemi düşününce, ilk aklıma gelen 74HC595 oldu. Donanımsal SPI modülü olmayan mcularda bile çok iyi performansla çalıştığını biliyoruz.
Tabii ki CH347(SPI modülü ile) veya benzeri çipler ile SPI yapmak mümkün. “Ancak herhangi bir USB – TTL dönüştürücü ile bu olacak mı?” deneyeceğiz.
Emin olmak için Python ile basit bir kod yazıp denedim. DRT ve RTS pinleri ile kare dalga üretebiliyoruz. Sinyal çıktıları altta. Biri osiloskop, biri de lojik analizör çıktısı. Yaklaşık 2-4KHz arası değişiyor. Bu hayal kırıklığı oldu. Bu frekansın en az iki katı gerekli normalde.


|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import serial import time #ser = serial.Serial(port = "/dev/ttyACM0", baudrate = 230400, rtscts = True, dsrdtr = True) ser = serial.Serial(port = "/dev/ttyUSB0", baudrate = 230400, rtscts = True, dsrdtr = True) try: while True: #ser.rts = True ser.dtr = False #time.sleep(1) #ser.rts = False ser.dtr = True #time.sleep(1) #ser.setPort except KeyboardInterrupt: ser.close() print("\nCtrl-C ile Çıkış Yapıldı.\n") |
Bu arada; HC595 için bir pine daha ihtiyac var. Tx pini diyeceksiniz. Stop biti bu işe tarar mı acaba? Alttaki resimde stop biti görülmekte, 230400baud. Ancak HC595 için yükselen kenar gerekli. Uygulamada bir transistör ile basitçe bu sinyali tersledim.

Daha önceki projemde kullandığım iki adet HC595 çıkışına matris bağlı sekiz hane 7 segment ekran kartı ile çalışmaya başladım. Şemadaki mcuyu kullanmıyorum. Bu daha önce yaptığım bir çalışmaydı. [Display Uygulaması]

Bir kaç başarısız deneme ardından bir şeyler çıkmaya başladı. Ancak bundan sonrası daha da hayal kırıklığı oldu. Yukarıda bahsettiğim gibi hız yetersiz kalıyordu. Seri port hızını 300-230400 baud denedim, sonuç değişmedi. Sorun, DTR ve RTS pinlerinin yeterince hızlı olmamasından kaynaklanıyor. Muhtemelen bilgisayarın iç çevrimi ile alakalı. Belki bu değiştirilebilir.
Bu hız yaklaşık 4KHz. İki adet HC595 kullanacağız ve çıkışında sekiz display var.
1.000.000 / 4.000 = 250uS
2 x 8 x 8 = 128
128 x 250 = 32.000
1.000.000 / 32000 = 31.25Hz/hane
Bu hızı bir de kod içindeki hesaplamalar yavaşlatıyor. Yaklaşık 20Hz civarına kadar düşüyor.
Bu sadece basit bir test uygulaması, belki en fazla başka bir uygulamanın debug ekranı olabilir. Fazlasının olabileceğini düşünmüyorum.
CH347’nin UART1 kanalını kullandım. PL2303HX ile de denedim, yine çevrim hızı 4KHz. Belki de benim PC yavaş kalıyor. Şimdilik bu sorunlarla uğraşmıyorum.
Testleri Python ile yazdım. Ancak hız problemi nedeniyle benzer kodu C ile de test ettim, değişen bir şey olmadı. Ancak, kolay test edilmesi nedeniyle Python ile devam edeceğim.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
import serial import time from timeloop import Timeloop #https://github.com/sankalpjonn/timeloop from datetime import timedelta, datetime tl = Timeloop() dizi1 = [0b11000000, #0 0b11111001, #1 0b10100100, #2 0b10110000, #3 0b10011001, #4 0b10010010, #5 0b10000010, #6 0b11111000, #7 0b10000000, #8 0b10010000 #9 ] dizi2 = [0, 1, 2, 3, 4, 5, 6, 7] f1 = 1234 f2 = 5678 h = "tarih" s = 0 k = 0 #ser = serial.Serial(port="/dev/ttyACM0", baudrate=500000, write_timeout=0.2, # rtscts=False, dsrdtr=False) ser = serial.Serial(port="/dev/ttyUSB0", baudrate=500000, write_timeout=0.2, rtscts=False, dsrdtr=False) def shift_byte(data_byte): for i in range(7, -1, -1): ser.dtr = (data_byte >> i) & 1 ser.rts = True ser.rts = False # Delay'siz, donanım hızında ser.dtr = 0 ser.rts = 1 """c = ser.cts c = ser.dsr""" def latch(): ser.write(b'\x00') ser.flush() def write_word(data1, data2): shift_byte(data1) shift_byte(data2) latch() def hane(): pass @tl.job(interval = timedelta(milliseconds = 100)) def yaz(): global h, s, k dizi2[0] = (int)(f1 / 1000 % 10) dizi2[1] = (int)(f1 / 100 % 10) dizi2[2] = (int)(f1 / 10 % 10) dizi2[3] = (int)(f1 / 1 % 10) dizi2[4] = (int)(f2 / 1000 % 10) dizi2[5] = (int)(f2 / 100 % 10) dizi2[6] = (int)(f2 / 10 % 10) dizi2[7] = (int)(f2 / 1 % 10) if(h == "tarih"): #for k in range(8): if(k == 1): write_word(1 << s, dizi1[dizi2[k]] + 0x80) else: write_word(1 << s, dizi1[dizi2[k]]) #s <<= 1 elif(h == "saat"): #for k in range(8): if(k == 1): write_word(1 << s, dizi1[dizi2[k]] + 0x80) elif(k <= 5): write_word(1 << s, dizi1[dizi2[k]]) elif(k > 5): write_word(1 << s, 0xFF) #s <<= 1 s += 1 k += 1 if(k > 7): s = 0 k = 0 def cikis(): tl.stop() s = 1 for k in range(8): write_word(s, 0xFF) s <<= 1 print("\nKlavye kesmesiyle çıkış yapıldı.\nDisplay temizlendi.\n") ser.close() def main(): global f1, f2, h degisken1 = 0 tl.start() while True: """f1 = 1111 f2 = 7777""" """f1 += 1 if(f1 > 9999): f1 = 0 f2 -= 1 if(f2 <= 0): f2 = 9999""" dt = datetime.now() ayinGunu = (int)(dt.day) ay = (int)(dt.month) yil = (int)(dt.year) saat = (int)(dt.hour) dakika = (int)(dt.minute) saniye = (int)(dt.second) #print(f"{ayinGunu:02d}-{ay:02d}-{yil:04d} {saat:02d}:{dakika:02d}:{saniye:02d}") if((degisken1 >= 0) and (degisken1 < 1000)): h = "tarih" f1 = (ayinGunu * 100) + ay f2 = yil if((degisken1 >= 1000) and (degisken1 < 2000)): h = "saat" f1 = (saat * 100) + dakika f2 = (saniye * 100) if(degisken1 >= 2000): degisken1 = 0 degisken1 += 1 time.sleep(0.5) # 0,025 * 1000 = 25 saniyede bir değişim if __name__ == "__main__": try: main() except KeyboardInterrupt: cikis() |
Kodların biraz düzenlenmesi gerekli, bu sonraki iş.
Alttaki resimde ekranda “11117777” rakamı görülmekte iken alınan lojik analizör sinyal çıktısı görülmekte.

Bu düşük çevrim hızı nedeniyle; sekiz hane yazarken çok fazla titreme oluyor. Ancak dört hane ile kabul edilebilir bir şekilde çalışıyor.
Burada asıl en büyük sorun PC fiziksel seri portu. Bu çalışma sadece USB – TTL dönüştürücü ile yapılmaktadır. PC’nin fiziksel seri portunun gerilimlerinde epey farklılıklar bulunmaktadır.
High(1) sinyali +12V veya biraz yüksek bile olabilir. Ancak LOW(0) sinyali -12V. Bu nedenle «özellikle acemi arkadaşlarımızın» fiziksel portu kullanılmamasıdır.
Bir çok USB – TTL dönüştürücülerde genelde RX ve TX pinleri kullanıcıya verilmektedir, diğer pinler dışarıya çıkarılmamıştır.. Ama entegre pinlerinden uygun olanları bulup dışarıya almanız mümkün.
“Zaten mcu ile veya başka entegreler ile bu işlemi yapmıyor muyuz, neden bu yöntemi seçiyorsun?” diyebilirsiniz. Sadece yapılabiliyor mu diye kontrol ettim.
Belki led/display sürmede başarısız oldum. Ancak başka display entegrelerini ve karakter LCD, hatta basit grafik LCD sürmek mümkün görünüyor. (MAX7219/21, TM1637/38, 74HC595, 74HC164, CD4094/74HC4094, ve daha fazlası)
Bir HC595’in pinleri karakter display pinlerine bağlanabilir. Ya da iki tanesi grafik displaya bağlanır, ama biraz hız düşük kalabilir. Diğerleri için bence sorun olmayacaktır.
Altta eklediğim videoda bazı hanelerin yanmadığı gibi bir görüntü oluşmakta. Bu tarama hızının çok düşük olmasından kaynaklanmaktadır. Ama gözle bakında tüm hanelerde sayılar görülmekte. Fakat bir titreme oluşmakta.
Şimdilik bu kadar, umarım işinize yarayan bir uygulama olmuştur.
İyi eğlenceler…









7 segment 7segment 12F675 12F683 16F877A ADC Arduino AVR blue pill BUTON button Code Composer Studio Direnç esp esp8266 G2552 led Linux LIS3DSH LIS302DL micropython MSP430 ortanca filtre PIC port PWM PySimpleGUI Python pyttsx3 seri port seven segment SPI STM32 STM32F-Discovery STM32F4-DISCO STM32F4-Discovery STM32F407 Thonny Timer0 UART usb USB-TTL dönüştürücü Voltmetre Zener test cihazı İvme Sensörü
