Setelah kita memahami cara kerja interupsi pada keluarga AVR ATMega dalam postingan ini, maka sekarang kita akan mencoba membuat program yang menggunakan pemanggilan rutin interupsi.
Interrupt yang akan kita gunakan adalah interrupt 0 atau INT0 yang berada pada PIND.2, ketika PIND.2 ditekan maka program akan menjalankan subrutin interupsi.
Program yang akan kita buat adalah program menyalakan LED dari PORTA.0 – PORTA.7 secara bergantian, dan ketika terjadi interupsi program akan menyalakan 4 LED di PORTA secara bergantian selama 5 x.
Program ini inspirasinya dari buku Pemrograman Bahasa C untuk Mikrokontroler ATMEGA 8535 karya M. Ary Heryanto dan Wisnu Adi P. Tentu saja teman2 masih bisa mengembangkannya sendiri sesuai selera teman2. Yang perlu diperhatikan ketika kita membuat new project di Codevision AVR pastikan anda telah mengenable External IRQ INT0 pada tab yang tersedia, mode yang saya gunakan adalah rising edge.
Berikut adalah listing programnya
/*this program inspired from pemrograman bahasa C
untuk mikrokontroler atmega 8535 dan telah mengalami
modifikasi sesuai selera penulis, silahkan modifikasi
sesuai selera temen2
trimakasih
priyo harjiyono
https://anotherorion.com
*/
#include <mega16.h>
#include <delay.h>
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
unsigned char rr=0;
while(rr<5)
{
PORTA=0x0f;delay_ms(100);
PORTA=0xf0;delay_ms(100);
++rr;
}
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
unsigned char dt=1;
// Input/Output Ports initialization
// Port A initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTA=0x00;
DDRA=0xFF;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: Off
// INT2: Off
GICR|=0x40;
MCUCR=0x03;
MCUCSR=0x00;
GIFR=0x40;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm(“sei”)
while (1)
{
// Place your code here
PORTA=dt;delay_ms(10);
dt=dt<<1;
if(dt==0){dt=0x01;}
};
}
Selamat mencoba