Yazar: Erdinç Keloğlu
LCD Uygulamaları
LCD mikrodenetleyicide yapılan işlemler ve elde edilen sonuçların kullanıcıya ulaşmasını sağlayan bir araçtır.Değişik firmalar tarafından üretilen LCD modülleri, küçük hesap makinaları veya mikrodenetleyicili sistemlerde çok az bir çaba ile etkili bilgi sunuşunu sağlarlar. LCD’ler yaygın olarak 1 ile 4 satır arasında değişmekte ve her satırda 16’dan 40’a kadar karakter olabilmektedir.Bir LCD’deki her bir nokta gösterge karakteri 5*7 veya 5*10 noktalı olabilmektedir. LCD’ler baskılı devreye karakter üreticisi ve sistem kontrolörü ile birlikte monte edilmiştir. LCD’lerin çeşitli olmasına karşın kontrolörle iletişim protokolü standarttır.LCD arabirimi TTL uyumludur. LCD 4 veya 8 bit bir veri yoluna bağlanabilir. 4 bit veri yolu mimarisinin gerçekleştirilmesi, mikrodenetleyiciye başka amaçlarda kulanılan 4 bit kazandırır buna karşın gösterge ile haberleşme süresi iki katına çıkar ki bu gecikme çok önemli değildir.LCD için 3 kontrol hattı gerekir. LCD lojik devreleri için 5V ve LCD sürücüsü için ise ayrı bir beslemeye ihtiyaç vardır.
Bu şekilde D4,D5,D6,D7 ile gösterilen pinler lcd’nin 4 bitten oluşan veri yollarıdır.
E ucunun düşen kenarında veri yolundaki komut ya da veri lcd’ye aktarılır.Gönderilecek komut ya da veri veya okunacak veri bu uca düşen kenarlı bir işaret uygulanarak lcd’ye bildirilir.
RW ucu lcd’ye yazma ya da lcd’den okuma işlemlerinden hangisinin yapılacağını lcd’ye bildirmek için kullanılır.RW=1 ise lcd’den okuma, RW=0 ise lcd’ye yazma işlemi yapılır.
Rs ucu lcd’ye gönderilen veri yolundaki bilginin komut ya da veri olduğunu lcd’ye bildirmek için kullanılır.Lcd’ye gönderilen bilgi RS=1 ise veri, RS=0 ise komut olarak algılanır.
LCD ile Kayan yazı Uygulaması
Bu program “yazi” adli diziye atanmış kelimeleri belirli zaman aralığıyla soldan sağa kaydırır.
#include <18f452.h> #include#fuses XT,NOWDT,NOPROTECT,NOLVP #use delay(clock=4000000) #define use_portb_lcd TRUE // lcd yi B portu üzerinden kullanıyoruz #include // gerekli lcd rutinlerini içeren program void main() { char yazi[]=”Kocaeli Universitesi Elektrik Muhendisliği 040205033″; //kaydırılacak metin int a; ////////////////////// int git=1; ////gerekli değişkenler//// lcd_init(); ////////////////////// delay_ms(6); for (;;) ///kaydırma fonksiyonu// { git=1; delay_ms(200); for (a=0;a LCD ile Ekranda Belirli Aralıklarla Farklı Yazılar Yazdırmak
#include <18f452.h> #fuses XT,NOWDT,NOPROTECT,NOLVP #use delay(clock=4000000) #define use_portb_lcd TRUE #includevoid main() { lcd_init(); delay_ms(1); while(true) { printf(LCD_PUTC, “\f”); lcd_gotoxy(1,1); printf(lcd_putc,”1992″); lcd_gotoxy(1,2); printf(lcd_putc,”KOU”); delay_ms(1500); printf(LCD_PUTC, “\f”); lcd_gotoxy(1,1); printf(lcd_putc,”Erdinc Keloglu”); lcd_gotoxy(1,2); printf(lcd_putc,”040205033″); delay_ms(1500); printf(LCD_PUTC, “\f”); printf(lcd_putc,”Kocaeli”); lcd_gotoxy(1,2); printf(lcd_putc,”Universitesi”); delay_ms(1500); }} PWM’den Okunan Değerin LCD’ye Yazılması
#include <18f452.h> #device ADC=8 #fuses XT,NOWDT,NOPROTECT,NOLVP #use delay(clock=4000000) #define use_portb_lcd TRUE #includevoid pwm(void); void main() { lcd_init(); while(true){ output_low(pin_c2); // pwm i açıp kapattıktan sonra çıkış değerinin +5 de kalması pwm(); }} ////////////////// PWM FONKSİYONU //////////////// void pwm (void) { int deger; float lcdx,sonuc; setup_ccp1(ccp_pwm); setup_timer_2(t2_div_by_4, 255,1); setup_adc_ports(RA0_ANALOG); setup_adc(adc_clock_internal); set_adc_channel(0); while(true){ deger=read_adc(); set_pwm1_duty(deger); lcdx=deger; sonuc=lcdx/51; printf(lcd_putc,”\f”); printf(lcd_putc,”PWM Cikis Degeri”); lcd_gotoxy(1,2); printf(lcd_putc,”Cikis : %3.2f “,sonuc); delay_ms(100); }} Seri Haberleşme Ve Bootloader Uygulamaları
Bu uygulamada ise bilgisayar ve pic arasında haberleşme gerçekleştirildi. Bunu gerçekleyebilemk için 4 adet led ve bir tane 7 segment displayden oluşan bir devre tasarladım. Bilgisayar arayüzünü ile Visual Basic ile programladım. Bu uygulamadaki amaç bilgisayardan veri alıp pic üzerinde işlemek ve pic’den veri gönderip bilgisayarda bu veriyi okumaktı.
Haberleşmeyi yaparken pic ile seri port arasında rs-232 tampon entegresini kullandım.Bu entegre ile bilgisayardan 13V luk alınan gerilim devresi pic ile uyum sağlayabilmesi açısında 5V TTL seviyesine çekilebilmekte.
Bu uygulumada aynı devre ile birlikte bootloader da kullandım.Bootloader’ı açıklarsak;
Bootloader “In-Curcuit-Programming” tekniğini uygulayabilmek için geliştirilmiş bir mikrodenetleyici yazılımıdır.Bootloader sayesinde seri iletişim noktası ile bilgisayara bağlanmış bir denetleyici ayrıca bir programlama kartına (örn; picallw gibi..) ihtiyaç duymadan programlanabilir.Bu sayede üzerinde birçok kez değişikliğe gidilmesi gereken bir denetleyici defalarca kullanıldığı devreden çıkartılıp tekrar programala kartına takılması zorluğu ortadan kaldırılmış olur.Uygulama geliştirmede, özellikle programlamaya yeni başlamış kullancılar için büyük kolaylıklar sağlar.
Ben projemde www.microchipc.com sitesinin 16F877 için ücretsiz olarak kullanıcılara sunduğu bootloader’ını kullandım.Şekilde seri iletişim ve bootlader için kurulması gereken devre görülmekte.Bu devre sayesinde bilgisayardan seri port ile denetleyici programlanabilir.Ayrıca devrede ledler ve display sayesinde seri iletişim uygulamaları gerçeklenebilir.Bootloader’ı kullanabilmemiz için minumum aşağıdaki şekilde devreye sahip olmamız gerekli. Devremizi kurduktan sonra aşağıdaki linkini ziyaret edip bootloader için gerekli dosyaları bilgisarımıza indiriyoruz.
http://www.microchipc.com/PIC16bootload/index.php
Burada bizim için önemli olan dosya linki şudur:
http://www.microchipc.com/PIC16bootload/PIC16F87xA_bootloader_v9-50.zip
Bu dosyayı bilgisayarımıza açtıktan sonra dosya içinden uygun işlemci, seri port hızı ve uygun osilatör için kendi hex dosyamızı buluyoruz. Örneğin ben 16F877, 9600 bps iletişim hızı ve 4Mhz osilatör için “60419 - bootldr-v26-16F876-77-04Mhz-9600bps.hex” dosyasını kullandım. Hex dosyasını bir kereye mahsus olmak üzere pic programlayıcı ile denetleyiciye yükledim. CCS de seri iletişim için yazdığım programa sadece#org 0×1F00, 0×1FFF void loader16F876(void) {}
Satırını ekledim.Ardından microchipc sitesinden indirilen dosyalar içerisinden “PICbootPlus.exe” programını kullandım.Bu program ile denetleyiciye yüklenecek program seçilir.”Write” butonuna basıldığından programda “Searching for bootloader” ibaresi belirecektir.Bundan sonra devremizdeki reset butonuna basılmalıdır.Reset tuşuna basıldıktan sonra denetleyiciye program birkaç saniye içinde yüklenir.Bu şekilde bir programlayıcı karta ihtiyaç duymadan kendi uygulama devremiz üzerinden programlama yapılabilir.
Uygulama programının CCS kodları;
#include<16f877.h> #use delay(clock=4000000) #fuses xt, NOWDT, PUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) #org 0×1F00, 0×1FFF void loader16F876(void) {} #use fast_io(c) #define led1 pin_a0 #define led2 pin_a1 #define led3 pin_a2 #define led4 pin_a3 int i,j; int veri; void yukari_say(); void asagi_say(); void yurut(); void saydir(); char const segment[10] = {0b01111110, // 0 0b00001100, // 1 0b10110110, // 2 0b10011110, // 3 0b11001100, // 4 0b11011010, // 5 0b11111010, // 6 0b00001110, // 7 0b11111110, // 8 0b11011110}; char const ledler[4] = { led1,led2,led3,led4}; ////////////kesme ile veri al ///////////////////////// #int_RDA serin() {veri=getc(); if(veri==’a'){ printf(”Yürüyen Işık”); yurut();} else if(veri==’b'){ printf(”Aşağı Sayıyor”); asagi_say();} else if(veri==’c'){ printf(”Yukarı Sayıyor”); yukari_Say();} else if(veri==’d'){ printf(”A Portu Yandı”); output_a(0xff);} else if(veri==’e'){ printf(”A Portu Söndü”); output_a(0×00);} else if(veri==’f'){ printf(”Reset Atıldı”); delay_ms(1000); reset_cpu();}// Bu komu pek tavsiye edilmez (admin) else if(veri==’g'){ saydir();}} //////////////////////////////////////////////////// void main() { set_tris_c(0b10000000); enable_interrupts(int_rda); enable_interrupts(global); Printf(”Cihaz Çalıştı”); output_a(0×00); while(true){ }} //////////////////////////////fonksiyonlar//////////////////////////// //// yukari_say(); //////////////// void yukari_say(void){ for(i=0;i<10;i++) { output_b(segment[i]); delay_ms(500);} output_b(0x00);} ////////// asagi_Say(); ////////////// void asagi_say(void){ for(i=10;i>0;i–) output_b(segment[i-1]); delay_ms(500);} output_b(0×00);} ///////////////ledler///////////// void yurut(void){ j=1; for(i=0;i<5;i++){ output_a(j); delay_ms(200); j=j*2;} j=8; for(i=0;i<5;i++){ output_a(j); delay_ms(200); j=j/2;}} ////////////////////////////////////// void saydir(void){ for (i=0;i<16;i++){ output_a(i); printf("%D",i); delay_ms(400);}}Seri Haberleşme Bilgisayar Arayüzü
Şekilde seri iletişimin bilgisayar tarafından gerçeklenmesini sağlayan Visual Basic’de yazılmış program arayüzü bulunuyor
Bilgisayar arayüzünün Visual Basic’de yazılmış program kodları;
Private Sub Command1_Click()
If seri.PortOpen = False Then
sonuc = MsgBox(”PORT AÇIK DEĞİL”, vbOKOnly + vbInformation, “Bir Hata Oluştu”)
Else
seri.Output = “a”
End If
End Sub
Private Sub Command10_Click()
Combo1.Enabled = True
Command9.Enabled = True
Command10.Enabled = False
seri.PortOpen = False
Shape1.BackColor = &HC0&
Form1.Caption = “Seri Port Kontrol –> Portlar Kapalı”
End Sub
Private Sub Command2_Click()
If seri.PortOpen = False Then
sonuc = MsgBox(”PORT AÇIK DEĞİL”, vbOKOnly + vbInformation, “Bir Hata Oluştu”)
Else
seri.Output = “b”
End If
End Sub
Private Sub Command3_Click()
If seri.PortOpen = False Then
sonuc = MsgBox(”PORT AÇIK DEĞİL”, vbOKOnly + vbInformation, “Bir Hata Oluştu”)
Else
seri.Output = “c”
End If
End Sub
Private Sub Command4_Click()
If seri.PortOpen = False Then
sonuc = MsgBox(”PORT AÇIK DEĞİL”, vbOKOnly + vbInformation, “Bir Hata Oluştu”)
Else
seri.Output = “d”
End If
End Sub
Private Sub Command5_Click()
If seri.PortOpen = False Then
sonuc = MsgBox(”PORT AÇIK DEĞİL”, vbOKOnly + vbInformation, “Bir Hata Oluştu”)
Else
seri.Output = “e”
End If
End Sub
Private Sub Command6_Click()
If seri.PortOpen = True Then
cikis = MsgBox(”Şu an bilgisayarınızda açık port bulunmakta. Portları kapatıp çıkmak ister misiniz?”, vbYesNo + vbInformation, “Seri Port Kontrol”)
If cikis = vbYes Then
seri.PortOpen = False
Unload Me
End If
If cikis = vbNo Then
Form1.Show
End If
Else
Unload Me
End If
End Sub
Private Sub Command7_Click()
If seri.PortOpen = False Then
sonuc = MsgBox(”PORT AÇIK DEĞİL”, vbOKOnly + vbInformation, “Bir Hata Oluştu”)
Else
seri.Output = “f”
End If
End Sub
Private Sub Command8_Click()
If seri.PortOpen = False Then
sonuc = MsgBox(”PORT AÇIK DEĞİL”, vbOKOnly + vbInformation, “Bir Hata Oluştu”)
Else
seri.RThreshold = 1
seri.Output = “g”
End If
End Sub
Private Sub Command9_Click()
If Combo1.ListIndex = 0 Then
seri.CommPort = 1
seri.PortOpen = True
Command9.Enabled = False
Command10.Enabled = True
Combo1.Enabled = False
Form1.Caption = “Seri Port Kontrol –> COM1 Açıldı”
Shape1.BackColor = &HC000&
End If
If Combo1.ListIndex = 1 Then
seri.CommPort = 2
seri.PortOpen = True
Command9.Enabled = False
Command10.Enabled = True
Combo1.Enabled = False
Form1.Caption = “Seri Port Kontrol –> COM2 Açıldı”
Shape1.BackColor = &HC000&
End If
End Sub
Private Sub Form_Load()
Shape1.BackColor = &HC0&
Form1.Caption = “Seri Port Kontrol –> Portlar Kapalı”
Combo1.AddItem “COM1″
Combo1.AddItem “COM2″
Combo1.ListIndex = 0
Command1.Font.Bold = True
Command1.Font.Name = arial
Command2.Font.Bold = True
Command2.Font.Name = arial
Command3.Font.Bold = True
Command3.Font.Name = arial
Command4.Font.Bold = True
Command4.Font.Name = arial
Command5.Font.Bold = True
Command5.Font.Name = arial
Command6.Font.Bold = True
Command6.Font.Name = arial
Command7.Font.Bold = True
Command7.Font.Name = arial
Command8.Font.Bold = True
Command8.Font.Name = arial
seri.Settings = “9600,N,8,1″
seri.Handshaking = comNone
seri.RThreshold = 1
Command10.Enabled = FalseEnd Sub
Private Sub Form_Unload(Cancel As Integer)
If seri.PortOpen = True Then
cikis = MsgBox(”Şu an bilgisayarınızda açık port bulunmakta. Portları kapatıp çıkmak ister misiniz?”, vbYesNo + vbInformation, “Seri Port Kontrol”)
If cikis = 6 Then
seri.PortOpen = False
Unload Me
ElseIf cikis = 7 Then
Cancel = 1
End If
End If
End Sub
Private Sub seri_OnComm()
Dim alinan As String
If (seri.CommEvent = comEvReceive) Then
alinan = seri.Input
Label1.Caption = ” ”
Label1.Caption = alinan
End If
End Sub
Kayan Yazı Panosu
Bu uygulamada ise çevremizde de sıklıkla karşılaştığımız pano uygulaması yapıldı.Genelde bilgilendirme amaçlı kullanılan led panolar ile düşük maliyetli, sürekli güncellenebilen reklam, duyuru vs.. gibi işlemler gerçekleştirilebilir.
Ben projemde 8 satır 24 sütünlu bir pano uygulaması gerçekleştirdim.Bu sistemde ortak katod led matris kullanarak, matrisin satırlarını picin B portundan, sütünlarını ise 74154 demux entegresi ile işleme soktum.
İnsan gözü saniyede 40’dan fazla yanıp sönen bir lambayı sürekli yanıyormuş gibi gördüğü için devremde saniye 120 tarama yapılıyorum.Bu göz yanılması ile yazı sürekli kayıyormuş gibi gözükmekte.Uygulama ile ilgili kod aşağıdadır;
#include <18f452.h> #use delay(clock=4000000) #fuses xt, nowdt, put, noprotect, nobrownout, nolvp void main() { int b,i,a,x,kayma,b_max; //döngüler için gerekli değişkenler int yazi_sutun;//yazının sütün sayısı int matris_sutun; //matris sutun char metin[]={ 0×00,0×00,0×00,0×00,0×00,0×00, 0×00,0×00,0×00,0×00,0×00,0×00, 0×00,0×00,0×00,0×00,0×00,0×00, 0×00,0×00,0×00,0×00,//boşluk 0xFF,0×89,0×89,0×89,0×81,0×00, // e 0xff,0×19,0×29,0×49,0×8f,0×00 // r 0xff,0×81,0×81,0×81,0×7e,0×00 // d 0×84,0xFD,0×84,0×00, // i 0xFF,0×04,0×08,0×10,0xFF,0×00, // n 0×3f,0xa1,0xa1,0×21,0×00, // ç 0×00,0×00,0×00,0×00, // boşluk 0xFF,0×18,0×24,0×42,0×81,0×00, // k 0xFF,0×89,0×89,0×89,0×81,0×00, // e 0xFF,0×80,0×80,0×80,0×80,0×00, // l 0×7e,0×81,0×81,0×81,0×7e,0×00 // o 0xfc,0×85,0xa5,0xe4,0×00, // ğ 0xFF,0×80,0×80,0×80,0×80,0×00, // l 0xff,0×80,0×80,0×80,0xff,0×00 //u }; char kayan[24]; set_tris_b(0×00); set_tris_c(0×00); yazi_sutun=100;//yazinin toplam sutun sayısı belirleniyor matris_sutun=24;//kullanılan matrisin sutun sayısı while(true){ for(kayma=0;kaymaBenzer Yazılar






