05- Buton Uygulaması
Merhaba sevgili okuyucu.
İlk uygulamamızda yanım sönen bir LED devresi tasarlamıştık. Bu uygulamamızda o LED i bir buton ile kontrol edeceğiz.
Bu yazıda bahsedilenler ile bilmediğiniz kısımlar çıkarsa bir önceki bölüm başta olmak üzere önceki bölümlerde bahsi yapılmıştır. Onlara bakıp konuyu kavrayabilirsiniz.
Mantık olarak bir giriş bir çıkış pinimiz olacak. Giriş pinimize butondan gelen 1 veya 0 bilgisi gelecek. Biz bu pinin durumunu okuyup çıkış pinine bağladığımız LED i yakacağız veya söndüreceğiz.
Yazılım
Sırasıyla
- Proje dosyasını oluşturun
- Osilatör ayarını yapın
- Configuration bitlerini ayarlayın
Bir önceki bölümde buna değindiğimiz için burada tekrar göstermiyorum. Önceki bölüme buradan ulaşabilirsiniz.
Elimizde ham olarak şöyle bir kod olacak.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#define _XTAL_FREQ 20000000 #include <xc.h> #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) void main(void) { return; } |
Öncelikle pinlerimizin giriş mi çıkış mı olacağını belirliyoruz.
1 |
TRISBbits.TRISB0 = 0; |
B0 pinimiz çıkış yapıyoruz. Bu pine LED imizi bağlacağız.
1 |
TRISB7 = 1; |
B7 pinimizi giriş yapıyoruz. Bu pinden buton değerini okuyacağız.
Bu iki kullanım şekli de mümkündür. İsterseniz “TRISBbits.” yazarak açılan menüden pininizi seçersiniz isterseniz direkt olarak “TRISB7” yazarak giriş çıkış durumunu ayarlayabilirsiniz.
“TRISBbits.” ile kullanmanızı tavsiye ederim. Bu sayede yanlış yazma olasılığınız düşecek ve kodlarınız daha düzenli görünecek.
1 |
PORTBbits.RB0 = 0; |
En son olarak çıkış olarak belirlediğimiz pini 0 yapıyoruz.
Gerekli giriş çıkış ayarlarını verdikten sonra while sonsuz döngüye girebiliriz.
1 |
if (RB7 == 1) |
komutu ile RB7 değerinin 1 olup olmadığını kontrol ediyoruz.
1 2 3 4 5 |
__delay_ms(1); if (RB7 == 1) RB0 = 1; else RB0 = 0; |
Eğer okuduğumuz değer 1 ise şu kodları yazıyoruz. Burada fark ettiyseniz bir daha RB7 pininin kontrolünü yaptık. Bunun nedeni herhangi bir elektriksel arkdan doğabilecek dalgalanmalar. Durumu 0 ama dalgalanmadan dolayı anlık olarak 1 değerini vermiş olabilir. Bu oldukça mümkün. Bu yüzden 1 milisaniye bekleyip yeniden kontrolü yapıyoruz. Eğer hala 1 ise gerçekten de butona basılmış demektir. 1 ise RB0 pinini 1 yaparak LED i yakıyoruz. Değil ise 0 yaparak yanık durumda ise söndürüyoruz.
1 2 |
else RB0 = 0; |
Eğer ilk yaptığımız kontrolde pin değeri 1 değilse bu sefer yine çıkışımızı 0 yapıyoruz. İlk sorguda “RB7 == 1” i denetlediğimiz için bunun olmadığı tek koşul vardır. Bu yüzden “if (RB7 == 0)” diyerek sorgulamak yerine “else” yani “değilse” diyerek de bunu gerçekleştirebiliriz. “Eğer 0 ise çıkışı 0 yapmamıza gerek var mı?” diye bir soru aklınıza gelebilir. Evet yapmamız gerekiyor. Çünkü butondan elimizi çekince LED in de sönmesini istiyoruz. Bunun için butonun 1 değeri vermediği değer için 0 yazarak söndürmemiz lazım.
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 |
#define _XTAL_FREQ 20000000 #include <xc.h> #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) void main(void) { TRISBbits.TRISB0 = 0; TRISB7 = 1; PORTBbits.RB0 = 0; while(1) { if (RB7 == 1) { __delay_ms(1); if (RB7 == 1) RB0 = 1; else RB0 = 0; } else RB0 = 0; } return; } |
Tüm kodu bu şekilde görebileceğiniz gibi en aşağıda verdiğim dosyada da bulabilirsiniz.
Donanım
Sıra geldi devremizi kurmaya. Yazılımda kurduklarımıza bakarsak şunları elde ederiz
- Osilatör değeri – 20 MHZ
- LED i bağlayacağımız çıkış pini – RB0
- Butonu okuyacağımız giriş pini – RB7
Önceki yazılarda minimum devremizin nasıl kurulacağını görmüştük. Oradakileri aynen uygulayın ve yazlımda girdiğiniz saat hızına uygun osilatörü devreye kurun. LED i zaten 220 ohm luk bir direnç ile devreye dahil ettiğimizi söylemiştik. Sıra butonu nasıl ekleyeceğimize geldi.
Butona basılmıyorken iki ucu arası iletkenlik göstermez. Mantık olarak bir ucunu 5V a bir ucunu PIC e bağlıyoruz. Fakat bunu yaparsak iki sorun bizi bekliyor.
- Eğer butona basarsak aşırı akımdan dolayı PIC i yakmış oluruz.
- Butona basılmadığında giriş pini hiçbir elektriksel tarafa bağlı olmadığı için dalgalanmalara yol açacaktır. Bu da istemsiz olarak LED in yanıp sönmesine neden olacaktır.
Çözüm
- 5V ile buton arasına 220 ohm luk bir direnç koyarak bu sorunu halledebiliriz.
- Giriş pinini eksi (-) kutba direkt veya bir dirençle bağlı tutarak basılmadığında 0 durumunu okumasını sağlayabiliriz. Fakat buradaki önemli nokta dirençlerin voltaj bölücü olarak işlememesi. Voltaj bölücüleri sonraki bölümlerde göreceğiz. Örneğin 220 ohm koyarsak, bu durum düğmeye basıldığında PIC e giden sinyal voltajının 5V değil de 2.5V olması anlamına gelir ki bu PIC in dijital okuma değeri aralıklarında olmayacağından sinyal değerinde dalgalanmalara yol açar. Bu yüzden giriş pinini toprağa bağlayacağımız direnci ilk maddedeki dirence göre çok yüksek seçmek. 10Kohm (10000 ohm) değeri yeterli olacaktır.
Devreye bakarsak da görebiliyoruz. Butona basılmadığı sürece pin toprağa bağlı. Basıldığında ise toprağa güçsüz 5V a güçlü bir şekilde bağlı. Böylece bu proje denenmeye hazır duruma geliyor. Programınızı derleyip PIC inize atmanız ve bu devreyi kurup gücü vermeniz yeterli.
SONUÇ
Proje ile ilgili MPLAB, Fritzing ve Proteus dökümanlarına aşağıdaki linkten ulaşabilirsiniz.
#define _XTAL_FREQ 20000000
BU NE İŞE YARIYOR HİÇ BAHSEDİLMEMİŞ
Bir önceki bölümde tanımlandı o ama orada da direkt olarak bahsedilmemiş evet. 20000000 hz (20 Mhz) frekansında osilatör kullandığımızı belirtiyoruz orada.