PORTB Change Interrupt (PORTB Değişim Kesmesi)

rbchange_kesme_kapı

PORTB’nin 4,5,6,7 pinlerinde meydana gelen değişiklik kesmesidir. Gerekli kesme ayarları yapıldıktan sonra bu pinlerde oluşabilecek değişiklik  anında mikrodenetleyici ana programı bekletir ve kesme rutinine gider,  kesme alt programındaki program kodlarını işledikten sonra tekrar ana programda kaldığı yerden devam eder. Burada önemli bir hususa dikkatinizi çekmek isterim; hangi pinde kesme istiyorsak sadece onu giriş olarak yapılandırmalıyız. Bir diğer husus kesme hem düşen kenarda hem de yükselen kenarda oluşur. Kesme alt programında girişin “1” veya “0” olma durumuna göre kod yazılabilir.

RB Change (RB Değişiklik) Kesmesi nasıl kurulur?

  1. Öncelikle kesme istediğimiz pinleri giriş olarak yapılandırıyoruz. (TRISB kaydedicisi)
  2. INTCON.RBIE biti “1” yapılmalıdır. Yani RB Değişiklik kesmesine müsaade et demektir.
  3. INTCON.RBIF bitini “0” yapmalıyız. Yani kesme oluştu bayrağını kaldırmalıyız.
  4. Son olarak ta INTCON.GIE bitini “1” yapmalıyız. Yani bütün kesmelere izin vermeliyiz.

RB Değişiklik Kesmesi oluştuğunda ne yapılır?

Kesme oluştuğunda mikrodenetleyici programı interrupt vektörüne (0x0004) yönlendirir. Interrupt alt programında oluşan kesmenin bayrağı daha sonraki kesmelerin oluşabilmesi için indirilir yani “0” yapılır.  Daha sonra kendi kodlarımızı ekleyip kesme alt programı bitirilir.

MikroC ile RB Değişiklik Kesmesi Uygulaması

Bu uygulamamızda PIC16F628A mikrodenetleyicisinin RB4 ve RB7 girişine  buton bağlayacağız. RA0 pinine de LED bağlayacağız. RB7 Butonuna basılınca kesme oluşacak ve LED yanacak, RB4 butonuna basılınca LED sönecektir.

rbchange_kesme1

#define LED PORTA.B0 // PORTA'nın 0.pinine LED bağlantısı tanımlandı
//------------------------------------------------------------------------------
void interrupt() // Kesme fonksiyonu
{
  if(INTCON.RBIF) // RBIF bayrağı oluşmuşsa
  {
    INTCON.RBIF=0; // RBIF bayrağını sil
    if(!PORTB.B7) LED=1; // eğer PORTB'nin 7.pini Low ise;LED'i yak
    if(!PORTB.B4) LED=0; // eğer PORTB'nin 4.pini Low ise;LED'i söndür
  }
}
//-----------------------------------------------------------------------------
void main()
{
  CMCON=7; // PORTA dijital giriş çıkış
  TRISA=0; // PORTA çıkış
  TRISB=0x90; // PORTB'nin 4 ve 7 pinleri giriş diğerleri çıkış
  OPTION_REG.B7=0; // PORTB dahili pull-up aktif
  INTCON.GIE=1; // bütün kesmelere izin ver
  INTCON.RBIE=1; // PORTB değişim kesmesine izin ver
  INTCON.RBIF=0; // RBIF bayrağını temizle
  PORTA=0; // PORTA'yı sıfırla
  PORTB=0; // PORTB'yi sıfırla
  LED=1; // LED'i yak - programın çalıştığını görmek için-
  Delay_ms(1000); // 1 sn yanık kalsın
  LED=0; // LED'i söndür
  while(1)
  {
    Delay_ms(1000); // program içinde bir iş tanımlanmadı sadece bekleme
  }
}

 Projeye ait dosyaları buradan indirebilirsiniz.

Yorum bırakın