ATMEL PROGRAMLAMA 17 - External Interrupts (INT0 ve INT1)


     
   Harici kesme mikrodenetleyicnin kesme algılama pinindeki değişimin algılanmasıdır.  Atmega 328p mikrodenetlleyicisi harici kesmeleri  iki gruba ayrılabilir.
   
     1-  External Interrupt Request          :  INT0 (PD2)ve INT1(PD3) pinlerinden
     2-  Pin Change Interrupt Request     :  PCINT23..0 pinlerinden

Bu yazımızda External Interrupt Request'i işleyeceğiz.  INT0 kesmesi ile ilgili örnek yapacağız.




1- External Interrupt Request

       INT0 (External Interrupt Request 0) ve INT1(External Interrupt Request 1)  kesmeleri atanmış oldukları PD2 (INT0) ve PD3 (INT1)pinlerinde oluşabilecek değişiklikleri algılayan kesmelerdir.

    Bu kesmelerin aktif olması için :
    
          1-Bu kesmelerle ilgili registerların istenilen şekilde ayarlanması
          2- Status Register (SREG) içindeki Global Interrupt Enable bit (I)'in aktif edilmesi gerekir.

   Her iki kesmenin de çalışma mantığı ayndır. Aynı durumlara aynı şekilde tepki verirler. Bu kesmelerle ilgili registerlar  EICRA, EIMSK ve EIFR 'dir

         EICRA - External Interrupt Control Register A

     INT0 ve INT1 interrupt girişlerindeki değişimin ne şekilde olacağını düzenler


     ISC11 - ISC10 Interrupt Sense Control 1 Bit1 ve bit 0  INT1 kesmesini düzenler 
  

           

ISC11=0 ,ISC10 =0    :  INT 1 kesme pin girişindeki sinyal lojik 0 (LOW) seviyesinde kaldığı sürece
                                       kesme oluşur.

ISC11=0 ,ISC10 = 1   :  INT 1 kesme pin girişindeki sinyal Lojik seviyesi  değişiminde  kesme oluşur                                        (1--->0 veya 0--->1)
                                    
ISC11=1 ,ISC10 = 0   :  INT 1 kesme pin girişindeki sinyalin  düşen kenarında (1--->0 geçişi)   
                                       kesme  oluşur .

ISC11=1 ,ISC10 = 1   :  INT 1 kesme pin girişindeki sinyalin  yükselen kenarında (0--->1 geçişi)   
                                       kesme  oluşur .                                    

ISC01 - ISC00 Interrupt Sense Control 0 Bit1 ve bit 0  INT0 kesmesini düzenler  




ISC01=0 ,ISC00 =0    :  INT 0 kesme pin girişindeki sinyal lojik 0 (LOW) seviyesinde kaldığı sürece
                                       kesme oluşur.

ISC01=0 ,ISC00 = 1   :  INT 0 kesme pin girişindeki sinyal Lojik seviyesi  değişiminde  kesme oluşur                                        (1--->0 veya 0--->1)
                                    
ISC01=1 ,ISC00 = 0   :  INT 0 kesme pin girişindeki sinyalin  düşen kenarında (1--->0 geçişi)   
                                       kesme  oluşur .

ISC01=1 ,ISC00 = 1   :  INT 0 kesme pin girişindeki sinyalin  yükselen kenarında (0--->1 geçişi)   
                                       kesme  oluşur .



      EIMSK - External Interrupt Mask Register 

    INT0 ve INT1 kesmeleri aktif etme registerı



  

    INT0 =1  ise   INT0  aktif    INT0 =0  ise   INT0  pasif
    INT1 =1  ise   INT1  aktif    INT1 =0  ise   INT1  pasif

       EIFR – External Interrupt Flag Register
 
   INT0 ve INT1 interrupt flaglerinin bulunduğu kaydedicidir.

 

    INTF1 : INT1 kesmesi oluştuğunda 1 olur 
    INTF0 : INT0 kesmesi oluştuğunda 1 olur 

 bu bayraklar program ISR'ye girince sıfırlanır. ISR içinde tekrar kesme gelirse tekrar 1 olur. Ancak tekrar kesmenin oluşması için hali hazırdaki kesmenin bitmesi, programın kaldığı kaldığı yere geri dönmesi ve bir komut işlemesi gerekir.  Bu uyarı bayrakları yazılım içinde 1 yapılarak pasif hale getirilebilir.
         INT0 kesmesi örnek

Devremiz aşağıdaki şekildeki gibi olacak. INT0 girişine (PD2) bir buton bağlı . PD2 pini dahili pull-up özelliği kullanılarak Lojik 1 seviyesinde tutuluyor. Butona basınca PD2 lojik 0 olacak, yani 1'den 0'a geçiş olacak (düşen kenar ) ve kesmemiz aktif olmuş olacak.




  INT0 kesmesinin ayarlanması:

  1-  INT0 için düşen kenar tetiklemesini aktif etmek için   EICRA register 'ında( External
       Interrupt  Control Register A ) ISC11=1 ,ISC10 = 0  yapılmalıdır.

 2-  INT0 kesmesini aktif etmek için EIMSK  register'ında ( External Interrupt Mask Register )
      INT0=1 yapılmalıdır.

 3- SREG registerında I (Global Interrupt Enable bit ) biti 1 yapılmalıdır. veya sei() kullanılabilir


programımız 

#include <avr/io.h>
#define F_CPU 8000000ul
#include <util/delay.h>
#include <avr/interrupt.h>

#define led PORTB0
#define buton PORTD2

ISR(INT0_vect)
      {
          PORTB^=(1<<led);     

      }

 int main(void)
     {
          PORTB=0x00;
          DDRB |=(1<<led);
          DDRD &=~(1<<buton);
          PORTD |=(1<<buton);
   
         EICRA |=(1<<ISC01);
         EICRA &=~(1<<ISC00);
   
        EIMSK |=(1<<INT0);
   
        sei();    //SREG|=(1<<7);
   
        for(;;); 
   
  }


Bu örneğin benzerini kaydedicilerdeki bitleri değiştirip INT1 için de yapabiliz.




 

Yorumlar

  1. Bu yorum yazar tarafından silindi.

    YanıtlaSil
  2. ISR(INT0_vect)
    {

    }
    bu kısım INT0 harici kesmesi gerçekleştiği zaman çalışacak kesme fonksiyonudur.

    PORTB^=(1<<led); led'in durumunu değiştirir. yanıksa söner, sönükse yanar. (toggle işlemi)

    INT0 harici kesmesi gerçekleştiği zaman led durum değiştirecek.

    YanıtlaSil

Yorum Gönder