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 0×18 adresini, High_vector ise 0×08 adresini gösterir. Programda bu kısımlar aşağıdaki şekilde kodlanır;
Aynı şekilde düşük öncelikli interruptlar için low_vector=0×18 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;
|
|
|
| _asm GOTO high_ints _endasm |
| } |
| #pragma code |
| #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/disabledurumunu 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.
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.
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
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
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.
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.)
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.)
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 flagiset(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.
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.
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.
Kaynak:http://elkitabim.net
Yorumlar
Yorum Gönder