Home > Mikrokontroler, Tutorial > Interrupt AVR using WinAVR

Interrupt AVR using WinAVR

INTERRUPT

Sebuah Mikrokontroller tanpa dilengkapi dengan fasilitas interrupt dapat dikatakan mikrokontroller tersebut kurang berharga. Interrupt akan menghentikan sementara eksekusi dari jalannya program yang normal. Apabila terjadi interrupt, maka eksekusi program akan menuju ke program interrupt, setelah selesai maka eksekusi program akan kembali ke program semula. Interupt sangat dibutuhkan dalam permrograman karena dengan interrupt kita dapat mengontrol suatu kejadian di luar system. Tanpa interrupt kita dapat mengecek sutau kondisi menggunkan loopin, teknik ini dinamakan polling. Tapi polling memiliki beberapa kekurangan diantaranya kita tidak bisa melakukan pekerjaan lain selama kita melakukan pengecekan ataupun jika dimungkinkan pgrogram akan sangat panjang.

Jika terjadi suatu interrupt, maka eksekusi program akan emnuju ke program interrupt yang ditunjukkan dengan vector interrupt. Setiap mikrokontroller meiliki beberapa fasilitas interrupt sehingga tiap-tiap interrupt memiliki vector interrupt yang berbeda-beda. Vector interrupt merupakan alamat dimana program interrupt harus ditempatkan agar dapat dieksekusi dengan benar. Umumnya alamat antar vector interuput hanya berjarak 1 byte sehingga apabila program interrupt yang dibuat sangat panjang akan mengganggu vector intruupt yang lain. Untuk mengatsai hal tersebut dalam pembuatan program akan dilompatkan ke label dimana program interrupt tersebut disediakan. Pada mikrokontroller ATMega8 jenis-jenis interrupt beserta alamat vector interrupt dapat dilihat di datasheet ATMega8.

Alamat vector reset dan vector interrupt dapat dirubah-rubah sesuai dengan keinginan kita dengan cara mengubah BOOTRTS dan IVSEL. BOOTRST dapat dirubah melalui program downloader yang digunakan. Kalo menggunakan PonyProg2000 dapat melaui sekuriti konfigurasi.Sedangkan untuk mengkonfigurasi IVSEL dapat dilakukan pada regiser GICR. Adapun keterangan dari dua bit GICR adalah sebagai berikut:

· BIT 1 – IVSEL : Interrupt Vector Select

Ketika di set nol, interrupt vector akan ditempatkan di awal Flash memory. Jika di set satu, interrupt vector akan dipindahkan di awal Boot Loader dari flash. Alamat dari Boot Flash dapat ditentukan dari BOOTSZ Fuses. Konfigurasi dari BOOTSZ dapat dilihat dalam tabel dibawah ini

· BIT 0 – IVCE : Interrupt Vector Enable

Bit ini harus di set satu agar perubahan pada IVSEL dapat diaktivkan. IVCE akan di nolkan oleh hardware untuk 4 cycle setelah IVSEL di tulis. Setting IVCE akan menonaktifkan interrupt.

Ketika power off atau reset maka program akan menuju ke alamat $000 untuk menjalankan program reset. Pada bahasa C program akan menuju ke fungsi main(). Pada C untuk dapat mengakses interrupt diperlukan sebuah library interrupt.h adapun penuisannya sebagai berikut :

#include <avr/interrupt.h>

Semua program interrupt dapat dideskripsikan menggunakan macro command ISR(), seperti

ISR(ADC_vect)

{

//program yang akan ditulis

}

Jika pada vector interrupt tidak terdapat program yang akan dieksekusi maka cukup ditulis “reti”, dalam bahasa C cukup ditulis dengan

EMPTY_INTERRUPT(ADC_vect)

Contoh:

#include <avr\io.h>

#include <avr\iom8.h>

#include <avr\interrupt.h>

#define outp(a, b) b = a

#define inp(a) a

uint8_t led;

typedef unsigned char  u08;

ISR(INT0_vect) { /* signal handler for external interrupt int0 */

led =  0x01;

}

ISR(INT1_vect) {    /* signal handler for external interrupt int1 */

led =  0x00;

}

int main(void) {

outp(0x01, DDRB);      /* use PortB for output (LED) */

outp(0x00, DDRD);      /* use PortD for input (switches) */

outp((1<<INT0)|(1<<INT1), GIMSK); // enable external int0, int1

sei();       /* enable interrupts */

led =  0x01;

for (;;) {

outp(led, PORTB);

}                      /* loop forever */

}

Untuk versi awa dari WinAVR digunakan makro SIGNAL(), tapi sekarang mengguankan makro ISR() tidak ada yang lain. Satu hal lagi yang menarik adalah terdapatnya makro ISR_ALIAS(vector,target_vector). Makro ini digunakan untuk menangani multiple interrupt dengan implementasi tunggal.

ISR(INT0_vect)

{

PORTB = 42;

}

ISR_ALIAS(INT1_vect, INT0_vect);

🙂

Jabat Erat Selalu …. Belajar dan terus Belajar…

d_yat02@yahoo.com

Categories: Mikrokontroler, Tutorial
  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: