Selasa, 01 Maret 2016

Memahami Interrupt Microcontroller ATMega328

        Interrupt merupakan salah satu fasilitas yang sangat penting pada UC. Ada dua macam interrupt yaitu interrupt internal dan interrupt external. Pada kedua interrupt ini, UC melompat ke program interrupt vektor dari program utama. Setelah interrupt vektor dijalankan maka UC kembali ke program utama untuk melanjutkan perintah yang ditinggalkan. Contoh dalam kehidupan kita, bayangkan kita sedang bekerja didepan komputer mengerjakan tugas kampus. Ketika sedang mengerjakan tugas, HP kita berdering sehingga kita meninggalkan pengerjaan tugas kampus untuk menjawab panggilan HP. Setelah pembicaraan di HP selesai maka kita melanjutkan kembali untuk mengerjakan tugas kampus.
Interrupt eksternal terjadi karena perubahan keadaan (state) pada pin UC. Beberapa interrupt eksternal yaitu INT0, INT1, PCINT0 s/d PCINT23. Interrupt eksternal akan tetap terjadi jika Pin tersebut mendapat trigger meskipun disetting sebagai output. Interrupt internal terjadi karena telah dipenuhi suatu kondisi sehingga UC harus meninggalkan program utama untuk menuju interrupt vektor. Beberapa interrupt internal yaitu timer, compare, ADC, serial communication (USART Rx). Kesemua interrupt dapat dijalankan jika global interrupt enable bit dalam keadaan set dan sumber interrupt bit juga dalam keadaan set. Disini kita akan membahas interrupt eksternal karena interrupt internal akan dibahas pada masing masing topik.

Register Untuk mengaktifkan Interrupt Eksternal
EICRA – External Interrupt Control Register A
 
Bit 3, 2 – ISC11, ISC10: Interrupt Sense Control 1 Bit 1 and Bit 0
Kedua bit ini merasakan atau menkonfigurasi eksternal sinyal yang masuk ke Pin INT1 (kaki no. 5 pada UC ATMega328), seperti ditunjukkan pada table 12.1
Bit 1, 0 – ISC01, ISC00: Interrupt Sense Control 0 Bit 1 and Bit 0
Pada INT0 untuk mengkonfigurasi eksternal sinyal yang akan menyebabkan terjadinya interrupt diatur oleh bit ISC01 dan ISC00. Ditunjukkan pada table 12.2



EIMSK – External Interrupt Mask Register

 
    Bit 1 – INT1: External Interrupt Request 1 Enable
Jika bit ini di set dan global interrupt pada SREG juga dalam keadaan set maka pin interrupt eksternal INT1 menjadi enable. Perubahan state pada pin akan menyebabkan permintaan interrupt meskipun pin INT1 atau kaki no. 5 di konfigurasi sebagai output.
   Bit 0 – INT0: External Interrupt Request 0 Enable
Sama seperti bit 1 pada register EIMSK
Register terakhir pada INT0 interrupt dan INT1 interrupt adalah register EIFR (External Interrupt Flag Register)
 

Bit 1 – INTF1: External Interrupt Flag 1 dan Bit 0 – INTF0: External Interrupt Flag 0
Untuk mengaktifkan PCINT0 sampai PCINT23 maka kita perlu mengkonfigurasi register register yang terkait. Register register tersebut adalah :
  
PCICR – Pin Change Interrupt Control Register


Bit 2 - PCIE2: Pin Change Interrupt Enable 2, Jika bit ini diset, maka setiap perubahan pada pin PCINT23 s/d PCINT16 akan menghasilkan sebuah interrupt. Nama interrupt vektor dari pin pin adalah ISR(PCINT2_vect). Masing masing pin ini (PCINT23 s/d PCINT16) adalah di enable dari register PCMSK2.
Bit 1 - PCIE1: Pin Change Interrupt Enable 1. Jika bit ini diset, maka setiap perubahan pada pin PCINT14 s/d PCINT8 akan menghasilkan sebuah interrupt. Nama interrupt vektor dari pin pin adalah ISR(PCINT1_vect). Masing masing pin ini (PCINT14 s/d PCINT8) adalah di enable dari register PCMSK1.
Bit 0 - PCIE0: Pin Change Interrupt Enable 0, Jika bit ini diset, maka setiap perubahan pada pin PCINT7 s/d PCINT0 akan menghasilkan sebuah interrupt. Nama interrupt vektor dari pin pin adalah ISR(PCINT0_vect). Masing masing pin ini (PCINT7 s/d PCINT0) adalah di enable dari register PCMSK0.

PCIFR – Pin Change Interrupt Flag Register

Bit 2 - PCIF2: Pin Change Interrupt Flag 2, Bit 1 - PCIF1: Pin Change Interrupt Flag 1, dan Bit 0 - PCIF0: Pin Change Interrupt Flag 0 masing masing bersesuaian dengan PCIE2, PCIE1, PCIE0 yang terdapat pada register PCICR
 
 
 
Contoh program
# include <avr/io.h>
# include <avr/interrupt.h>

int main(void)
{
sei(); 
DDRB |=(1<<PINB5); // PINB5 sebagai output
DDRB &=~(1<<PINB7); // PINB7 sebagai PCINT7
PCMSK0 |=(1<<PCINT7); // mengaktifkan PINB7 sebagai PCINT7 hal. 74
PCICR |=(1<<PCIE0); // Sekarang PCINT7 sudah enable. Hal 73

while(1)
{
}
}

ISR(PCINT0_vect)
{
 
  
PORTB ^= 1<<PINB5; // PINB5 bersifat toggle
}

Tidak ada komentar:

Posting Komentar