Penjelasan Interrupts Microcontroller Arduino Dasar

Posted on

Interrupts Microcontroller

Penjelasan Interrupts Microcontroller Dasar disertai Program – Hampir semua jenis microcontrollers, terdapat sebuah fitur yang disebut dengan Interrupts.

A. Apa arti dari Interrupts?

Secara bahasa, arti Interrupts adalah interupsi, menyela, memotong atau mengganggu.

Contoh:

Ibu guru sedang menerangkan sebuah pelajaran di depan murid-muridnya. Tanpa ada perintah untuk bertanya dari Ibu guru, tiba-tiba seorang murid mengangkat tangannya untuk bertanya.

Ibu guru pun menghentikan penjelasannya, kemudian menjawab pertanyaan si anak murid tersebut.

Setelah selesai menjawab, ibu guru melanjutkan untuk menerangkan pelajarannya kembali.

Nah, anak murid tersebut dikatakan telah melakukan interupsi saat ibu guru menerangkan pelajarannya.

Hal sama seperti mikrokontroller.

Mikrokontroller secara default akan membaca baris program satu persatu hingga akhir, kemudian melakukan loop untuk membaca program dari awal lagi dan seterusnya.

Proses membaca baris program disebut dengan Polling, alurnya adalah Setup dan Looping.

Ketika ada interrupt dari sebuah pin, maka mikrokontroller akan menghentikan proses pembacaan program dan melakukan hal yang diminta oleh pin nya (perhatikan gambar pada alur interrupt dibawah).

B. Mengapa Kita Butuh Interrupt?

Baik, adalah pertanyaan yang sangat banyak ditanyakan oleh pemrograman mikrokontroller pemula.

Kita ambil contoh beg:

Kita punya program untuk menghidupkan LED selama 1 detik dan mematikan LED selama 1 detik.

Pada program tersebut, kita menambahkan sebuah fungsi membaca tombol.

Kira-kira alurnya seperti :

Baca tombol -> LED ON -> tunggu 3 detik -> LED OFF -> tunggu 3 detik (loop) 

Nah, jika kita menekan tombol bertepatan pada delay ke 500ms saat LED ON, maka si mikrokontroller akan membaca tombol setelah delay ke 5500ms, karena menunggu delay dari LED OFF. 

Tentu akan membuat mikrokontroller menunda pemberian jawaban ketika tombol di tekan. 

Maka dari itu, kita harus menggunakan Interrupt.

Ketika tombol telah menggunakan sistem interrupt dan tombol ditekan bertepatan pada delay ke 500ms saat LED ON, maka mikrokontroller akan mengentikan pembacaan programnya saat itu juga dan langsung memberikan jawaban dari tombol ditekan tersebut.

C. Alur Interrupt pada Microcontroller

Sistem Interrupt berada pada register ISR (Interrupt Status Register). Jika anda belum mengetahui apa itu Register, silahkan baca Penjelasan Register Mikrokontroller.

Untuk membuat sebuah program interrupt, kita harus memahami apa itu Interrupt Service Routine (ISR). 

Interrupt Service Routine (ISR) tidak sama dengan Interrupt Status Register (ISR) !

Interrupt Service Routine adalah spesial function yang berisi program tertentu.

Alur Interrupt dapat kita ilustrasikan seperti pada gambar berikut:

Penjelasan Interrupts Microcontroller Dasar

Contoh alur diatas, dapat kita gambarkan dengan kondisi sebagai berikut:

Kita asumsikan ada dua LED yang digunakan, satu untuk program Blink (hidup mati) dan satunya lagi untuk interrupt.

Blok Loop {}, berisi program yang terus menerus menghidupkan LED Blink selama 3 detik dan mematikan LED Blink selama 3 detik.

Blok Interrupt Service Routine, berisi perintah menghidupkan LED Interrupt dan mematikan LED Blink.

Sebuah tombol Interrupt digunakan untuk mentrigger register interrupt.

Ketika tombol interrupt tidak di tekan, maka mikrokontroller akan terus membaca program yang berada pada blok loop().

Ketika tombol interrupt di tekan, maka pembacaan program akan beralih ke blok Interrupt Service Routine dan menghidupkan LED Interrupt dan mematikan LED Blink, setelah itu pembacaan program kembali ke loop().

