Not 3: Buton Tanımlamak ve Kullanmak

Yayınlandı: 08 Eylül 2011 / Microchip PIC Programlama...
Etiketler:, , , , , , , , , ,

Biraz ara verdikten ve bu arada robot yarışmaları için biraz hazırlandıktan sonra gelelim yeni konumuza. Bu konumuzda MikroC’nin bize sunmuş olduğu “buton” kavramı üzerinde duracağız. Buton tanımlamak  bizi kod yazarken karşılaşabileceğimiz bir takım sıkıntılardan kurtarmaktadır. Özellikle buton arkı denilen olay, dışarıdan uC’ye bağlanan butonlara basma ve bırakma anlarında meydana gelen , ani voltaj değişimleridir. Butona basarken, veya elimizi çekerken geçen kısa süre içerisinde, butonun bağlı bulunduğu pin’in durumu bu voltaj değişimlerinden dolayı “1”   ve “0” olarak defalarca değişir. Bu durumda biz butona bir kez  basmış olsakda, uC ark yüzünden butona bir kaç defa basılmış gibi algılayacaktır. Bunun önüne geçmek için butona basıldığı andan itibaren bir süre beklemek gereklidir.  Tabiki bu beklemeyi biz haricen de yapabiliriz fakat MikroC “button” fonksiyonu ile bu işlemleri hızlandırmamızı sağlamaktadır.

Buton arkı ile yeteri kadar teorik bilgi verdikten sonra şimdi de uygulamamıza geçelim. Bu uygulamamızda PIC16f628A mikrodenetleyicimizin B portunu çıkış olarak kabul edelim ve bu portu kullanarak , giriş olarak kullandığımız A portunun 0. pinine bağlı buton’a basıldıkça  birer birer artan BCD sayıcı yapalım. BCD (binary coded decimal)  kavramını açacak olursak  Onluk sayıların ikili sistemde gösterilişi diyebiliriz.  Yani;

Desimal -Bbinary
0 – 0000
1 – 0001
2 – 0010
3 – 0011
4 – 0100
5 – 0101
6 – 0110
7 – 0111
8 – 1000
9 – 1001

Eğer ikilik (binary) sayı sistemini bilmiyorsanız en kısa sürede öğrenmenizi (Tabiki Hexadesimal sistemi de..) tavsiye ederim.  Çünkü bu sayı sistemleri dijital elektroniğin temelini(Dikkat ettiyseniz herşey 0 ve 1’lerden oluşuyor) oluşturmaktadırlar  .  Ama BCD kodun binary sayılardan bir farkı vardır. Çünkü dört bit olarak gruplandırılırlar.  Örnek verecek olursak;

Desimal    –       Binary
218             –       1101 1010
129             –       1000 0001

çevrimi yapılırken, BCD  saylar 4 bit gruplardan oluşan sayılar olduğu için desimal sayıların BCD çevrimleri aşağıdaki gibi yapılır;

Desimal sayının BCD'ye çevrimiŞemadan görüldüğü gibi desimal sayımız olan 2709’un her basamağı ayrı ayrı binary kodlara dönüştürülmüştür. Ortaya çıkan biary kodlar ise birleştirilerek “0010011100001001” BCD kodunu verir. BCD kodunu tekrar desimale çevirmek için elmizdeki kod 4’er olarak gruplandırılarak onluk (desimal) karşılıkları bulunur. Eğer elimizdeki sayı diyelimki 10 haneli “1010001001” BCD kodundan oluşmakta (dikkat edin lütfen “binary” değil “BCD” koddan oluşmakta dedim) o zaman bu kodun başına 4’er gruplayabilecek kadar 0 atıyoruz. Yani sayımız “001010001001” haline geldi. Şimdi 4’er gruplamaya hazır. Bu kodu desimale çevirirsek “289” halini alacaktır.

