Kesme(Interrupt) Oluşturulması ve Çalışması

Kesme(Interrupt) Oluşturulması ve Çalışması

Kesme(Interrupt) Tanımı

Mikrodenetleyicinin değişik kaynaklardan gelen sinyaller ile mevcut programının çalışmasını kesip,önceden tanımlanmış kesme programını icra edip, tekrar ana programa kaldığı yerden çalışmaya devam etmesi işlemidir. Kesme türlerine
buradan ulaşabilirsiniz

Kesmenin(Interrupt) Avantajları

  • İşlemlerin sadece program vasıtasıyla yapıldığında programın çalışma süresinin ve hızının büyük bir kısmını işgal etmektedir.
  • Program içerisinde yapılması gereken problemleri denetleyici içerisinde bulunan  kesme yaparsa  aynı anda birden fazla iş yapılmış olur.

Reset Vektörü ve Kesme(Interrupt) Vektörü

     PIC denetleyicilere ilk enerji geldiğinde veya PIC sıfırlandığında Program Counter (Çalştırılan komutun adresini tutan kaydedici)   0000h adresini gösterir. Bu adres reset vektörüdür.

     Denetleyici ilk enerjilendiği zaman ilk başta  0000h adresine bakar.

     Program çalışması sırasında herhangi bir kesme meydana geldiği zaman program sayıcı(Program Counter)  program hafızasında 0004h adresine gider. Bu adres kesme vektörüdür.

PIC Program Hafızası

     Program yazarken bir kesme olayını aktif etmişsek, 0004h adresine mutlaka kesme alt programımızın başlangıç adresini yazmalıyız. 

Kesme durumu meydana geldiğinde program sayıcı 0004h adresini gösterecek , program 0004h adresine gidecek keme programını icra edecektir. Yukarıdaki resimde görülmektedir.

Kesme(Interrupt) Oluşturma

CCS C’de kesme meydana geldiğinde komutları içerisinde barındıran bir kesme fonksiyonu tanımlanması gerekir.
Kesme fonksiyonu mutlaka ana fonksiyondan önce tanımlanmalıdır.

int_Kesmeİsmi [Fonksiyon geri dönüş değeri ] [Fonksiyon ismi] ( )
{
       Kodlar veya Komutlar...
}

örnek bir dış kesme oluşturalım.

#int_ext
void dis_kesme()
{
   output_low(pin_d1);
   x++;
}

Herhangi bir kesmeyi aktif veya pasif hale getirmek için:

enable_interrupts (Kesme İsmi);// Kesmeyi aktif yapar
 
disable_interrupts (Kesme İsmi);// Kesmeyi pasif yapar

Yukarıda oluşturduğumuz dış kesmeyi aktif ve pasif yapalım

enable_interrupts (int_ext);// RB0/INT dış kesmesini aktif yapar
 
disable_interrupts (int_ext);// RB0/INT dış kesmesini  pasif yapar

CCS C’de akif edilmiş tüm kesmelere izin vermek gerekir veya izin verilmez. Programdaki tüm kesmeleri aktid veya pasi yapma komutu aşağıdaki gibidir:

enable_interrupts (GLOBAL);// Aktif edilen tüm kesmelerin çalışmasına izin verilir
 
disable_interrupts (GLOBAL);// Aktif edilen tüm kesmelerin çalışmasına izin verilmez

Bir kesme meydana geldiğinde o kesmenin çalışması esnasında başka kesme meydana gelirse o meydana gelen kesme çalışması için ilk çalışan kesmenin bitmesi gerekir.

Aynı anda meydana gelen kesmelerede öncelik belirlemek için aşağıdaki komu satırı kullanılır. Burada yazılan kesme en fazla önceliğe sahiptir.  

#priority Kesme İsmi,Kesme İsmi
 
#priority ext,timer0  // örnek öncelik sıralı kesme

Kesme önceliği için bir başk kod satırı aşıda gösterilmiştir.

#int_Kesme İsmi HIGH 
 

Kesmeye yukarıdaki HIGH eki getirilirse belirtilen kesme yüksek önceliğe sahip anlamına gelir. Kesme gidildiğinde kaydedici içerikleri kaydedilir ve kesemeden gelindiğinde kaydediciler yeniden yüklenir.

#int_Kesme İsmi FAST
 

Eğer kesmeye FAST eki getirilirse  yüksek önceliğe sahip fakat FAST parametresi sadece bir kesme için kullanılabilir ve kesmeye gidildiğinde kaydedici içerikleri kaydedilmez.
FAST komutunun kullanılabilmesi için  denetleyici başlık dosyasından sonra  programa aşağıdaki kod eklenmelidir.

#DEVICE HIGH_INTS=TRUE
 

Programda kesme meydana geldiğinde o kesmeye ait kesme bayrağı lojik-1 olur (nedeni aynı tekrar kesme meydana geldiğinde  kesme komutları çalışırken kesmeden çıkılmaması için ) kesme komutları sonunda  bu bayrak biti CCS C’ de otomatik lojik-0 yapılır. Bu bit lojik-0 yapılmassa  aynı kesme ikinci kez meydana gelmez. 

CCS C’de kesme bayrağının kesme çıkışında otomatik sinmesi istenmiyorsa :

#INT_Kesme Adı NOCLEAR
 
//Örnek
#int_timer0 NOCLEAR //timer0 kesmesi sonunda bayrağı silinmeyecek
 

Programcı kesme bayrağını kendisi silmek isterse aşağıdaki komut satırını kullanması gerekir.

clear_interrupt (Kesme İsmi)
 
//Örnek
clear_interrupt (int_rda); //INT_RDA kesmesi bayrağı silindi
 
 

Kesme bayrağının durumunu kontrol etmek için CCS C’de desteklenen PIC ürünlerinde aşağıdaki şekilde kontrol edilir..

interrupt_active (Kesme Adı);
 
//Örnek
if(interrupt_active(int_rda)) //  lojik-1 veya lojik-0 değeri alacaktır
    output_high (pin_b7);

Kimler Neler Demiş?

  Abone ol  
Bildir