D. Alamat register Interrupt

Kita sudah tahu bahwa sebuah register tertentu memiliki sebuah alamat yang dapat diakses. Begitu juga dengan Interrupt. 

Dari datasheet ATmega328, berikut adalah alamat dari semua interrupt yang ada pada ATmega328.

Penjelasan Interrupts Microcontroller Dasar
Berdasarkan gambar alamat register interrupt diatas, sumber interrupt yang ada pada mikrokontroller ATMega328 itu sendiri terbagi atas 2 yaitu:
  1. Interrupt Eksternal.
    Interrupt menggunakan pin mikrokontroller. Pada mikrokontroller ATmega328, ada 3 interrupt atau ada 3 pin Interrupt.

    1 Adalah RESET, 2 lagi adalah interrupt yang diberi nama INT0 dan INT1.

  2. Interupt Internal
    Interrupt Internal adalah tipe interrupt yang dapat dimanipulasi melalui program seperti WatchDog Interrupt, Timer/Counter Interrupt, Komunikasi SPI, Komunikasi Serial, ADC, EEPROM, dan Analog Comparator.

a. Pin Interrupt Pada ATMega328

Pin yang digunakan untuk interrupt adalah pin PD2 (INT0) dan PD3 (INT1). Perhatikan pinout ATMega328 berikut:
Penjelasan Interrupts Microcontroller Dasar

b. Syarat Interrupt Agar bekerja

Namun harus ada  3 syarat yang harus terpenuhi agar interrupt dapat bekerja, diantaranya:
  1. Global Interrupt di Aktifkan
    Secara default, Arduino telah otomatis mengaktifkan global Interrupt. Jika anda tidak menggunakan Interrupt, maka anda harus mengaktifkan secara manual.
  2. Individual Interrupt di Aktifkan
    Ini maksudnya, kita harus mengaktifkan interrupt dengan mengatur bit-bit register melalui alamat-alamt interrupt itu sendiri. Misalnya kita ingin menggunakan INT0, maka kita harus atur register yang berkaitan dengan INT0.
  3. Kondisi Interrupt terpenuhi
    Ini adalah kondisi pada program, seperti “Jika interrupt pada pin INT0  terjadi pada kondisi “Falling”, maka lakukan sesuatu””.

E. Progam Dasar Interrupt Akses Register

Kita telah mengetahui syarat agar interrupt dapat digunakan, global interrupt aktif, individual interrupt aktif dan kondisi terpenuhi. 
Pada ATmega328, Pengaturan Global Interrupt terletak pada register “Status Register” (lihat datasheet, halaman 27), perhatikan gambar berikut:
Penjelasan Interrupts Microcontroller Dasar + Progam

Cara aktifkan global interrupt adalah:
>> sei();
Jika anda butuh untuk mematikan global interrupt, maka perintahnya adalah:
>> cli();
Setelah global Interrupt di aktifkan, maka selanjutnya kita akan mengaktifkan Individual Interrupt. 
Nah, dis kita harus menentukan saat kondisi pulsa seperti apa interrupt dideteksi.
Ada 4 kondisi pulsa yaitu LOW, HIGH, RISING dan FALLING. Perhatikan gambar berikut:
rising falling high low pulse
Setelah kita menentukan kondisi pulsa yang ingin kita gunakan, maka kita harus mengatur kondisi pulsa tersebut pada sebuah “Interrupt Control Register A”.
Jadi, dalam Individual Interrupt, ada 2 register lagi yang kita gunakan, pertama register untuk mendeteksi trigger Interrupt dan kedua register untuk mengaktifkan interrupt itu sendiri.
Register trigger interrupt akan membaca kondisi pulsa pada Pin Interrupt. Register memiliki nama EICRA (baca datasheet, halaman 89).
Sedangkan register untuk mengaktifkan Interrupt memiliki nama Register EIMSK (lihat datasheet halaman 90).
Mari kita lihat register EICRA terlebih dahulu untuk mengetahui pengaturan dalam penggunaanya. Perhatikan gambar berikut:
Penjelasan Interrupts Microcontroller Dasar + Progam
Bit 1 & 0 untuk INT0.
Bit 3 & 2 untuk INT1.
Bit 0 diberi nama ISC00
Bit 1 diberi nama ISC01
Bit 2 diberi nama ISC10
Bit 3 diberi nama ISC11

