Havaya Yazı Yazmak, PIC mi kaldı diyenler olabilir. Evet picler hala birçok yerde kullanılıyor. Bende arşivimi karıştırırken lise yıllarında PIC16F628 ile yaptığım havaya yazı yazma projesini sizinle paylaşmak istedim. Dijital dünyada saklı kalacağına her zaman dediğim gibi bazı kısımları bazıların işine yarayabilirse ne mutlu bana. Belki ilerleyen zamanlarda arduino ile yeniden daha gelişmiş bir model yapabilirim.
Pic 16F628 ile yapılmış devre şeması 3 buton 7 LED’ den oluşmaktadır.
Mekanik olarak bu 7 LED’ i ister yatayda ister dikeyde sıralı olarak dizin ve bir motora bağlı olan platforma sabitleyin.
Havaya Yazı Yazmak Devre şeması
Burada önemli olan pic16f628′ i programlamadan önce motorun saniyedeki tur sayısı ve sütun genişliği hesaplanıp belirlenmelidir.
İnsan beyni saniyede 15 kareye kadar olan resimleri algılayabildiği için bu sistemde motor saniyede 20 tur atacaktır.
1 saniye = 20 tur atması isteniyorsa
1 tur T = 1/f = 1/20 = 0,05 saniye = 50 milisaniye
Sistemin sütun sayısını hesaplamak için
Dairenin çevresi = 50cm ise
Örneğin; sütun genişliği = 0,5cm
50/0,5 = 100 sütun
Sistemin satır sayısını hesaplamaya gerek yoktur, çünkü sistemde 7 LED kullanıldığı için satır sayısı da 7 dir.
Yukarıdaki grafik oldukça kolaylık sağlayacaktır.
Bir sütun için gecikme süresi (LED in 0,5cm yanık kalma süresi) için
1 tur = 0,05 sn ise
0,05/100 = 0,0005 sn = 500 milisaniyelik bir gecikme yapılmalıdır. Yazdığımız metnin bitiş noktası da belirlenmelidir. Böylelikle boşta kalan kısım hesaplanıp gecikme yapılması çok önemlidir. Aksi taktirde görüntü oluşmaz.
Metin için kullanılan sütun sayısı;
Örneğin; 25 sütun ise
Boşta kalan kısım = 100 – 25 75 sütundur.
Bu durumda boşta kalan kısım için gecikme
Bir sütun için 500 mikro saniye ise; 75 x 0,0005 = 0,0375 = 37,5 milisaniye olmalıdır.
Metin için toplam gecikme 25 x 0,0005 = 0,0125 = 12,5 milisaniye
1 tur = metin süresi + botsa kalma süresi = 12,5 + 37,5 = 50 milisaniye
Assembly dilinde çift döngü yapmak için;
Komut cycle sayısı = 3 x N x M
Gecikme süresi = Komut cycle sayısı x 4 / f
12,5 milisaniye gecikme için
4 MHz lik osilatör kullanıldığın da GS = KSS X 4/4 den GS = KSS olur
12,5 milisaniye = 12500 mikro saniye
KSS = 3xNxM olduğuna göre 12500 = 3xNxM NxM = 4166 N=255 ise M=16
37,5 milisaniye gecikme için
37500 = 3xNxM NxM = 12500 N=255 ise M=49
Örneğin bir metin olarak ABC harflerini yazdıralım.
Programı yazmak için grafiğe ihtiyacımız olacaktır.
Grafiğin alt tarafı metne bağlı olarak binary olarak doldurulur. Metne denk gelen kutucular 1 diğerleri ise 0 olarak yazılır. Programı yazarken binary kodlara bakılarak PORTB yönlendirilir.
Metin kısmı 15 sütun dan oluştuğu için gecikme süresi
15 x 0,0005 = 7.5 milisaniye
7500 = 3xNxM NxM = 2500 N=255 ise M=10 olur.
Boşta kalan kısım 100 – 15 = 85 sütun dan oluştuğu için gecikme süresi
85 x 0,0005 = 42.5 milisaniye
42500 = 3xNxM NxM = 14166 N=255 ise M=55 olur.
Pic Programı koduna gelicek olursak sıkı durun, o zamanlar daha C dili ile tanışmadığımdan kodu assembly dilinde yazmışım. geçmiş olsun 🙂
;*********DEĞİŞKENLERİN TANIMLANMASI****************************** LIST P=16F628A ;yazan: Remzi ŞAHİNOĞLU PORTB EQU 0X06 PORTA EQU 0X05 STATUS EQU 0X03 TRISB EQU 0X86 TRISA EQU 0X85 CMCON EQU 0X1F ;*********GİRİS/CIKIS AYARLARININ OLUSTURULMASI********************* BSF STATUS,5 ;BANK1 E GEC CLRF TRISB ;PORTB CIKIS MOVLW b'01000011' ;RB0,RB1,RB7 GİRİŞ MOVWF TRISA ;PORTA GİRİS BCF STATUS,5 ;BANK0 A GEC MOVLW b'00000111' ;BÜTÜN KARSILASTIRICILAR KAPALI MOVWF CMCON ;TÜM PİNLER GİRİS/CIKIS CLRF PORTB ;BASLANGICTA TÜM LED LER SÖNÜK ;***************ANA PROGRAMIN OLUSTURULMASI********************** ;************* "A" HARFİ İÇİN *************************************** BASLA MOVLW b'01111111' MOVWF PORTB CALL BEKLE1 MOVLW b'00001001' MOVWF PORTB CALL BEKLE1 MOVLW b'00001001' MOVWF PORTB CALL BEKLE1 MOVLW b'01111111' MOVWF PORTB CALL BEKLE1 CLRF PORTB CALL BEKLE1 ;************* "B" HARFİ İÇİN************************************* MOVLW b'01111111' MOVWF PORTB CALL BEKLE1 MOVLW b'01001001' MOVWF PORTB CALL BEKLE1 MOVLW b'01001001' MOVWF PORTB CALL BEKLE1 MOVLW b'00110110' MOVWF PORTB CALL BEKLE1 CLRF PORTB CALL BEKLE1 ;************ "C" HARFİ İÇİN************************************** MOVLW b'00111110' MOVWF PORTB CALL BEKLE1 MOVLW b'01000001' MOVWF PORTB CALL BEKLE1 MOVLW b'01000001' MOVWF PORTB CALL BEKLE1 MOVLW b'00100010' MOVWF PORTB CALL BEKLE1 CLRF PORTB CALL BEKLE1 CLRF PORTB CALL BEKLE2 GOTO BASLA ;***************1 MİLİSANİYE GECİKME YAP************************** ;***********LEDİN BİR PARCA YANIK KALMA SÜRESİ******************** BEKLE1 MOVLW d'255' ;YAKLASIK 1 MİLİSANİYE MOVWF 0X21 ;BEKLEME YAP D1 MOVLW d'10' MOVWF 0X20 D2 DECFSZ 0X20,1 GOTO D2 DECFSZ 0X21,1 GOTO D1 RETURN ;*****************95 MİLİSANİYE GECİKME YAP*********************** ;************PROGRAM BOSLUGUNDA Kİ LEDİN SÖNÜK KALMA SÜRESİ******* BEKLE2 MOVLW d'255' ;YAKLASIK 74 MİLİSANİYE MOVWF 0X22 ;BEKLEME YAP D3 MOVLW d'55' MOVWF 0X23 D4 DECFSZ 0X23,1 GOTO D4 DECFSZ 0X22,1 GOTO D3 RETURN END
İlerleyen zamanlarda daha gelişmiş bir Havaya Yazı Yazmak Arduino uygulaması yaparız. İyi kodlamalar.
0 yorum