Interupsi Pada Mikrokontroler AVR ATMEGA32

robotics-university.com | Interupsi adalah proses dalam sistem mikrokontroler yang menghentikan aliran program utama akibat terjadinya (event) trigger (pemicu) tertentu dari suatu sumber (vector) interupsi dan memaksa sistem mikrokontroler untuk mengeksekusi sub-rutin/fungsi/blok program layanan interupsi (interrupt service routine, ISR) hingga selesai (complete). Setelah program interupsi selesai dikerjakan, maka sistem mikrokontroler akan kembali melanjutkan program utama yang sebelumnya dihentikan. Gambar 1 menunjukkan ilustrasi sebuah proses interupsi program.


Gambar 1. Proses interupsi program

A. Sumber (Vektor) Interupsi
Pada sebuah komponen embedded systems seperti mikrokontroler, memiliki 2 jenis sumber interupsi, yaitu:
  1. Interupsi internal
    Sumber (vektor) interupsi yang berasal dari dalam sistem mikrokontroler itu sendiri.
  2. Interupsi eksternal
    Sumber interupsi yang berasal dari luar sistem mikrokontroler.
Pada mikrokontroler AVR ATMEG32 memiliki variasi sumber interupsi. Berikut ini adalah daftar vektor intrupsi pada mikrokontroler AVR ATMEGA32:

Tabel 1. Sumber (vektor) interupsi mikrokontroler AVR ATMEGA32


B. Aktivasi Interupsi Pada AVR MEGA


Proses aktivasi interupsi pada mikrokontroler AVR ATMEGA32 akan melibatkan register SREG, yaitu bit I, di mana pada bit ke-7 register SREG tersebut merupakan global interrupt enableI. Bit-I berfungsi untuk mengaktifkan semua (global) interupsi. Dalam program, aktivasi bit-I dilakukan dengan instruksi:
  1. Dalam bahasa assembler
    sei - untuk mengaktifkan interupsi
    cli - untuk menonaktifkan interupsi
  2. Dalam bahasa BASIC (platform IDE BASCOM-AVR)
    Enable Interrupts - mengaktifkan interupsi supaya terjadi.

  3. Dalam bahasa C (platform IDE winAVR)
    sei (); - untuk mengaktifkan interupsi (set bit-I)
    cli (); - untuk menonaktifkan interupsi (clear bit-I)
C. Prioritas Interupsi
Tabel vektor (sumber interupsi) interupsi pada tabel 1 di atas menunjukan urutan tingkat prioritas interupsi. Prioritas 1 merupakan prioritas tertinggi sedangkan prioritas 21 merupakan prioritas terendah. Jika terjadi kejadian (event) interupsi secara bersamaan, maka urutan prioritas tertinggi akan didahulukan penanganannya. Sedangkan interupsi prioritas di bawahnya akan ditangani setelah penanganan interupsi prioritas yang lebih tinggi selesai. Saat terjadi interupsi, bit-I dalam SREG otomatis clear (0) hingga penanganan interupsi yang sedang terjadi selesai, kemudian bit-I akan secara otomatis kembali set (1).

D. Interupsi Internal
Seperti penulis sampaikan sebelumnya, Interupsi internal adalah sumber (vektor) interupsi yang berasal dari dalam sistem mikrokontroler itu sendiri. Berikut ini adalah cara/prosedur penangannan interupsi internal menggunakan bahasa C (pada platform IDE WinAVR) dan bahasa BASIC (pada platform IDE BASCOM-AVR).

1. Prosedur Penanganan Interupsi Internal menggunakan IDE WinAVR
Untuk menangani interupsi internal dalam bahasa C menggunakan WinAVR perlu dilakukan prosedur berikut:

Prosedur 1: Memanggil file header (*.h) interupsi dalam program.
File header (*.h) interupsi telah disediakan di dalam library winAVR, sehingga dalam program tinggal kita panggil file tersebut dengan menuliskan perintah berikut:
#include <avr/interrupt.h>
Prosedur 2: Mengaktifkan interupsi secara global.
Cara mengaktifkan (enable) seluruh interupsi dapat dilakukan dengan menuliskan perintah sei () di dalam program. Instruksi sei () akan men-set bit-I pada register SREG untuk mengaktifkan seluruh interupsi.

