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