Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

Kamis, 03 Januari 2013

Interrupt - solusi eksekusi perintah real time

interrupt.jpg (537×694)


Secara harfiah interrupt dapat diartikan sebagai "pemecah" atau "penyelaan" dari suatu keadaan yang sedang berlangsung. Ya begitulah interrupt dapat diartikan seperti halnya interupsi pada sidang-sidang dewan di senayan. Jika di tarik kedalam proses suatu microcontroller maka interrupt merupakan suatu keadaan "menyela" dari program utama untuk masuk kedalam proses yg dikendalikan oleh interrupt itu sendiri. Ingat bahwa proses kerja dari microprosessor atau microcontroller adalah melakukan perintah sesuai script yang diberikan dari atas ke bawah. Jadi perhatikan proses membaca tombol berikut ini seperti yang dibahas pada project dasar input - output :


int main(void)

{

DDRB |= (1<<PB5)|(1<<PB0) ; //inisialisasi port B#5 & B#0 sebagai output
DDRB &= ~(1<<PB1) & ~(1<<PB2) ; //inisialisasi port B#1 & B#2 sebagai input

PORTB |= (1<<PB5) | (1<<PB0); //kita SET LED NYALA semuanya

while(1)
{

// membaca jika port input B#1 di set atau HIGH 
//  atau 1 ( posisi awal di ground /LOW )

if (bit_is_set(PINB, PINB1)) 
{
PORTB ^=(1<<PB5) ; //TOGGLE LED di PORT B#1
_delay_ms(500);

}

// membaca jika port input B#2 di set atau HIGH 
// atau 1 ( posisi awal di ground/LOW )

if (bit_is_set(PINB, PINB2)) 
{
PORTB ^=(1<<PB0) ; //TOGGLE LED di PORT B#2
_delay_ms(500);
 
}
}

return 0;
}

Script diatas merupakan perintah pembacaan tombol yang terdapat pada PORT B1 dan B2 yang akan mengendalikan nyala dari 2 buah LED pada PORT B0 dan B5. Perintah pembacaan tombol ini merupakan cara 'pooling' dimana terpadat proses IF yang menunggu sampi BIT dari tombol berubah dari 0 ke 1. Bagaimana jika scipt nya panjang semisal ada proses perhitungan yang panjang ? Yang akan terjadi adalah proses pembacaan tombol harus menunggu beberapa waktu sampai posisi akumulator dari processor berada tepat pada proses IF.

Solusi dari permasalahan pooling adalah dengan menciptakan suatu table interupt yang memiliki prioritas tertentu dan tentunya prioritasnya lebih dari proses pooling biasa. Interupt ada beberapa jenis tergantung fasilitas yang disediakan oleh microprocessor atau microcontroller. Interupt dapat di kendalikan oleh proses luar (input external) maupun internal. External interupt umumnya merupakan proses perubahan logika(logic) dari pin input (biasanya pin ditentukan sebagai pin INT). Jenis perubahan logika ini terdiri dari :

-  AKTIF HIGH  : interupt akan dieksekusi ketika pin input mendapat logika "1"
-  AKTIF LOW   : interupt akan dieksekusi ketika pin input mendapat logika "0"
-  RISING EDGE  : interupt akan dieksekusi ketika pin input berubah dari logika "0" ke logika "1"
-  FALLING EDGE  : interupt akan dieksekusi ketika pin input berubah dari logika "1" menuju logika "0"

Ada 2 buah istilah baru yaitu rising dan falling edge yang lebih menekankan ke perubahan logika dari input interupt. Hal ini lebih bermafaat dikarenakan umumnya proses interupt dieksekusi sekali saja. Semisal kita akan menunggu interupt dari suatu pulsa untuk menambah atau mengurangi suatu nilai variabel ,  sehingga hanya perubahan yang dikehendaki saja akan menambah nilai tersebut dan hebatnya akan ditambah hanya sekali saja dalam proses interuptnya.

Interrupt secara internal pada umumnya di trigger oleh suatu kondisi dari hasil eksekusi program dan contoh yang paling sering kita temui adalah interupt yang di trigger oleh proses timer.

Untuk ATTINY 2313 proses interrupt external dikendalikan oleh 2 buah INT0 dan INT1 serta interupt lainnya berupa Pin Change Interupt yang dapat dipasang diantara PINB 0-7. Register atau memory yang merupakan memory kontrol dari interupt attiny seperti berikut :
















Contoh script dari  inisialisasi interupt external pada attiny2313 adalah sebagai berikut :


int main(void)
{

   // aktifkan interrupt 0 dan 1
   GIMSK |= (1<<INT0) |(1<<INT1);
   
   // interrupt rising EDGE ( perubahan 0 ke 1) 
   MCUCR |= (1<<ISC01) | (1<<ISC00) |(1<<ISC11) | (1<<ISC10); 

   
sei();   // perintah bahwa interupt aktif / enable

while(1)

{

//looping tak berhingga

}

return 0;

}


Sedangkan perintah (susunan script) ketika interupt mendapat trigger dan berada pada posisi aktif ditempatkan dengan posisi seperti berikut :




SIGNAL (SIG_INT0)
{

// masukkan perintah eksekusi interupt di pin INT0  
    
}

SIGNAL (SIG_INT1)
{

// masukkan perintah eksekusi interupt di pin INT1  
    
}



Berikut akan ditampilkan contoh interupt internal yang ditrigger oleh timer. Proses timer dengan interrupt sangatlah akurat sehingga cocok dipakai untuk timer atau jam digital.




void init_jam(void)
{
   TCCR1B |= (1 << WGM12); // konfihurasi timer 1 mode CTC 
   TIMSK |= (1 << OCIE1A); // Enable CTC interrupt 
   OCR1A  = 31249; //nilai timer 1 detik dari CTC A 
   TCCR1B |= (1 << CS11)|(1 << CS10); // Start timer Fcpu/64
   TCNT1 = 0;
   
   sei();
}


ISR(TIMER1_COMPA_vect) // interupt internal dari timer akurat 1 detik

{ 

detik++;

if(detik >= 60)

{  
   detik=0;
   menit++;



}

if(menit >= 60)

     { menit=0; 
       jam++;
     }

if (jam >= 24) jam = 0 ;




}






SELAMAT MENCOBA
Share:

0 komentar:

Posting Komentar

Kontak Penulis



12179018.png (60×60)
+628155737755

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (12) antares (8) arduino (26) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (25) euro2020 (13) gcc (1) iklan (1) infrared (2) Input Output (3) iot (58) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (7) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (1) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (7) radio (25) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) transistor (2) troubleshoot (3) tulisan (93) tutorial (108) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika