Timer pada mikrokontroler AVR

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 0x0000

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

5 Balasan ke Timer pada mikrokontroler AVR

  1. ariefff mengatakan:

    wah kayaknya programnya diatas hampir sama dengan yang ada di buku karangan Mr. Lingga Wardana… xixixixixi… punya contoh program yang penggunaan timer /counter 0 dan timer/counter 2 ga???

    ya, namanya juga temen main di lab dulu, jadi ya source code pastinya copy paste, hahahaha. untuk timer yang lain tinggal seting register aja kok

  2. aku mengatakan:

    menghitung selang waktu menggunakan timer gmn???

    tinggal membaca suatu kondisi, dan ketika kondisi tersebut telah terpenuhi maka timer di aktifkan, kemudian menunggu sampai kondisi tersebut selesai. setelah selesai maka timer dimatikan kemudian baca nilai dari register TCNT1L dan TCNT1H. Nilai timernya dibuat count up

  3. Ridho mengatakan:

    lam kenal. ada listing timer menggunakan bahasa BASCOM nggak ?

    lam kenal juga, wah sori bro, gak punya source code untuk bahasa basic

  4. qq mengatakan:

    ass..bang….

    boleh minta contoh listing program assembly atmega8535…apa az?

  5. gurum mengatakan:

    bro.. gw nyoba ngitung waktu tapi ordenya kecil banget, 0,1 uS. dah nyoba pake program avr evaluation. tapi kok pada kacau. bisa kasih penjelasan umum.. thanks

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: