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