Timing Mikrokontroller
Timing Mikrokontroller
Timer merupakan salah satu fasilitas yang dimiliki oleh mikrokontroler, yang berfungsi untuk membuat perhitungan waktu menyerupai real time (waktu sebenarnya). Sebelumnya kita mengenal perintah delay digunakan untuk menunda berdasarkan lamanya waktu, akan tetapi delay memiliki konfigurasi pengolahan waktu berdasarkan Kristal yang dipakai/dipasang. Apabila dengan konstanta delay yang sama (misal: delay_ms (1000);), digunakan pada dua rangkaian yang memiliki Kristal yang berbeda, maka akan menghasilkan waktu tundaan yang berbeda. Semakin besar Kristal yang digunakan, maka delay akan dikerjakan semakin cepat dan sebaliknya.
Timer merupakan teknik pemrograman yang menggunakan perintah interrupt agar selalu dikerjakan. Pada sebuah mikrokontroler keluarga AVR biasanya terdapat 3 buah macam timer atau lebih, yaitu Timer-0, Timer-1 dan Timer-2 yang memiliki keunggulan dan fungsi masing-masing.
Gambar Menu Timer Pada CodeWizardAVR
Timer-0, 8 Bit
Penggunaan fasilitas interrupt sebagai timer ditujukan agar setiap kali menjalankan instruksi program, akan dikerjakan pada blok interrupt timer. Penggunaan interrupt ini dipadukan dengan teknik dalam menghitung proses kerja pada sebuah sistem mikrokontroler. Besarnya kristal yang digunakan berpengaruh terhadap perhitungan akan banyaknya instruksi yang dikerjakan mikroprosesor dalam satu detik.
Contoh :
Sebuah sistem minimum mikrokontroler dengan menggunakan kristal 16MHz, berapa instruksi yang dapat dikerjakan mikrokontroler dalam waktu 1 detik?
Penyelesaian:
Mikroprosesor dalam mikrokontroler AVR memiliki Timer-0 dengan kecepatan data 8 bit, sehingga dapat dihitung kecepatan pengolahan instruksi per program tiap satu detik adalah :
Berikut pengaturan timer pada code wizard AVR :
Gambar Konfigurasi Timer-0
Secara sub program, pengaturan di atas menjadi seperti berikut :
Gambar Program Yang Digenerate Setelah Pengaturan
Guna memfungsikan Timer-0 sebagai waktu tunda suatu kerja program, maka dapat dituliskan seperti berikut ini :
#include <mega328p.h>
interrupt [TIM0_OVF] void timer0_ovf_isr(void){
unsigned int x;
x++;
if(x>62745){
…………….. (aksi yang dikerjakan setelah tunda 1 detik)
x=0;
}
}
void main(void){
……
TCCR0=0x01;
TCNT0=0x00;
……
}
Timer-1, 16 Bit
Selain timer 8 bit, mikrokontroler memiliki timer 16 bit yaitu pada timer-1. Secara ilustrasi pengaturan timer-1 pada code wizard AVR adalah sebagai berikut :
Gambar Konfigurasi Timer-1
Pada keterangan gambar di atas terdapat mode timer yang terdapat berbagai macam, diantaranya :
- Mode Normal : Untuk menghitung saja, membuat delay dan menghitung selang waktu
- Mode PWM, phase correct : Memberikan bentuk gelombang phase correct PWM resolusi tinggi
- CTC (Clear Timer on Compare Match) : membandingkan nilai TCNT dengan nilai register OCR, yang kemudian akan di-nol-kan
- Fast PWM : Memberikan pulsa PWM frekuensi tinggi
Sedangkan pada kolom value merupakan nilai TCNT yang akan digunakan sebagai nilai pembanding timer. Dalam istilah ini, guna mencari nilai besaran TCNT dikenal dengan nama Prescaler. Prescaler merupakan faktor penunda atau pembagi clock sesuai dengan kecepatan pada timer masing-masing. Timer-1 memiliki faktor prescaler 16 bit (1024), sehingga untuk menentukan besarnya nilai TCNT/Value dapat dirumuskan sebagai berikut :
Keterangan :
TCNT : Nilai timer (hexa)
fCLK : Frekuensi Clock (Crystal)
Ttimer : Waktu timer yang diinginkan (detik)
N : Prescaler (1, 8, 64, 256, atau 1024)
1 + FFFFh : Nilai maksimum timer (overflow saat FFFFh ke 0000h)
sehingga apabila diinginkan waktu timer-1 satu detik, nilai TCNT dapat dihitung sebagai berikut :
Sehingga nilai C2F7h digunakan sebagai nilai TCNT pada pengaturan CodeWizardAVR. Sebagai contoh, apabila diinginkan untuk membuat dua buah aksi yang berbeda dengan selang waktu 1 detik, dapat dituliskan sebagai berikut :
#include <mega328p.h>
bit fl_timer;
interrupt [TIM1_OVF] void timer1_ovf_isr(void){
// Reinitialize Timer1 value
TCNT1H=0xC2F7 >> 8;
TCNT1L=0xC2F7 & 0xff;
if(fl_timer==1){
………… (aksi ke-1 yang dikerjakan)
fl_timer=0;
}else{
………… (aksi ke-2 yang dikerjakan)
fl_timer=1;
}
}
void main(void){
fl_timer=0;
……
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0xC2;
TCNT1L=0xF7 ;
ICR1H=0x00;
…..
}
Timer-2, 8 Bit
Timer-2 juga merupakan timer 8 bit yang hampir mirip dengan timer-0. Pada timer-2 dapat digunakan rumus berikut untuk menentukan nilai pembanding dari TCNT :
Sehingga agar mencapai waktu 1 detik maka harus dikalikan 7812. Secara pengaturan codewizardAVR dapat diilustrasikan seperti berikut :
Gambar Konfigurasi Timer-2
Secara program dapat dituliskan seperti berikut :
#include <mega328p.h>
unsigned int x=0;
interrupt [TIM2_COMPA] void timer2_compa_isr(void)
// Place your code here
x++;
if(x=7812){
………. (aksi yang dikerjakan)
}
}
void main (void){
…..
ASSR=0x00;
TCCR2=0x02;
TCNT2=0x00;
OCR2=0xFE;
…….
}
0 Response to "Timing Mikrokontroller"
Post a Comment