Anda di halaman 1dari 4

Pengetahuan Dasar penggunaan Timer AVR dengan codevision

biasa kalau di program Codevision AVR disebut Delay_ms atau Delay_us kita akan membuat sendiri
mengunakan beberapa perhitungan yang ada. Kenapa harus buat sendiri? kan sudah ada fungsi delay_ms,
delay_us dll pada codevision AVR?? buat apa ribet-ribet buat gituan? pasti pada bilang gitu kan??
Berdasarkan pengalaman saya dalam penggunaan delay pada codevision AVR, biasanya terjadi perubahan
perhitungan delay jika tegangan batrai berkurang sehingga delay yang seharusnya 1000 ms tidak pas lagi
dengan aktualnya 1000 ms. dan itu saya rasa sangat menggangu dari proses kerja robot terutama dalam
perhitungan time sampling pada kontrol PID (pendapat saya sih) maaf jika salah
sehingga dari sinilah saya mencoba untuk sedikit mempersulit diri saya untuk mencoba membuat yang namanya
delay buatan atau waktu tunda buatan menggunakan fungsi timer yang ada pada chip Atmega. memangnya apa
bedanya dengan delay_ms bawaaan codevision AVR dengan program buatan mengunakan timer??
Menurut saya pribadi ya kalau kita menggunakan fungsi timer yang sudah di sediakan dalam chip
microcontroller atmega perhitungannya lebih pas karena tidak terpengaruh oleh jumlah catu daya yang sedang
ada sekarang karena pada delay yang akan kita buat ini akan memanfaatkan waktu dari frekuensi pada sistem
minimum kita sehinga tegangan tidak mempengaruhi. oke jika anda semua setuju dengan alasan saya ayo kita
lanjutkan ke proses pembuatannya oke pertama tama saya akan mengajarkan cara perhitungan untuk
mendapatkan nilai TCNT yang nantinya akan dimasukan pada value interrupt timer. Dengan asumsi anda semua
sudah mengerti dasar timer jika belum mengerti boleh tanya pada bagian komentar ya
Berikut ini adalah Rumus yang sudah saya sederhanakan untuk mencari nilai TCNT pada timer 16 bit.

TCNT=65536-(Ttunda/(1/freq.Osc * prescaler))
Untuk TCNT timer 8 bit.
TCNT=256-(Ttunda/(1/freq.osc*Prescaler))
NB : setelah nilai hasil perhitungan di dapat jangan lupa untuk di bulatkan keatas atau dibulatkan
kebawah nilai nya jika hasilnya pecahan kemudian jangan lupa untuk mengganti nilai desimal
tersebut menjadi hexadesimal.

berikut perhitungan untuk membuat delay mili second (ms) 1ms=0.001 s (ini Ttundanya) jadi untuk timer 16 bit
perhitungannya seperti berikut Pada contoh ini kita menggunakan Xtal 8Mhz (ini Freq.Osc nya).

CNT = 65536-(Ttunda/
(1/freq.osc*Prescaler))
TCNT = 65536-(0.001/
(1/8000000*1024))
TCNT = 65536-(0.001/0.000128)
TCNT = 65536-7.8125
TCNT = 65528.1875 (kita bulatkan ke
bawah)
TCNT = 65528 (konversikan ke

Kalau untuk timer 8 bit dengan hardware yang sama dengan diatas maka perhitungannya:
TCNT = 256-(Ttunda/
(1/freq.osc*Prescaler))
TCNT = 256-(0.001/
(1/8000000*1024))
TCNT = 256-(0.001/0.000128)
TCNT = 256-7.8125
TCNT = 248.1875 (kita bulatkan ke
bawah)
TCNT = 248 (konversikan ke
Oke maka dari perhitungan diatas kita sudah mendapat value untuk interrupt timer yang akan di
eksekusi setiap 1ms. Selanjutnya kita akan membuat programnya.

Buka Codevision AVR (bebas versi berapa).

Klik File > New (CTRL + N).

Pilih AT90,Attiny,Atmega > Klik OK.

pada tab Chip:


o Chip : AtMega 16 (misalkan mengunakan Atmega 16).
o Clock : 8 Mhz

Jika yang digunakan timer 8 bit seperti timer0 dan timer2 buat setting seperti pada gambar
dibawah ini.
Clock Value = 7.813 Khz (pilih yang paling bawah jika Precaler 1024)
Diberi tanda canteng pada Overflow Interrupt
timer value=f8 (dari hasil perhitungan TCNT).

NB : pilih salah satu saja mau timer 16 bit atau 8 bit

Pilih Program > Generate, Save and Exit(simpan file dengan 3 nama yang sama).

Berikut ini saya kasih contoh untuk program timer 8 bit (mengunakan timer0).

#include <mega16.h>

unsigned int x=0;


interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{ TCNT0=0xF8; x++; }
void tunda(unsigned int waktu)
{
TIMSK=0x01;
//inisialisasi untuk mengaktifkan interrupt timer0
while (x<waktu){} //padasaat nilai x lebih kecil dari waktu maka program diam.
x=0;
//jika nilai x lebih besar dari waktu maka nilai x reset jadi 0 (nol)
TIMSK=0x00;
//inisialisasi untuk menon aktifkan interrupt timer0
}
void main(void)
{
PORTA=0x00;
DDRA=0x03;

//setting PORTA.1 dan PORTA.2 sebagai output

TCCR0=0x05;
TCNT0=0xF8;
OCR0=0x00;

//setting timer0 dengan prescaler 1024


//nilai timer value dari hasil perhitungan timer 8 bit
//pin OCR0 tidak di aktifkan

TIMSK=0x01;
#asm(sei)

//inisialisasi untuk pengaktifan interrupt timer0


//variabel global interrupt

while (1)
{
PORTA.0=1; //led pada PORTA.0 aktif
tunda(1000); // tunda 1000ms
PORTA.0=0; //led pada PORTA.0 mati
tunda(1000); //tunda 1000ms
}
}
oke setelah itu silahkan upload program ke sistem minimum atmega 16 anda. dan coba pastikan
apakah program berjalan dengan benar.

Anda mungkin juga menyukai