RSS

INTERUPSI EKSTERNAL AVR

23 Apr

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 teman-teman baca datasheetnya. 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=0x15 ;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=0x00;
GIFR=0xE0;

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

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// 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”);
      };
}

 
2 Comments

Posted by on April 23, 2011 in Tutorial AVR

 

Tags: , , , , ,

2 responses to “INTERUPSI EKSTERNAL AVR

  1. Dadan M

    June 28, 2011 at 16:19

    Untuk membuat menu di LCD apakah menggunakan external interupt atau bisa dengan cara lain (menggunakan pin lain selain INT0,INT1 dan INT2. Mohon diberikan contoh. Terimakasih.

     
    • ElectrO-cOntrOl Team

      June 28, 2011 at 23:14

      bisa saja, pada beberapa aplikasi yg saya buat saya tidak menggunakan fitur INT. silakan liat beberapa project yg telah saya buat, contohnya project SIMPLE STOPWATCH

       

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: