Mikrodenetleyici içindeki program adım adım yürütülür ve sırası gelen işlem/komut çalıştırılır. Bazen öyle durumlar olur ki bu adım adım yürütme işlemini beklenemez. Bu durumlar oluştuğu zaman mikrodenetleyici halihazırda yürümekte olduğu işlemi durdurur (keser) ve bu durumdan
kaynaklanan işlemleri öncelikle yürütür . İşi bittiğinde tekrar asıl
programda kaldığı yerden devam eder. Bu özel durumlar programı olduğu
yerde kestiği için kesme (interrupt ) olarak adlandırılır.
Örneğin buton konusunu işlediğimizde program mantığımız aşağıdaki gibiydi.
sonsuz_döngü()
{
...........işlemler..............
buton_kontrol
{
butona basıldığında istenilen işlemler
}
...................işlemler..............
}
Görüldüğü
gibi sonsuz döngü içinde işlemler/komutlar sırası gelince yürütülüyor.
buton_kontrol'e sıra gelince butona basılıp basılmadığı kontrol
ediliyor, basıldıysa gerekli işlemler yürürtülüyor. Sonsuz döngü
içindeki işlem sayısı çok fazla olursa her buton_kontrol işlemi
arasındaki süre uzayacaktır. Eğer butonumuz acil durdurma butonu ise
butona basmamız gecikmeli olarak algılanacak ve butona bastığımız sırada
yapılmasını istemediğimiz işlemler yapılıyor olabilecektir.
Eğer biz bunu kesme ile yapmış olsaydık program mantığımız şu şekilde olacaktı.
buton_kesme_programı()
{
butona basıldığında istenilen işlemler
}
anaprogram()
{
kesmeleri ayarla
sonsuz_döngü()
{
...........................
...........................
........işlemler.....
..........................
}
}
Mikrodenetleyici sonsuz döngü içinde programı yürütür, ancak bir önceki örnekte olduğu gibi butona basılıp basılmadığını yazılımsal olarak kontrol etmez. Butona basma işlemi kesme ile yapılacağından donanımsal olarak asıl program yürütülürken arka planda kontrol edilir. Böylece butona basıldığı sırada bir kesme oluşur , mikrodenetleyici o sırada yürüttüğü programa ara verir ve kesme fonksyonuna gider. Burada butona basıldığında yapılması istenilen işlemler gerçekleştirildikten sonra, program kaldığı yerden devam edecektir. Bu şekilde butona basma işlemi anında algılanabilecek.
AVR mikrodenetleyicileri birçok farklı kesmeye sahiptir. Kesmelerin
hepsi donanımsal kaynaklıdır. Donanımsal kaynaklı olduğu için kesmeler
ana program yürütülürken arka planda çalışır. Kesmeler genel olarak ISR
(Interrupt service routine) ve yanında kendilerini oluşturan nedenin
ismiyle anılırlar. ISR(TIMER1_COMPA_vect), ISR(INT0_vect) gibi .....
Atmega 328p 26 adet kesmeye sahiptir. Bunlar (datasheet sayfa 65: table12-6)

Atmel mikrodenetleyicilerinde kesmelerin öncelik sıralaması yukarıdaki tablodaki gibi vector numaralarına göredir. En öncelikli Reset kesmesi daha sonra INT0 kesmesidir.
Mikrodenetleyicinin kesme fonksiyonunu (ISR) çalıştırabilmesi için iki koşulun sağlanması gerekir.
1 - İlgili kesmenin aktif edilmesi
2 - SREG (Status register) içindeki Global Interrupt Enable (I- 7. bit ) bit'in aktif edilmesi gerekir.
Kesme koşulu oluştuğu anda SREG register içeriği ve Program Counter (PC) içeriği stack'e kaydedilir. Program counter'a ilgili kesmenin adresi yüklenir.Global Interrrupt enable bit-I otomatik olarak (donanımsal) 0(sıfır ) yapılır. Bu şekilde bir kesme fonksiyonu yürütülürken başka bir kesmenin oluşması engellenir. ISR (Interrupt service routine) çalıştırılır. ISR'de yürütülen işlemler bittikten sonra program kaldığı yere dönmesi RETI (Return from Interrupt ) komutu ile sağlanır. Program kaldığı yere döndükten sonra yeni bir kesme olursa kesme fonksiyonuna gitmeden önce en az bir tane komut işler ve sonra oluşan kesmenin ISR'sine gidilir.
RETI komutu SREG içeriğinin stack'ten geri alınmasını ve program counter'a kesme oluşmadan önce kaldığı yerden bir sonraki adresin yüklenmesini sağlar. SREG içeriğinin stack'e yedeklenmesi ve stack'ten geri okunması otomatik olarak olmaz, yazılımla yapılması gerekir. Global Interrupt Enbale bit-I 1 yapılır ve yeni kesmelerin oluşması sağlanır . Program kaldığı yerden devam eder .
SEI : Global Interrupt Enbale bit-I = 1 (Kurulu olan Kesmeleri aktif eder)
CLI : Global Interrupt Enbale bit-I = 0 (Kurulu olan Kesmeleri pasifleştirir)
ISR bir fonksiyondur. Ancak herhengi bir değer geri döndürmez ve ISR'ye herhengi bir değer gönderilemez.
Kesme işlemlerinin birçoğu ilerki konularda teker teker detaylı olarak örnekleriyle birlikte ele alınacaktır.
Yorumlar
Yorum Gönder