BCD olayını öğrendiğimize göre şimdi sıra geldi butonla artan bir sayıcı yapmaya. Bunun için Proteusta aşağıdaki devreyi hazırlıyoruz. Devrede gördüğünüz üzere ilk defa bir “7 segment display” ile karşılaşıyoruz. Tabiki daha önce türlü yerlerde karşılaşmıştınız (Örneğin ısı ve saat gösteren panolarda,  bir takım ev aletlerinin göstergelerinde…) ama bu blogda ilk defa karşılaşıyorsunuz. Aslında bu uygulamada kullanacağımız 7 segment display tam olarak “7 segment display”‘ benzemiyor. Çünkü bunun sadece 4 ucu var. Bu gördüğümüz aslında “7 Segment BCD Display”. Girişine verdiğimiz BCD kodu desimale dönüştürerek otomatik olarak bize gösteriyor.  7 segment displayler de ise içerisindeki 7 parçayı ayrı ayrı kontrol etmek için 8 adet uç bulunur. Buna ileriki konularımızda değineceğiz kısmetse…

Büyütmek için resmin üstüne tıklayın..

Kullanacağımız devre şeması üstteki  şekilde görülmektedir. Sizinde gördüğünüz gibi 7 segment displayde gösterebileceğimiz maksimum sayı 9’dur. Görüldüğü gibi PORTA’nın 0. pini giriş olarak kullanıldı ve pull-down çalışan bir buton ve direnç devresi bağlandı. Butona bastığımızda giriş seviyesini şaseye (0V’a)  çektiğinden buna pull-down denilmektedir.  Hemen kodlarımıza göz gezdiriyoruz…

#define dugme button(&PORTA,0,100,0)
void main()
{
char sayi=1;
CMCON=7;
TRISB=0;
TRISA.f0=1;
PORTB=0;
while(1)
{
if(dugme)
{

PORTB=sayi;
sayi++;

if(sayi==10)
{
sayi=0;
}
}
}
}

Görüldüğü üzere ilk satırımızda “#define” ile “dugme” isminde bir buton tanımladık. #define C dilinde tanıtım amaçlı kullanılan bir komuttur.  örneğin “#define  ali   PORTA” dediğimizde  artık PORTA registerını “ali” diyerek çağarabiliriz. (örnek: “ali=0b00010101; ” ) #define satırının sonunda “;” olmadığına dikkatinizi çekerim.

“Button(&PORTA,0,100,0)”  yazark yaptığımız işlem şudur aslında : “PORTA’nin 0. pini ,100ms gecikme, 0’da aktif”. Yani Button(&PORT,pin,gecikme,aktif durum) manasına gelir. Bu durumda butona basıldığında “dugme” ismindeki değişkenin değeri ” 1 ” olacaktır.  “#define  dugme   Button(&PORTA,3,200,1) ” şeklinde bir tanımlama yapmış olsaydık burada PORTA’nın 3. pinine bağlı buton “1” olduğunda arkları önlemek için  100ms gecikme sağlanacak ve dugme değişkeninin değeri 1 olacaktı.

CMCON=7; ifadesi ise PORTA’nın dijital giriş çıkış olarak ayarlanmasını sağlar.

Dikkat çeken diğer bir ifade ise “if(dugme)” ifadesidir. İfade şu şekilde de yazılabilirdi “if(dugme==1)”. fakat buna gerek yoktur çünkü ” button ” ile tanımlanan ifade gerçekleştiğinde dugmer değişkeni zaten 1 olacaktır. Eğer buton şartı oluşmuyor ise “dugme” değişkeni 0 olacaktır.

MikroC ve Isis simülasyon dosyalarını buradan indirebilirsiniz…

Yazımızın sonuna geldik. Görüşmek üzere…

yorum
  1. mustafa ay. dedi ki:

    Pic programlama konusunda yeni başlayan birisiyim. Bu uygulamanızda 8 segment display yerine RB1 ucuna led bağladım ve butona basıldığında led yanacak şekilde kodu değiştirdim (buton RA1 de). ISIS te güzel çalışıyordu, fakat breadboard’a kurduğumda çalıştıramadım. 16F628A nın datasheet ini biraz karıştırdığımda (bkz. DS40044F-page 62) PORTA nın digital I/0 olarak kullanılması için CMCON register nin son 3 bitinin ;(CM) 111 şeklinde konfigirasyan yapılması gerektiğini farkettim. “CMCON=0x07;” satırını programa eklediğimde sorun çözüldü. umarım aynı sorunla karşılaşanlara yardımı dokunur.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s