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?
- Öncelikle kesme istediğimiz pinleri giriş olarak yapılandırıyoruz. (TRISB kaydedicisi)
- INTCON.RBIE biti “1” yapılmalıdır. Yani RB Değişiklik kesmesine müsaade et demektir.
- INTCON.RBIF bitini “0” yapmalıyız. Yani kesme oluştu bayrağını kaldırmalıyız.
- 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.
#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.