Senin, 27 Juni 2011

INTERUPSI EKSTERNAL AVR

Untuk Atmega8535 ada 3 sumber interupsi eksternal yaitu INT0 (PD2), INT1 (PD3) dan INT2 (PB2). Ketiga interupsi itu dapat dipicu dengan adanya perubahan level baik transisi naik (rising edge) maupun transisi turun (falling edge). Untuk pengaturan mode dan cara kerjainterupsi eksternal dilakukan melalui 2 buah register MCUCR dan register MCUCSR. Untuk lebis jelasnya tentang register-register tersebut lebih baik dibaca datasheetnya, silakan download datasheet ATmega8535 disini.. Tetapi tenang saja, jika menggunakan compiler CodeVision AVR, kita tidak perlu dituntut untuk tau tentang kedua register tersebut, karena secara otomatis CodeVision AVR akan mensettingnya saat kita menset CodeWizard AVR.

Disini saya akan coba membuat sebuah aplikasi dengan menggunakan 3 buah interupsi eksternal, yang cara kerjanya, jika tidak ada interupsi maka LCD akan menampilkan “tidak ada INT”, dan jika terjadi interupt eksternal maka LCD akan menampilkan “terjadi INT.X” selama 2 detik, nilai X sesuai dengan interupsi eksternal yang terjadi (INT0, INT1 atau INT2). Untuk pemicunya saya gunakan pushbutton.
Berikut adalah schematicnya dan setting pada CodeVision CodeWizard AVR:


Pada setting CodeWizard AVR diatas saya memilih Falling edge yang artinya interupsi ekternal akan terjadi jika ada perubahan level logika dari HIGH ke LOW. Dalam hal ini saat pushbutton tidak ditekan maka berlogika HIGH (5V) sedangkan saat ditekan berlogika LOW (GND).
Berikut adalah listing program lengkapnya:

#include <mega16.h>
#include <delay.h>

#asm
   .equ __lcd_port=0×15 ;PORTC
#endasm
#include <lcd.h>

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
        lcd_gotoxy(0,0);
        lcd_putsf(“ElectrO-cOntrOl”);
        lcd_gotoxy(0,1);
        lcd_putsf(“TERJADI INT.0″);
        delay_ms(2000);  
        lcd_clear();
}

// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
        lcd_gotoxy(0,0);
        lcd_putsf(“ElectrO-cOntrOl”);
        lcd_gotoxy(0,1);
        lcd_putsf(“TERJADI INT.1″);
        delay_ms(2000);
        lcd_clear();
}

// External Interrupt 2 service routine
interrupt [EXT_INT2] void ext_int2_isr(void)
{
        lcd_gotoxy(0,0);
        lcd_putsf(“ElectrO-cOntrOl”);
        lcd_gotoxy(0,1);
        lcd_putsf(“TERJADI INT.2″);
        delay_ms(2000);  
        lcd_clear();
}  

void main(void)
{
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: On
// INT1 Mode: Falling Edge
// INT2: On
// INT2 Mode: Falling Edge
GICR|=0xE0;
MCUCR=0x0A;
MCUCSR=0×00;
GIFR=0xE0;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0×00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0×80;
SFIOR=0×00;

// LCD module initialization
lcd_init(16);

// Global enable interrupts
#asm(“sei”)

while (1)
      {  
      lcd_gotoxy(0,0);
      lcd_putsf(“ElectrO-cOntrOl”);
      lcd_gotoxy(0,1);
      lcd_putsf(“TIDAK ADA INT”);
      };
}

Tidak ada komentar:

Posting Komentar