Prosedur 3: Menyiapkan fungsi/rutin layanan interupsi.
Apabila menggunakan fitur interupsi untuk suatu tujuan tertentu, maka di dalam program harus disiapkan sebuah fungsi/rutin yang akan dikerjakan ketika ada peristiwa (event) yang memicu terjadinya interupsi program utama. Rutin/fungsi tersebut sering disebut dengan fungsi layanan interupsi (ISR = interrupt service routine). Program ISR menggunakan bahasa C dapat ditulis dengan struktur sebagai berikut:
ISR(nama_vektorInterupsi)
{
   ……… program yang akan dijalankan ketika
   ……… terjadi interupsi
}
2. Prosedur Penanganan Interupsi Internal menggunakan IDE BASCOM-AVR
Untuk menangani interupsi menggunakan bahasa BASIC pada IDE BASCOM-AVR, dapat dilakukan dengan mengukuti prosedur berikut:

Prosedur 1: Mengaktifkan interupsi secara global.
Cara mengaktifkan (enable) seluruh interupsi dapat dilakukan dengan menuliskan perintah Enable Interrupts di dalam program. Instruksi Enable Interrupts akan men-set bit-I pada register SREG untuk mengaktifkan seluruh interupsi. Berikut ini adalah penulisan instrukai program interupsi menggunakan bahasa BASIC selengkapnya:
Enable Interrupts
Enable nama_vector_interupsi
On nama_vector_interupsi Label_ISR Nosave
Prosedur 2: Menyiapkan fungsi/rutin layanan interupsi.
Seperti halnya dalam bahasa C (lihat prosedur aktivasi interupsi menggunakan bahasa C di atas), apabila menggunakan fitur interupsi untuk suatu tujuan tertentu, maka di dalam program harus disiapkan sebuah fungsi/rutin (ISR) yang akan dikerjakan ketika ada peristiwa (event) yang memicu terjadinya interupsi program utama. Program ISR dengan bahwa BASIC dapat ditulis dengan membuat “Label_ISR” yang ditulis seperti dalam pembuatan label sub-rutin biasa:
Label_ISR:
If kondisi Then
……………
……………
Return ‘Tulis RETURN karena di dalam kalang If-Then
End If

‘Akhiri dengan penulisan 2 instruksi RETURN
Return ‘Tulis RETURN pertama
Return ‘Tulis RETURN kedua untuk kembali ke program utama
E. Contoh Program Penanganan Interupsi Internal
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
unsigned char led=0xFE; //nilai awal "led"
unsigned char arah=0x00; //nilai awal "arah"

ISR(TIMER0_OVF_vect)
{
  TCNT0=0x00; //nilai awal cacahan
  switch(arah)
  {
    case 0x00:
           {
             led<<=1; led = led|0x01;
             if(led==0xFF)
               {
                  arah=0xFF; led=0xBF; //0b10111111
               }
             PORTA=led; break;
           }

    case 0xFF:
           {
             led>>=1; led|=0x80;
             if(led==0xFF)
               {
                  arah=0x00; led=0xFD; //0b11111101
               }
             PORTA=led; break;
           }
     }
}

void main(void)
{
   DDRA=0xFF; //portA sbg output
   PORTA=led; //keluarkan data ke port A

   //Pengaturan Timer0
   TCCR0=0x05;//Atur timer0
   TCNT0=0xDD;//Nilai cacahan Timer0
   TIMSK=0x01;//aktifkan interupsi timer 0
   TIFR=0x00;//hapus flag interrupt timer0
   sei ();//mengaktifkan interrupsi global

   while (1);//tunggu terjadinya interupsi
}

F. Interupsi Eksternal
Seperti penulis sampaikan sebelumnya, Interupsi eksternal adalah sumber interupsi yang berasal dari luar sistem mikrokontroler. Agar mikrokontroler dapat menerima sinyal interupsi eksternal, maka dibutuhkan jalur input interupsi eksternal. Jalur input interupsi eksternal adalah bagian mikrokontroler yang dapat mendeteksi adanya trigger dari luar sistem mikrokontroler yang membangkitkan tanda (flag) interupsi.

Mikrokontroler AVR ATMEGA32, memiliki 3 buah Jalur input interupsi eksternal, yaitu pin INT0 yang terhubung dengan PORTD.2, pin INT1 yang terhubung dengan PORTD.3, dan pin INT2 yang terhubung dengan PORTB.2. Lebih jelas, silakan mengamati gambar 2 berikut.