Kondisi Bit 1 & 0 untuk INT0:

  • Jika 00 artinya  INT0 yang rendah menghasilkan permintaan inte
    rupsi.
  • Jika 01 artinya Setiap perubahan logis pada INT0 menghasilkan permintaan interupsi.
  • Jika 10 artinya Kondisi “Falling Edge” dari INT0 menghasilkan permintaan interupsi
  • Jika 11 artinya Kondisi “Rising Edge” dari INT0 menghasilkan permintaan interupsi.
Kondisi Bit 3 & 2 untuk INT1:
  • Jika 00 artinya Level INT1 yang rendah menghasilkan permintaan interupsi.
  • Jika 01 artinya Setiap perubahan logis pada INT1 menghasilkan permintaan interupsi.
  • Jika 10 artinya Kondisi “Falling Edge” dari INT1 menghasilkan permintaan interupsi
  • Jika 11 artinya Kondisi “Rising Edge” dari INT1 menghasilkan permintaan interupsi.
Dalam contoh program pada tutorial kita akan menggunakan Interrupt INT0 dengan kondisi pulsa Falling Edge.
Maka dari itu, kita harus mengatur bit ke-1 & ke-0 pada register EICRA dengan nilai:
  • Bit 1 (ISC01) bernilai 1
  • Bit 0 (ISC00) bernilai 0.
Cara menetapkan nilai bit  adalah:
>> EICRA    |=    (1 << ISC01);       //set bit ke-1 dengan nilai 1
>> EICRA  &= ~(1 <<  ISC00);      //set bit ke-0 dengan nilai 0
Kemudian, setelah kita menentukan kondisi pulsa, maka langkah akhir adalah mengaktifkan Indiviual Interrupt itu sendiri.
Untuk mengaktifkannya, kita menggunakan Register EIMSK.
Penjelasan Interrupts Microcontroller Dasar + Progam

Untuk mengaktifkan INT0 adalah menggunakan perintah:

>> EIMSK |= (1 << INT0);
 
Setelah semua 2 syarat diatas terpenuhi, maka syarat ke 3 adalah menentukan kondisi Interrupt.
Didalam progam yang umum arduino, compiler akan menjalankan pekerjaan tertentu menggunakan sebuah fungsi, seperti:

void loop()
{
}

atau

void deteksi_tombol()
{
}
Namun, ketika anda menggunakan Interrupt, maka fungsi dari interrupt itu ditulis menjadi:

ISR(INT0_vect)
{
}
Fungsi ISR() {} akan memberitahukan compiler bahwa jalankan Interrupt Service Routine jika ada interrupt pada pin INT0.
Baik, berikut akan kita contohkan dalam program yang nyata. Kita akan membuat program LED hidup  selama 3 detik dan LED mati selama 3 detik. Ini kita asumsikan namaya adalah LED Blink dan terkoneksi ke pin 0 pada PORTD.
Lalu, kita tambahkan sebuah LED ke pin 1 pada PORTD. Kita beri nama LED Interrupt.
Juga kita akan menghubungkan sebuah tombol ke pin INT0, tepatnya ke pin ke 2 pada.PORTD.
Ketika tombol interrupt ditekan, maka mikrokontroller akan mematikan LED Blink dan Menghidupkan LED Interrupt. Setelah itu program akan menghidupkan kembali LED Blink.
Progamnya adalah:

void setup() 
{
//set pin 1 and 3 of PORTD to OUTPUT
DDRD = B00000011;

//Falling Edge INT0 Generate
EICRA |= (1 << ISC01);
EICRA |= (1 << ISC00);

//Enable Interrupt for INT0
EIMSK |= (1 << INT0);

//Enable global interrupt
sei();
}

void loop()
{
PORTD = B00000001; //led blink hidup
delay(3000);
PORTD = B00000000; //led blink padam
delay(3000);
}

ISR(INT0_vect)
{
PORTD = B00000010; //led interrupt hidup
}
Penjelasan Interrupts Microcontroller Dasar

Sekian. Semoga bermanfaat.