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:
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.
-
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.
-
Interupt InternalInterrupt 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
b. Syarat Interrupt Agar bekerja
-
Global Interrupt di AktifkanSecara default, Arduino telah otomatis mengaktifkan global Interrupt. Jika anda tidak menggunakan Interrupt, maka anda harus mengaktifkan secara manual.
-
Individual Interrupt di AktifkanIni 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.
-
Kondisi Interrupt terpenuhiIni adalah kondisi pada program, seperti “Jika interrupt pada pin INT0 terjadi pada kondisi “Falling”, maka lakukan sesuatu””.
E. Progam Dasar Interrupt Akses Register
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.
- 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.
- Bit 1 (ISC01) bernilai 1
- Bit 0 (ISC00) bernilai 0.
Untuk mengaktifkan INT0 adalah menggunakan perintah:
void loop()
{
}
atau
void deteksi_tombol()
{
}
ISR(INT0_vect)
{
}
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
}