Bir önceki yazımızda RB0 kesmesini incelemiştik. Bu yazımızda ise PORTB değişiklik kesmesini inceleyeceğiz. Bu kesme PORTB’nin 4.,5.,6. ve 7. bitlerinde herhangi bir değişiklik olup olmadığını kontrol eden ve bu pinlerde herhangi bir durum değişikliği var ise bayrağını kaldıran bir kesmedir. RB0 kesmesinden farkı, burada değişilliğin biz tarafından belirlenmemesidir. RB0 kesmesinde bizim istediğimiz durum gerçekleşirse( 0’dan 1’e veya 1’den 0’a değişme) kesme oluşuyordu. Burada ise ilgili pinlerden herhangi birisi bir önceki durumunu değiştirdiği an kesme meydana gelmektedir. Yani diyelimki bu kesmeyi kurduk ve portb.f7 ilk durumda 0 değerinde. uC çalışmaya başladıktan sonra eğer portb.f7’nin durumu 0’dan 1’e geçerse kesme oluşur. Daha sonra portb.f7 tekrar 1’den 0’a geçerse bir kesme daha oluşur. Bu RB4..RB7 arasındaki tüm pinler için geçerlidir. Bu kesmenin kurulabilmesi için PIC16F628A datasheet’inde bulunan INTCON registerının ayarlanmasına geçelim. INTCON registerı bir önceki notumuzdan da hatırlayacağınız gibi “Interrupt Control” (Kesme kontrol) kelimelerinin kısaltılmışından oluşmaktadır. Bu register ile PIC 16f628a içerisindeki kesmeler ile ilgili ayarlamalar yapılabilmektedir. Bizim  PORTB’de değişiklik kesmesini kurabilmemiz için gereken ayarlanacak bit sayısı 2 adettir. Bunlar;

INTCON.GIE (Global Interrupt Enable bit) ve INTCON.RBIE (RB Port Change Interrupt Enable bit) bitleridir. Eğer merak ediyorsanız PIC16f628A datasheetinin 24. sayfasına bakabilirsiniz. INTCON.GIE bitini “1” yaparsak bütün kesmelere izin vermiş oluruz. Bu demek değildir ki bütün kesmeler aktif olacak. Sadece izin vermiş oluyoruz. Daha sonra aktif edilen her kesme çalışabilecek duruma gelecektir bu sayede. INTCON.RBIE bitini “1” yaparsak, PORTB değişiklik kesmesini aktif etmiş oluruz. Bu iki ayar bizim bu kesmemiz için yeterlidir. Şu andan itibaren eğer PORTB’nin 4..7 bitlerinde bir değişiklik meydana gelir ise program “void interrupt()” kesme alt programına gidecek ve bu alt program içerisindeki işler icra edilecektir. Tabi kesme oluştuğunda bu kesmenin bayrağı, kesmenin oluştuğunu haber vermek için göndere çekilecektir. Kesmenin tekrar oluşabilmesi için bizim “bu bayrağı gördük” deyip tekrar indirmemiz gerekecektir. INTCON.RBIF (RB Port Change Interrupt Flag bit) biti işte bu bahsettiğimiz bayraktır. Her kesme oluştuğunda bu bitin değeri “1” olur ve tekrar kesme oluşabilmesi için bu bitin sıfırlanması gerekir. Lafı fazla uzatmadan kullandığımız şemaya ve programa geçelim;

Büyütmek için tıklayın…

#define   led   portb.f0 // PORTB.f0  için "led" tanımlaması yapıldı.

void interrupt()  //Kesme alt programı...
{
led=~led;// POORTB.f0'ın durumu tersleniyor. 1'se 0 , 0'sa 1 yapılıyor.
INTCON.RBIF=0;// RBIF bayrağı sıfırlanıyor.
}

void kurulum() //Kurulum alt programı..
{
trisb.f0=0;//PORTB.f0 çıkış olarak ayarlanıyor.
led=0;//PORTB.f0 0'a çekiliyor.
INTCON.GIE=1;//Tüm kesmelere izin veriliyor.
INTCON.RBIE=1;//PORTB Değişiklik kesmesine izin veriliyor.
}

void main()//Ana program..
{
kurulum();//Kurulum alt programı çağrılıyor.
while(1);//sonsuz döngü..
}

Dikkat ederseniz programdaki sonsuz döngünün içerisinde hiç bir işlem yapılmıyor. Herşey kesme alt programı içerisinde yapılmış durumda. Kesme oluşuyor ve kesme alt programı çalışıyor sadece.

Bu yazı ile alakalı tüm dosyaları buradan indirebilirsiniz…

Herkese iyi çalışmalar diler, “May the force be with you” diyerekten de tüm Star Wars hayranlarına selamımı çakarım.

Görüşmek üzere..

yorum
  1. Özkan dedi ki:

    teşekkürler… MİKRO C 😉

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