27 Haziran 2015 Cumartesi

SDCC ile RB4~RB7 Kesme(Interrupt) Uygulaması (16F877A) –Ders09




// Copyright (C) 2015 Durali Kiraz
// PIC16F877A için hazırlandı.

#include <pic14regs.h>

typedef unsigned short int uint16_t;

//sigorta tanımlarımızı yapıyoruz.
__code uint16_t __at _CONFIG __configword =
     _PWRTE_OFF &&
     _CP_OFF &&
     _FOSC_XT &&
     _WDT_OFF &&
     _BOREN_OFF &&
     _LVP_OFF ;


void main(void) // Ana fonksiyon alanı
{
    TRISB = 0xF0; // RB4..RB7 giriş, diğerleri çıkış
    PORTB = 0x00; // PORTB sıfırlanıyor
    TRISD = 0x00; // PORTD tamamı çıkış
    PORTD = 0x00; // PORTD sıfırlanıyor

    RBIF = 0; // RB4..RB7 kesme bayrağı temizleniyor.
    RBIE = 1; // RB4..RB7 kesme izni veriliyor.
    GIE = 1; // Genel kesme izni veriliyor

    for(;;); // İşlemci sonsuz döngüde bekletiliyor
}


static void Kesme(void) __interrupt 0 //Kesme fonksiyonu
{
    if(RBIF) //RB4..RB7 kesme oluşmuşmu?
    {
       if(RB4) //ilk butona basıldımı?
           PORTD = 0x01; //ilk ledi yak
       else
       if (RB5) //ikinci butona basıldımı?
           PORTD = 0x02; //ikinci ledi yak
       else
       if (RB6) //üçüncü butona basıldımı?
          PORTD = 0x04; //üçüncü ledi yak
       else
       if (RB7) //dördüncü butona basıldımı?
          PORTD = 0x08; //dördüncü ledi yak

       PORTB = PORTB;//son değişikliklerin algılanması için PORTB yi bir daha oku
       RBIF = 0; //Tekrar kesme alınabilmesi için kesme bayrağı temizleniyor.
   }
}


Bu dersimizde pic mikrodenetleyicilerin B4 ile B7 arası bacaklarındaki kesme nasıl yapılır onu göreceğiz. Billindiği üzere 16F877A mikrodenetleyicisinin kesmelerinden biridir b4~b7 kesmesi. Eğer bu kesme aktif edilirse B4 ile B7 arasındaki portlardan gelecek olan lojik sinyal değişimi algılandığı anda mikrodenetleyici elindeki işi bırakıp bu kesmenin gerçeklendiği fonksiyonu işletecektir. İşte biz bu kesmeyi SDCC derleyicisi ile kodda da gördüğünüz üzere gayet basit bir şekilde gerçekleştirdik.

Kodumuza göz atacak olursak; Öncelikle PORTB ye ait RB4 ~ RB7 portlarını giriş olarak TRISB=0xF0 ifadesi ile sağladık. Daha sonra PORTD yi de PORTD=0x00 ifadesi ile tamamen ledlerimiz için çıkış olarak ayarladık. RBIF=0 ile RB4~RB7 ile ilgili kesme bayrağını temizledik. RBIE=1 ile RB4~RB7 kesmesine izin veriyoruz. Sonrasında programı sonsuz döngüye sokarız. Program sonsuz döngüde esasında bir iş yapmaz. Daha doğrusu iş yapacak kodları biz kesme fonksiyonun içine gömdüğümüz için bütün işimiz bu fonksiyonun içinde olacaktır.

Kesme isimli fonksiyonumuz özetle; RB4,RB5,RB6 ve RB7 portlarının lojik durumunu kontrol ediyor. Eğer bu portlarda butona basılma durumu yani lojik 1 oluştuysa ilgili PORTD ye bağlanmış ledleri yakacak şekilde bir kod göndeririz. Örneğin ikinci butona basıldıysa PORTD ye bağlı ikinci ledi yakacak olan 0x02 kodunu gönderir. Bu ikilik sistemde 00000010 değerine karşılık geldiği için 1 e denk gelen led yanacak, diğerleri sönecektir. Diğer bir kod ise karşılaştırmaların sonuda bulunan PORTB=PORTB ataması. Bu işlem esnasında başka bir değişiklik olduysa şayet bunu PORTB yi kendisine atayarak hatalı durumun önüne geçiyoruz. Bu portun kendine atamayla ilgili sıkıntıları gidermek için PIC18FXXX serisinde ayrıca birde LAT port yazmacı geliştirilmiştir. Buda yine ileriki derslerde yeri gelince açıklamacaktır. Bu kodda dikkat edilecek olursa RBIF ile kesmenin aktif olup olmadığını kontrol ediyoruz. Bu RBIF kesme bayrağı RB4~RB7 kesmesinin durumunu bildiren bayraktır. Önceki dersimizde INT/RB0 kesmesinin aktif olup olmadığını INTF dış kesme bayrağını kontrol ederek öğreniyorduk. Demekki her kesmenin kendine özgü bir kontrol bayrağı var. Kodlama yaparken bunlara dikkat edersek hiçbir sıkıntı yaşamayız. Başka bir derste görüşmek üzeere hoşçakalın.


duralikiraz.blogspot.com
27 Haziran 2015

Muvaffakiyet Allahtandır”

Hiç yorum yok:

Yorum Gönder