KESMELER (INTERRUPTS)
KESME (INTERRUPT)
PIC'in port girişlerinden veya donanım içerisindeki bir sayıcıdan gelen sinyal nedeniyle belleğinde çalışmakta olan programın kesilmesi olayıdır. Programın kesildiği andan itibaren önceden hazırlanan bir alt program çalışır. Alt program işlevini bitirdikten sonra ana program kaldığı yerden itibaren tekrar çalışmasına devam eder. Sonuç olarak kesme, ana programın çalışmasını sadece duraklatır, ama hiçbir zaman işlevini devam ettirmesini engellemez.
Kesme alt programından ana programa dönüş komutu
RETFIE (Return From lnterrupt)'dir.
INTCON REGİSTERİ
INTCON (Interrupt Control) registeri RAM bellekte h'0B' adresinde bulunan özel registerlerden bir tanesidir. Bu register içerisinde her bir kesme kaynağı için bir flag ve bir de global kesme bayrağı vardır. Tüm kesme işlemlerinin kontrolü bu register aracılığı ile yapılır.
KESME ÇEŞİTLERİ
PIC16F84 kesmeleri 4 çeşittir:
- Harici(External) kesme (PIC16F84'ün RB0/INT ucundan giren sinyal.)
- TMR0 sayıcısında oluşan zaman aşımı kesmesi (TMRO sayıcısının h'FF' den H'00'a gelmesi.)
- PORTB (4, 5, 6 ve 7 bit'ler) lojik seviye değişikliğinden.
- EEPROM belleğe yazma işleminin tamamlanmasında meydana gelen kesme
1. HARİCİ KESMELER
Harici kesmelerin kullanılabilmesi için iki şey gereklidir; yazılım ve donanım. Yazılım aracılığı ile PORTB'nin RB0/INT ucu dışardan gelebilecek kesmeyi alabilecek biçimde hazırlanmalıdır. Bu hazırlama işlemi için iki işlem yapılır;
-
RB0/INT ucu giriş olarak yönlendirmeli.
-
INTCON registeri içerisindeki ilgili bayrak (INTE bayrağı) kullanılarak harici kesme işlemi aktif (geçerli) yapılmalıdır.
Harici kesmenin kullanılabilmesi için bir de donanım gereksinmesi vardır. Bu da RB0 ucundan sinyal girmek için gerekli elektronik devredir.
RB0/INT girişinden uygulanacak sinyalin kenar tetiklemesi önemlidir. OPTION registerin 6. bit'i bu uçtan girilen sinyalin yükselen kenarda mı yoksa alçalan kenarda mı kesme oluşturulacağına karar vermekte kullanılır.
Kesme alt programının çalışması esnasında gelebilecek yeni kesmeleri engellemek için, kesme oluştuğu zaman INTCON register'deki 4. bit (INTE bayrağı) "0" yapılmalıdır.
Eğer bir harici kesme(RB0/INT ucundan sinyal girişi) meydana gelirse, INTCON register içerisindeki INTF bayrağı "1" olur. INTF bayrağı interrupt alt programı içerisinde tekrar "0" yapılmalıdır. Aksi halde tekrarlanan kesmelerle karşılaşılır.
Program Adı: 16F84 kullanılarak kesme işlemi yapılacak olan uygulamada,
Ana program; RB1 butonuna bir defa basıldığında PORTA’ya bağlı ilk 4 ledin yanışını sürekli olarak önce sola ve sonrada sağa kaydıracaktır (kara şimşek).
Alt programda ise;PORTA’daki ilk 4 ledi sürekli olarak yakıp söndürülecektir.
Kesme oluşabilmesi için; RB0/INT ucundan girilen harici bir sinyal ile kesme oluşturulmasında düşen kenarda interrupt kaynağı olarak kullanacaktır.
LIST P=16F84
INCLUDE “P16F84.INC”
SAKLA_W EQU h’0C’
SAKLA_S EQU h’0D’
ORG h'00'
GOTO BASLA
ORG h'004"
GOTO INT_ALT_PROG
BASLA
BSF STATUS, 5
MOVLW h'FF'
MOVWF TRISB
CLRF TRISA
MOVLW h’10111111’
MOVWF OPTION_REG
BCF STATUS, 5
CLRF PORTA
BSF INTCON, 7
BSF INTCON, 4
BCF INTCON, 1
TEST
BTFSC PORTB, 1
GOTO TEST
SOL
MOVLW b’00000001’
MOVWF PORTA
CALL GECIKME
DONSOL
RLF PORTA, F
CALL GECIKME
BTFSS PORTA, 3
GOTO DONSOL
SAG
MOVLW b’00001000’
MOVWF PORTA
CALL GECIKME
DONSAG
RRF PORTA, F
CALL GECIKME
BTFSS PORTA, 0
GOTO DONSAG
GOTO SOL
INT_ALT_PROG
MOVWF SAKLA_W
SWAPF STATUS, W
MOVWF SAKLA_S
BCF INTCON, 1
MOVLW b’00001111’
MOVWF PORTA
CALL GECIKME
CLRF PORTA
CALL GECIKME
SWAPF SAKLA_S, W
MOVWF STATUS
SWAPF SAKLA_W, F
SWAPF SAKLA_W, W
RETFIE
END
;NOT:Programdaki koyu olan satırları sabit ve olması zorunlu diye düşünün. Diğer satırları istenen programa göre değişitireb
2. TMR0 SAYICI KESMESİ
TMR0 sayıcı kesmesi, bu özel sayıcı içerisindeki sayının h'FF'den h'00'a gelince oluşur.
RAM belleğin h'01' adresinde TMR0 adı verilen özel bir register TMR0 sayıcısıdır. TMR0 programlanabilen bir sayıcıdır. Yani saymaya istenilen bir sayıdan veya h'00'dan başlatılabilir, herhangi bir anda içeriği sıfırlanabilir. Özellikleri şöyle sıralayabiliriz:
- 8-bit bir sayıcıdır.
- Yazılabilir/okunabilir.
- Programlanabilen frekans bölme değeri (Prescaler value)
- Harici veya dahili clock ile sayı artışı
- Harici olarak düşen veya yükselen kenar tetiklemesi
- Sayıcı değeri artan yöndedir
- TMR0'ın değeri h'FF'den h'00'a gelince ilgili flag'i "1" yaparak kesme oluşturur.
TMR0 sayıcısının önemli özelliği, ana program veya kesme alt programları çalışırken sayma işlemini durdurmamasıdır. Sayma işlemi devam ederken h'FF' den h'00'a geçişte meydana gelen taşma (overflow), INTCON registerin 2. bit'inde (T0IF bayrağı) görülür. Yani, bu esnada T0IF bayrağı "1" olur. Gerekiyorsa bu bayrak kontrol edilerek kesme oluşturulabilir.
13.3. OPTION REGİSTER
Option register, RAM belleğin 1. bank'ındaki h'81' adresinde bulunan özel bir registerdir. B portunun çıkışlarının pull-up yapılma durumunu kontrol eden, kesme sinyalinin tetikleme kenarını seçen, TMR0 ve WDT için frekans bölme sayısı için gerekli bit'leri bulunduran, TMR0 veya WDT'yi seçme bayrağı bulunan ve tüm bu işleri kontrol eden 8-bit'lik bir registerdir. Aşağıda bu registerin her bir bit'inin ne görevleri yaptığı ve hangi kesme için nasıl ayarlanacağı gösterilmiştir.
Programın Adı: 16F84 mikrodenetleyicisi için TMR0'ın sinyal kaynağı olarak dahili komut saykılı kullanılan ve TMR0 sayıcısının her 64 adımda bir sayı ilerlemek kaydıyla PORTB'ye bağlı LED'leri flash yaptıran programı yazınız. (LED'lerin yanıp sönme aralıklarındaki gecikmeyi TMR0 sayıcısı yapmaktadır ve TMR0’ın 4. biti test edilerek gecikme döngüsü ayarlanmaktadır.)
LIST P=16F84
INCLUDE “P16F84.INC”
CLRF PORTB
BSF STATUS, 5
CLRF TRISB
BCF STATUS, 5
BASLA
CLRWDT
BSF STATUS, 5
MOVLW b’11010101’
MOVWF OPTION_REG
BCF STATUS, 5
CLRF PORTB
YAK
MOVLW h'FF'
MOVWF PORTB
CALL GECIKME
SONDUR
CLRF PORTB
CALL GECIKME
GOTO YAK
GECIKME
CLRF TMR0
TEST_BIT
BTFSS TMR0, 4
GOTO TEST_BIT
RETURN
END
WDT ZAMANLAYICISI (WATCHDOG TIMER)
PIC donanımı içerisinde bulunan ikinci bir zamanlayıcıdır. WDT İngilizce'deki “WatchDog Timer" kelimesinin kısaltmasından gelir. PIC'in önceden belirlenen sürede yapması planlanan bir işi zamanında yapmadıysa, yani döngü kontrolden çıkıp da kilitlendiyse, WDT devreye girer ve PIC'i reset eder. Genellikle program kontrolü elden kaçtığı durumda PIC'in kontrolünü tekrar ele alarak yazılım veya donanım problemlerinin bekçiliğini yapar. WDT ayrıca SLEEP(Uyuma) moduna girmiş PIC'i uyandırarak yeniden çalışmaya devam etmesini sağlamak amacıyla kullanılır.
Programın Adı: PORTA’ nın 0,1,2 girişini kullanarak yapılan bir alarm sisteminde; önce PORTA taranacak ve butonlar aktif değil ise PIC uyku moduna (SLEEP) geçecek ve 2 saniye sonra uyku modundan çıkarak (WDT ile) tekrar PORTA taranacaktır. PORTA’nın herhangi bir girişi aktif olduğunda PORTB’yi flash yaptıran programı yazınız. (PORTA’ya Gaz, Isı, Hareket Dedektörü bağlandığını, PORTB’ye ise Telefon arayıcı, Siren, Lamba bağlandığını düşünün.)
LIST P=16F84
INCLUDE "P16F84.INC"
SAYAC1 EQU h'0C'
SAYAC2 EQU h'0D'
BASLA
BSF STATUS, 5
MOVLW b’00001111’ ; WDT seçilir.
MOVWF OPTION_REG ; OPTION_REQ←W
CLRF TRISB
MOVLW h’FF’
MOVWF PORTA
BCF STATUS, 5
DONGU
BTFSC PORTA.0
GOTO ATLA1
GOTO ALARM
ATLA1
BTFSC PORTA.1
GOTO ATLA2
GOTO ALARM
ATLA2
BTFSC PORTA.2
GOTO ATLA3
GOTO ALARM
ATLA3
SLEEP
GOTO DONGU
ALARM
MOVLW h’FF’
MOVWF PORTB
CALL GECIKME
CLRF PORTB
CALL GECIKME
GOTO ALARM
GECIKME
MOVLW h’FF’
MOVWF SAYAC1
DONGU1
MOVLW h’FF’
MOVWF SAYAC2
DONGU2
DECFSZ SAYAC2, F
GOTO DONGU2
DECFSZ SAYAC1, F
GOTO DONGU1
RETURN
END
3. PORTB LOJİK SEVİYE (RB4-RB7) DEĞİŞİKLİK KESMESİ
PORTB'nin 4, 5, 6, 7. bit'lerinde meydana gelen bir değişiklikte INTCON registeri'nin 0. bit'i (RBIF) "1" olur. Bu kesme INTCON registeri'nin 3. bit'i (RBIE) aracılığıyla aktif veya pasif yapılabilir.
PORTB'nin 0, 1, 2, 3. bit'lerindeki değişiklikler kesme oluşturmaz. PORTB'deki değişikliği algılamak için, RB4-RB7 uçlarından okunan veri ile karşılaştırılır. Eski ve yeni okunan veriler OR'lanır. Farklılık varsa RBIF bayrağı (INTCON registerin 0. bit'i) "1" olur.