Interrupt adalah suatu kejadian atau peristiwa yang menyebabkan mikrokontroler berhenti sejenak untuk melayani interrupt tersebut.
Yang harus diperhatikan untuk menguanakan interupsi adalah, kita harus tau sumber-sumber interupsi, vektor layanan interupsi dan yang terpenting rutin lyanan interupsi, yaitu subrutin yang akan dikerjakan bila terjadi interupsi .
Interrupt Service Routine.
Analoginya adalah sebagai berikut, seseorang sedang mengetik laporan, mendadak telephone berdering dan menginterrupsi orang tersebut sehingga menghentikan pekerjaan mengetik dan mengangkat telephone. Setelah pembicaraan telephone yang dalam hal ini adalah merupakan analogi dari Interrupt Service Routine selesai maka orang tersebut kembali meneruskan pekerjaanya mengetik. Demikian pula pada sistem mikrokontroler yang sedang menjalankan programnya, saat terjadi interrupt, program akan berhenti sesaat, melayani interrupt tersebut dengan menjalankan program yang berada pada alamat yang ditunjuk oleh vektor dari interrupt yang terjadi hingga selesai dan kembali meneruskan program yang terhenti oleh interrupt tadi. Seperti yang terlihat Gambar di bawah, sebuah program yang seharusnya berjalan terus lurus, tiba-tiba terjadi interrupt dan harus melayani interrupt tersebut terlebih dahulu hingga selesai sebelum ia kembali meneruskan pekerjaannya.
AVR menyediakan beberapa sumber interupsi yang berbeda. Tiap-tiap interupsi dan reset memiliki vektor program yang berbeda. Semua interupsi didasari satu bit tunggal yang harus diberi logika tinggi sebagai Global Interrupt Enable pada Status Register untuk mengaktifkan interupsi.
Atmega8535 menyediakan 21 macam sumber interupsi yang masing-masing memiliki alamata vektor interupsi seperti pada tabel 19. Setiap interupsi yang aktif akan dilayani segera setelah terjadi permintaan interupsi, tapi jika dalam waktu bersamaan terjadi lebih dari satu interupsi maka perioritas yang akan diselesaikan terlebih dahulu adalah interupsi yang memiliki urut lebih kecil sesuai tabel 19 berikut.
1. Percobaan Interupsi pada LED
Pada percobaan ini, dua buah interupsi yang dibangkitkan secara eksternal dari INT0 dan INT1 akan merubah kondisi LED yang terhubung pada PORTC. Bila terjadi interupsi pada INTO maka kondisil LED adalah : 11110000, sebaliknya bila terjadi interupsi pada INT1 maka kondisi LED adalah : 00001111.
#include <mega16a.h>
// External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { // Place your code here PORTC=0xF0; }
// External Interrupt 1 service routine interrupt [EXT_INT1] void ext_int1_isr(void) { // Place your code here PORTC=0x0F; }
void main(void) { // Declare your local variables here PORTA=0x00; DDRA=0x00; PORTB=0x00; DDRB=0x00; PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0x00;
// External Interrupt(s) initialization // INT0: On // INT0 Mode: Falling Edge // INT1: On // INT1 Mode: Falling Edge // INT2: Off GICR|=0xC0; MCUCR=0x0A; MCUCSR=0x00; GIFR=0xC0;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00;
// Global enable interrupts #asm("sei")
while (1) { // Place your code here } }