C18 Diliyle Robot Programlama – Kesme (Interrupt) İşlemleri

Kesmelerde temel amaç o anki program akışını durdurup kesmeyi oluşturan duruma özgü kodları çalıştırmak ve kodların çalışması bittikten sonra program akışını kalınan yerden devam ettirmektir. PIC18F4585’te kesmeleri oluşturmak için 2 vektör adresi kullanırız. Bu vektör adresleri mikroişlemcide interrupt geldiği zaman çalıştırılacak kodların bulunduğu bir bölüme referans verir. Bu vektör adreslerinden biri low_vector(düşük öncelikli interruptlar) diğeri ise high_vector(yüksek öncelikli interruptlar)’dür. Low_vector 0x18 adresini, High_vector ise 0x08 adresini gösterir. Programda bu kısımlar aşağıdaki şekilde kodlanır;

#pragma code high_vector=0x08
void high_interrupts (void) {
     _asm GOTO high_ints _endasm
}
#pragma code

Aynı şekilde düşük öncelikli interruptlar için low_vector=0x18 yazılır. Ayrıca _asm _endasm arasında kalan kısıma assembly koduyla referans verilir. Goto komutuyla high_ints denen bir bölgeye gidilir. Bu bölge aşağıdaki şekilde kodlanır;

#pragma interrupt high_ints
void high_ints (void) {

     //Kesme geldiginde calisacak kodlar

}

high_ints veya high_interrupts yerinde kendiniz de isimler belirleyip yazabilirsiniz.

Bir kesmenin oluşup oluşmadığı nasıl anlaşılır? Bunun için ilgili birimle alakalı flag‘in 1 ya da 0 olma durumuna  bakılır.  C18’de  bir  çok  modüle ait register  bulunur.  Bu  register’ların bazıları interruptların enable/disable durumunu ayarlamak için, bazıları interrupt oluştuğunda anlayabilmek için, bazıları kendi modülüne ait işlemleri gerçekleştirmek için kullanılır.

Bu dökümanda kullanılacak bazı önemli register ve flag’ler aşağıda verilmiştir;

INTCON (Interrupt Control) Register: Enable/disable, priority(öncelik) ve flag bitlerini barındırır.

  • GIE/GIEH: Global interruptları açar. (Ör: INTCONbits.GIE = 1)

IPEN biti 0 iken GIE/GIEH biti;
1 ise maskelenmemiş bütün interruptlar enable. 0 ise bütün interruptlar disable.

IPEN biti 1 iken GIE/GIEH biti;
1 ise bütün yüksek öncelikli interruptlar enable. 0 ise bütün yüksek öncelikli interruptlar disable.

  • PEIE/GIEL: Çevresel interruptları açar. (Ör: INTCONbits.GIEL = 1)

IPEN biti 0 iken PEIE/GIEL biti;
1 ise maskelenmemiş çevresel interruptlar enable, 0 ise bütün çevresel interruptlar disable

IPEN biti 1 iken PEIE/GIEL biti;
1 ise düşük öncelikli çevresel interruptlar enable, 0 ise  düşük öncelikli çevresel interruptlar disable

  • TMR0IE: TMR0 taşma kesmesi 1 iken enable, 0 iken disable.
  • TMR0IF: TMR0 kesmesi oluştuğunda bu flag set(1) olur.
  • INT0IE: INT0 dış kesmesi 1 iken enable, 0 iken disable.
  • INT0IF: INT0 dış kesmesi oluştuğunda bu flag set(1) olur.

INTCON2 (Interrupt Control 2) Register:

  • INTEDG0: INT0 adındaki dış kesmenin, sinyalin hangi kenarında tetikleneceğini belirtir.

1 ise yükselen kenarda interrupt oluşur.
0 ise düşen kenarda interrupt oluşur.

Not: INTEDG1 ve INTEDG2 flag’leri de aynı işlemi INT1 ve INT2 dış kesmeleri için yapar.

  • TMR0IP: Timer0 kesmesinin priority(öncelik) durumunu belirtir.

1 ise Timer0 kesmesi yüksek öncelikli. (yüksek öncelikli interrupt’ları çalıştırdığımız fonksiyonla kontrol ederiz.)
0 ise Timer0 kesmesi düşük öncelikli. (düşük öncelikli interrupt’ları çalıştırdığımız fonksiyonla kontrol ederiz.)

INTCON3 (Interrupt Control 3) Register:

  • INT1IP, INT2IP: INT1 ve INT2 dış kesmelerinin priority(öncelik) durumunu belirtir.

1 ise kesmeler yüksek öncelikli. (yüksek öncelikli interrupt’ları çalıştırdığımız fonksiyonla kontrol ederiz.)
0 ise kesmeler düşük öncelikli. (düşük öncelikli interrupt’ları çalıştırdığımız fonksiyonla kontrol ederiz.)

  • INT1IE, INT2IE: INT1 ve INT2 kesmelerinin enable/disable durumunu belirler. 1 ise enable, 0 ise disable.
  • INT1IF, INT2IF: INT1 ya da INT2 dış kesmelerinin oluşması durumunda ilgili kesmenin flag’i set(1) olur.

PIR1 Register:  Dış kesmelerin flag durumlarıyla ilgili bitleri içerir.

  • TMR1IF, TMR2IF: TMR1 ya da TMR2 timer(zamanlayıcı)’larından biri kesme oluşturduğunda ilgili timer’ın flagi set(1) olur. (Ör: PIR1bits.TMR1IF)

PIE1 Register: Dış kesmelerin enable/disable durumlarıyla ilgili bitleri içerir.

  • TMR1IE, TMR2IE: TMR1 ya da TMR2 timer(zamanlayıcı) kesmelerinin enable/disable durumlarını belirtir. (Ör: PIE1bits.TMR1IE)

1 ise ilgili zamanlayıcının interruptları enable.
0 ise ilgili zamanlayıcının interruptları disable.

IPR1 Register: Çevresel kesmelerin priority(öncelik) durumlarıyla ilgili bitleri içerir.

  • TMR1IP, TMR2IP: TMR1 ya da TMR2 timer(zamanlayıcı) kesmelerinin öncelik durumlarını belirtir. 1 ise yüksek öncelikli, 0 ise düşük öncelikli.

RCON(Reset Control) Register:

  • IPEN(Interrupt Priority Enable Bit): Kesmelerde priority(öncelik) kavramının göze alınıp alınmayacağına karar verir.

1 ise kesmeler arasında bir hiyerarşi (yüksek-düşük anlamlı olma durumu) vardır.
0 ise kesmelerin hepsi eşit önceliklidir. Priority yoktur.

Bu Doküman içerisinde  bize devamlı lazım olacak register bitlerinin ne anlama geldiğini açıkladım. Sonraki konularda bu bitlerle işlemler yapıp program akışını kesmelerle değiştireceğiz.

Not: Kesmelerle ilgili örnekler diğer modüller anlatılırken kullanılacağı için bu konu hakkında örnek vermedim. Bir sonraki konuda timer modülü ile ilgili örnek yaparken basit kesme yapıları gerçekleyeceğiz.

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 )

Google+ fotoğrafı

Google+ 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 )

Connecting to %s