Interrupt Timer pembacaan sensor garis

Interrupt Timer sangat cocok digunakan untuk keperluan program yang berkerja mirip seperti multitasking dimana program seolah-olah berjalan bersamaan padahal tidak seperti itu. Analogi interrupt timer adalah saat sebuah program belum selesai dikerjakan register interrupt timer malakukan interupsi untuk mejalankan task sederhana lainnya kemudian kembali lagi ke program yang sebelumnya di interupsi, proses ini sangat cepat sehingga seolah olah program bekerja berbarengan.

Interrupt timer terjadi saat compare match antara register OCRnx dan register TCNTn. Saat compare match terjadi maka program memanggil sub program yang didefinisikan pada alamat vector interrupt tersebut. Anda dapat menggunakan interrupt timer dan PWM secara bersamaan pada penggunaan register Timer/Counter yang sama. 

Pada proyek ini menggunakan Timer/Counter 2 untuk menjalankan kode program yang ditulis pada vector interrupt. Semua sub program yang dipanggil oleh alamat interrupt bertujuan untuk mengecek kondisi pembacaan semua sensor grid line follower. Timer/Counter2 pada proyek ini bekerja pada 8 bit dan dengan penyetelan Timer/Counter2 lebih membantu dibanding dengan menuliskan sub program yang selalu dipanggil secara manual karena jika program utama cukup panjang, maka sub program  tersebut tidak dapat dipanggil lebih cepat karena harus menunggu semua task yang sebelumnya dieksekusi selesai dikerjakan.

Interrupt timer sangat berguna untuk melakukan pengecekan pembacaan sensor pada line follower, contoh : melakukan pengecekan pembacaan sensor garis agar linef ollower berjalan mengikuti garis putih, mengecek jumlah persimpangan yang dilewati (sensor counter line)
Gambar 1 menunjukan bit-bit pada register TCCR2A.
Register TCCR2A
Gambar 1. Register TCCR2A

Gambar 2 menunjukan bit-bit  pada register TCCR2B
Register TCCR2B
Gambar 2. Register TCCR2B

Proyek ini tidak melakukan penyetelan register TCCR2A karena tidak mengaktifkan PWM pada register ini, sehingga semua bit WGMnx dan COMnx pada register TCCR2A diabaikan.

Selanjutnya pada register TCCR2B dilakukan penyetelan pada bit CSnx berdasarkan Tabel 1 untuk menentukan frekuensi timer. Tabel 1 menunjukan opsi setelan bit bit untuk mengatur clock select. 

Tabel 1. Clock select bit description

Clock select bit description

Penyetelan register TCCR2B pada bit CS20 dan CS21 dengan men-set masing-masing bit dengan nilai 1 untuk mendapatkan frekuensi counting clk/32. Anda dapat menggunakan frekuensi yang lebih cepat seperti clk/8 atau clk/1, pada blog ini penulis menggunakan clk/32 bekerja dengan baik dan pembacaan sensor tidak bermasalah. 

Dari penjelasan di atas, penyetelan register timer TCCR2A dan timer mengaktifkan PWM sehingga dapat dituliskan sebagai berikut :

TCCR2B = 0b00000011; 
atau dapat ditulis menjadi 
TCCR2B = 0x03

Setelah melakukan konfigurasi register timer TCCR2B perlu melakukan penyetelan register TIMSK2 (Timer/Counter2 Interrupt Mask Register). Gambar 3 menunjukan bit-bit pada register TIMSK2.
Register TIMSK2
Gambar 3. Register TIMSK2

Penulis hanya mengaktifkan bit TOIE2 pada register TIMSK2 karena hanya menggunakan Timer/Counter2 overflow Interrupt dimana counter selalu menghitung dari 0 hingga 255 (bekerja pada 8 bit) setelah mencapai maksimum terjadi over flow dan interrupt pun terjadi. Proses tersebut selalu berjalan terus menerus.

Untuk menjalankan interrupt yang telah disetel adalah dengan menuliskan perintah 'sei ()'

Mengaktifkan interrupt timer 2
Berikut adalah cara penulisan program untuk mengaktifkan interrupt timer 2 :
TCCR2B =0b00000011; //Mengaktifkan timer dengan frekuensi clkio/32.
TIMSK2 = 0b00000001; //Mengaktifkan mode Timer/Counter2 overflow interrupt. 
sei (); //Menjalankan semua interrupt ynag telah diaktifkan.

Menuliskan sub program pada vector interrupt 
Setelah melakukan konfigurasi interrupt timer 2 mode overflow, hal yang perlu dilakukan kemudian adalah menuliskan sub program yang sering dipanggil pada vector interrupt. Pada proyek ini sub program yang ditulis pada vector interrupt adalah program untuk mengecek pembacaan sensor garis.

Penulisan program pada vector interrupt timer 2 cukup mudah dan dapat dilihat seperti di bawah ini :
ISR(TIMER_OVF_vect) // Vector interrupt timer 2 mode overflow
{
 dataSensor = bacaSensor();
 temp = digitalRead(sensor4);
 if (temp == 1)
  { 
      if (flipflop == 0)
       { 
           flipflop = 1 ;
           counter++ ;
       }
  }
if(temp == 0)
 filpflop = 0
}

Penulisan program di atas bertujuan agar program pembacaan sensor grid counter dieksekusi pada interrupt timer sehingga pembacaan sensor akan selalu dilakukan terus menerus saat tejadi interupsi timer dan tanpa harus menunggu program utama selesai dikerjakan.

EoF