24 Haziran 2015 Çarşamba

SDCC ile Harici INT/B0 Kesme(Interrupt) Uygulaması (16F877A) –Ders08


Pic microdenetleyicilerinin diğer bir yüzü sayılabilecek tarafıda kesmelerdir. Misal 16F877A da 14 adet kesme özelliği vardır. Kısaca kesmelerin (interruptların) faydasından bahsedecek olursak; mikrodenetleyicimizin birden fazla işi aynı anda kontrol edebilmesine olanak sağlar. Yani mikrodenetleyici programımız main fonksiyonu içinde normal işlerini yaparken bizde bir kesme kontrolü ile misal B4 ile B7 portlarına bağlı butonlara basılıp basılmadığının kontrolünü yapabiliriz. Ya da Timer0 sayacımız taşma yapmışmı gibi kontrolleri ana programın üstüne yük etmeden kontrol edebiliriz. Kesmelerle ilgili daha detaylı bilgiyi internetteki diğer kaynaklarda ve pic kitaplarında bulabilirsiniz. Burada pratik uygulamalar önceliğimiz olacaktır.

Bu dersimizde Harici INT/B0 kesmesiyle ilgili bir örnek yapacağız.













 







// 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 ;


char i; //Kesme için bir değişken

void main(void) // Ana fonksiyon alanı
{

    TRISB = 0x01; // RB0/INT giriş, diğerleri çıkış
    PORTB = 0x00; // PORTB sıfırlanıyor

    INTF = 0; //RB0/INT kesme bayrağı temizleniyor
    INTEDG = 1; //Yükselen kenarda kesme oluşacak
    INTE = 1; //RB0/INT izni veriliyor
    GIE = 1; //Genel kesme izni veriliyor

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


static void Kesme(void) __interrupt 0 //Kesme fonksiyonu
{
   if(INTF) //Dış kesme oluşmuşmu?
   {
      i++; //Her bir kesmede değişken bir artırılıyor
      if(i==1) //değişken 1 ise
         RB1=1; //Led yansın
      else //değilse
      if(i==2) //değişken 2 ise
      {
         RB1=0; //led sönsün
         i=0; //i sıfırlansın
      }
      INTF=0; //Tekrar dış kesme alınabilmesi için kesme bayrağı temizleniyor
   }
}


Öncelikle SDCC derleyicisi için sadece bir adet kesme fonksiyonu tanımlanır. Bütün kesme olayları bu fonksiyon içinde kontrol edilir. Biz bu programda sadece INTF kesme bayrağını yani “dış kesme” olup olmadığını kontrol ediyoruz. Eğer B4 ve B7 arasındaki pinlere bağlı butonları da kontrol etseydik bu kesmeler için “RBIF” kesme bayrağını kontrol ederdik. Peki hem harici(dış) kesme hemde B4~B7 kesmelerini kontrol eden kodu nasıl yazardık? Cevabı aşağıdaki gibi olurdu.

 
static void Kesme(void) __interrupt 0 //Kesme fonksiyonu
{
   if(INTF) //Dış kesme oluşmuşmu?
   {
      :
      :

      INTF = 0; //Tekrar dış kesme alınabilmesi için kesme bayrağı temizleniyor
   }

   if(RBIF) //B4 ve B7 pinlerinde kesme oluşmuşmu?
   {
      :
      :

      RBIF = 0; //Tekrar dış kesme alınabilmesi için kesme bayrağı temizleniyor
   }
}

 
Tabi buradaki kesme kontrol bloğu PIC16F877A da 14 adet olabilirdi. Kesme fonksiyonundaki “__interrupt 0” ifadesi olmak zorunda olan bir ifadedir. Bu ifadedeki 0 yerine 1 ve 2 gibi sayılarda olabilir. 1 sayısı yüksek önceliği, 2 sayısı düşük önceliği ifade eder. Ancak 0 kullanılması önerilir, şayet ileri seviye bilginiz yoksa. Bu fonksiyonun ismini “Kesme” olarak isimlendirdim. İsterseniz daha başka bir isimde verebilirsiniz.

Bu harici kesmeyi çalıştırabilmek için main fonksiyonunda bazı hazırlıklar yapmamız gerekmekte.

INTF = 0;

ile kesme bayrağımız ilk olarak sıfırlanır. Bu kesme bayrağı INTCON register'ı içinde bulunur.

INTEDG = 1;

satırı ile kesmeyi yükselen kenardamı yada düşen kenardamı kontrol edeceğimize karar veriyoruz. 0 düşen kenarı, 1 ise yükselen kenarı aktif eder. Bu kodda da yükselen kenarı aktif ettik. Bu kesme bayrağı OPTION register'ında bulunur.

INTE = 1;

ile dış kesmeye izin verip vermeyeceğimiz belirliyoruz. 1 değeri izin verdiğimizi gösterir. Bu kesme bayrağı INTCON register'ında bulunur.

GIE = 1;

ile tüm aktif edilmiş kesmelere izin veriyoruz yada vermiyoruz. Burada 1 değeri tüm kesmelere izin verdiğimizi gösterir. Yine bu kesme bayrağıda INTCON register'ı içinde bulunur.


Tahmin edeceğiniz üzere bu kesme registerları ve bayrakları ile değişik birçok ayar yapabilirsiniz. Bu sizin ihtiyaç duyduğunuz programlama ile yapmak istediklerinizi ayarlamanızla alakalı olacaktır. Temel olarak bu örnek üzerinde anlatacaklarımız şimdilik bukadar. Bir sonraki derste görüşmek üzere hoşçakalın.


duralikiraz.blogspot.com
25 Haziran 2015


Muvaffakiyet Allahtandır”



Hiç yorum yok:

Yorum Gönder