Gambar 2. Jalur input interupsi eksternal mikrokontroler AVR ATMEGA32

1. Register Interupsi Eksternal
Dalam penanganan interupsi eksternal akan melibatkan beberapa register I/O, yaitu:

a) MCU Control Register – MCUCR



Dalam register MCUCR terdapat 4-bit yang berhubungan dengan interupsi eksternal. Keempat bit tersebut berfungsi untuk menentukan/mendefinisikan jenis sinyal eksternal yang akan digunakan sebagai sinyal/trigger interupsi eksternal. Keempat bit tersebut adalah ISC00 & ISC01 yang berhubungan dengan pengaturan INT0 (lihat tabel 2) dan ISC10 & ISC11 yang berhubungan dengan pengaturan INT1 (lihat tabel 3).

Tabel 2. Kontrol trigger interupsi eksternal INT0



Tabel 3. Kontrol trigger interupsi eksternal INT1

b) MCU Control and Status Register – MCUCSR


Pada register MCUSR, hanya bit ISC2 (bit ke-6) yang berhubungan dengan pengaturan interupsi eksternal, yaitu digunakan untuk menentukan tipe transisi sinyal interupsi eksternal yang akan digunakan. Apakah falling, yaitu transisi sinyal interupsi dari logika 1 ke logika 0, atau rising, yaitu transisi sinyal interupsi dari logika 0 ke logika 1. Lihat tabel 4.

Tabel 4. Transisi sinyal interupsi eksternal


c) General Interrupt Control Register – GICR


Bit INT0/INT1/INT2 pada register GICR berfungsi untuk mengaktifkan dan menonaktifkan interupsi eksternal terkait, yaitu apabila bit INT0=INT1=INT2=0, maka interupsi eksternal nonaktif (disable) dan apabila bit INT0=INT1=INT2=1, maka interupsi eksternal aktif (enable).

d) General Interrupt Flag Register – GIFR


Bit INTF0/INTF1/INTF2 pada register GIFR berfungsi sebagai flag/penanda apabila ada sinyal interupsi eksternal pada pin INT0/INT1/INT2, yaitu ketika sistem mendeteksi sinyal interupsi eksternal pada pin INT0/INT1/INT2 maka bit INTF0, INTF1, INTF2 akan secara otomatis bernilai high (1). Sedangkan ketika CPU mengeksekusi interupsi eksternal pada pin INT0/INT1/INT2, maka bit INTF0, INTF1, INTF2 akan secara otomatis bernilai low (0).

2. Prosedur Penanganan Interupsi Eksternal
Prosedur penanganan interupsi eksternal tidaklah jauh berbeda dengan prosedur penanganan interupsi internal. Hanya ada perbedaan pada register yang perlu diatur nilai-nilainya. Berikut ini adalah prosedur-prosedur tersebut:

Prosedur 1:
Mendefinisikan sinyal input trigger yang akan digunakan dengan mengatur bit-bit register MCUCR dan/atau MCUCSR untuk INT2. Lihat tabel 2 dan tabel 3.

Prosedur 2:
Mengaktifkan (enable) jalur interupsi eksternal yang akan digunakan dengan mengatur bit-bit register GICR.

Prosedur 3:
Meng-enable seluruh interupsi dengan perintah sei () bila menggunakan bahasa C. Apabila menggunakan bahasa BASIC dengan perintah Enable Interrupts.

Prosedur 4:
Membuat rutin layanan interupsi (ISR) yang akan dikerjakan jika terjadi interupsi eksternal dengan struktur sebagai berikut:

Menggunakan bahasa C:
ISR(nama_vektorInterupsiEksternal)
{
  …instruksi yang akan dijalankan
  jika terjadi interupsi
}
Menggunakan bahasa BASIC:
Label_ISR:
If kondisi Then
……………
……………
Return ‘Tulis RETURN karena di dalam kalang If-Then
End If

‘Akhiri dengan penulisan 2 instruksi RETURN
Return ‘Tulis RETURN pertama
Return ‘Tulis RETURN kedua untuk kembali ke program utama


Share on Google Plus

About Taufiq D.S. Suyadhi

    Blogger Comment
    Facebook Comment

0 comments:

Post a Comment