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.
Bu yorum yazar tarafından silindi.
YanıtlaSilISR(INT0_vect)
YanıtlaSil{
}
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.