ATMEL PROGRAMLAMA 16 - Interrupts (Kesmeler)



         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_vectgibi .....

   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