Timer/Counter merupakan fitur di setiap mikrokontroler yang sangat banyak peranannya dalam perancangan sebuah sistem. Dengan sebuah timer kita bisa menunda suatu eksekusi dari suatu perintah, sehingga sistem mikrokontroler yang berjalan cepat (mungkin dalam orde nano atau mikro detik), dapat sinkron dengan operator (manusia). Dengan timer pula kita dapat menghitung lebar pulsa/frekuensi dari suatu sinyal, menghitung kecepatan jatuh suatu benda,atau kecepatan suatu kendaraan, dengan timer/counter kita dapat menghitung jumlah mobil yang lewat dalam jalan tol misalnya, dan ada lebih banyak lagi fungsi timer/counter dalam sebuah mikrokontroler.
Karena fungsinya yang relatif lebih banyak dalam suatu sistem, maka banyak vendor memasang timer dalam mikrokontroler tidak hanya satu, dengan panjang data yang tidak hanya 8 bit, tapi juga 16 bit. Dalam mikrokontroler AVR ada Timer 0 yang berkapasitas 8 bit, dan Timer 1 yang berkapasitas 16 bit. Pada beberapa jenis AVR juga tersedia Timer2 yang berkapasitas 8 bit (misal ATMEGA8535). Timer pada mikrokontroler AVR lebih leluasa dalam pengendalian lebar waktu yang digunakan untuk menyelesaikan nilai timer, karena pada mikrokontroler AVR tersedia prescaller, sehingga kita dapat menggunakan timer untuk tunda dari orde milidetik sampai dengan menit (tanpa menggunakan register serba guna), tidak seperti mikrokontroler MCS51 yang sumber internal timer berasal dari osilatornya. Untuk mengaktifkan suatu Timer kita harus mengeset register2 yang berhubungan dengan TImer. Misalkan kita ingin menggunakan Timer 1. Maka register2 pada timer 1 harus diset sesuai dengan mode yang kita inginkan.Timer 1 adalah timer 16 bit yang memungkinkan program pewaktuan berjalan dengan lebih akurat. Fitur yang ada pada timer ini adalah:
* Desain 16 bit (Juga memungkinkan 16 bit PWM)
* Dua buah compare unit
* Dua buah register pembanding
* Satu buah input capture unit
* Timer di-nol-kan saat match compare (auto reload)
* Dapat menghasilkan gelombang PWM dengan glitch-free
* Periode PWM yang dapat diubah-ubah
* Pembangkit frekuensi
* Empat buah suber interupsi (TOV1, OCF1A, OCF1B dan ICF1)
Pengaturan Timer 1 dilakukan melalui register TCCR1A dan TCCR1B (untuk lebih jelas mengenai isi dari isi register tersebut disarankan untuk membaca datasheet dari mikrokontroler yang bersangkutan). Selain dua register diatas (TCCR1A dan TCCR1B) ada juga register TIMSK yang digunakan untuk mengaktifkan interupsi2 yang berhubungan dengan timer. Untuk memantau status atau kondisi dari timer yang sedang dijalankan dapat dilakukan dengan mengakses register TIFR. Misalkan kita ingin membuat timer untuk menghasilkan tunda sebesar 1 detik dengan menggunakan sistem minimum yang menggunakan clock dengan kristal 11,0592 MHz, timer count up, dan dibaca saat overflow, maka kita harus mengeset terlebih dahulu prescaller yang ingin digunakan. Karena register yang digunakan untuk menampung nilai timer hanya sebesar 16 bit, maka nilai maksimum yang bisa ditampung adalah sebesar 65535. Jadi kita tidak bisa memasukkan nilai yang lebih besar dari 65535. Dengan kristal 11,0592MHz, maka untuk menghasilkan 1 detik dengan menggunakan nilai prescaller 1024, nilai timer yang dimasukkan adalah 11059200/1024=10800, bila menggunakan prescaller 256, maka nilai timer yang dimasukkan adalah 11059200/256=43200, bila menggunakan prescaller 128, maka nilai timer yang dimasukkan adalah 11059200/128=86400. Jadi dari perhitungan diatas nilai timer yang memungkinkan adalah timer dengan prescaller 1024 atau 256. Misal kita putuskan untuk menggunakan prescaller 1024, register yang akan kita isi untuk mengendalikan timer tersebut adalah:
Isi dari register TCCR1A=0B00000000 ($00)
Isi dari register TCCR1B=0b00000101 ($07)—–> CS2=1, CS1=0,CS0=1 (prescaller 1024)
Isi dari register TIMSK=$00 (tidak ada interupsi)
nilai timer sebesar 10800 akan dimasukkan kedalam 2 register yatu TCNT1H dan TCNT1L.
Berikut subroutine untuk timer 1 detik.
.equ timer_value1 = 10800
timer1d:
ldi r16, 0b00000100 ; aktifkan enable intrupt
out TIMSK, r16
ldi r16, high(-timer_value1) ;masukkan nilai timer
out TCNT1H, r16
ldi r16, low(-timer_value1)
out TCNT1L, r16
ldi r16, 0b00000101 ; masukkan prescaler untuk timer 1024
out TCCR1B, r16
looptimer2:
in r17,TIFR
sbrs r17,TOV1 ;tunggu sampai timer1 overflow flag set
rjmp looptimer2
ldi r16, 0b00000100 ;Timer 1 overflow flag dinolkan dengan out TIFR,r16 ;memberikan logika 1
ret
Pada potongan program diatas, sistem akan menunggu sampai timer overflow dengan membaca bit TOV1 pada register TIFR, dan bila sudah overflow maka timer akan dihentikan. Untuk menghentikan timer, dilakukan dengan memberi nilai satu pada bit TOV1 pada register TIFR.
Berikut contoh aplikasi timer tunda 1 detik untuk menyalakan lampu kedip2 dengan interval kedip 1 detik, dimana lampu led dihubungkan dengan port b pada mikrokontroler.
.include “m8515def.incâ€
.equ timer_value = 10800
.org 0×0000
rjmp main
main:
ldi r16, low(RAMEND)
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16
ldi r16,0xff
out ddrb,r16
out PORTB,r16 ;sebagai output LED
;————————————
;Program contoh untuk timer 1 detik
;lampu nyala mati (kedip-kedip)
;dalam interval 1 detik
;————————————
loop:
cbi portb,0
cbi portb,1
cbi portb,2
cbi portb,3
rcall timer1d
sbi portb,0
sbi portb,1
sbi portb,2
sbi portb,3
rcall timer1d
rjmp loop
timer1d:
ldi r16, 0b00000100 ; aktifkan enable intrupt
out TIMSK, r16
ldi r16, high(-timer_value) ;masukkan nilai timer
out TCNT1H, r16
ldi r16, low(-timer_value)
out TCNT1L, r16
ldi r16, 0b00000101 ; masukkan prescaler untuk timer
out TCCR1B,r16 ; disini 1024
looptimer:
in r17,TIFR
sbrs r17,TOV1 ;tunggu sampai timer1 overflow flag set
rjmp looptimer
ldi r16, 0b00000100 ;Timer 1 overflow flag dinolkan dengan
out TIFR,r16 ; memberikan logika 1
ret
2 Responses to “Timer pada mikrokontroler AVR”
emang gw pikirin,………….
EGP dong