MIKROPENGENDALI C TEMU 4 AVR TIMER AND COUNTER Oleh : Danny Kurnianto,S.T.,M.Eng Sekolah Tinggi Teknologi Telematika Telkom
PENDAHULUAN Pada mikropengendali terdapat register Timer/Counter yang berfungsi untuk menghitung suatu even dari luar (Counter) atau menghasilkan waktu tunda (Timer). Untuk menghitung suatu even dari luar, maka pin clock dari Register Counter harus dihubungkan dengan sumber even luar. Saat even terjadi, isi counter akan naik sesuai dengan jumlah even yang terjadi. Sehingga isi counter merepresentasikan berapa jumlah even yang telah terjadi
Jika register counter/timer difungsikan sebagai penghitung waktu tunda (timer) maka pin clock pada counter harus dihubungkan ke osilator. Saat osilator berdetak, maka isi counter akan naik sesuai dengan detak dari osilator. Isi register counter merepresentasikan berapa banyak detak yang telah terjadi dihitung dari waktu awal counter di reset (clear). Jika kecepatan osilator dari mikropengendali diketahui, maka dapat dihitung periode detak dari timer. Misalkan jika digunakan osilator dg frekeunsi 1 MHz, maka periode detaknya adalah 1 us. Jika diinginkan waktu tunda sebesar 100 us, maka register counter di reset(clear) lalu menunggu isinya mencapai nilai 100.
Programming Timer 0,1 and 2 Pada AVR ATMEGA32 terdapat 3 Timer yaitu Timer 0,1 dan 2. Timer 0 dan 2 adalah 8 Bit Timer, sedangkan Timer 1 adalah 16 bit Timer. 16 Bit Timer 8 Bit Timer
Ada 3 register yang berperan saat kita menggunakan Timer, yaitu Register TCNT, TCCR, dan TIFR. TCNT = Timer/Counter Register TCCR = Timer/Counter Control Register TIFR = Timer/Counter Interupt Flag Register OCR = Output Compare Register Pada AVR ATMega 32 terdapat 3 register TCNT, yaitu TCNT0, TCNT1 dan TCNT2. Register TCNT berisi 0 (nol) jika di reset, dan isinya akan bertambah naik mengikuti detak pulsa. Register TCNT ini dapat ditulis maupun dibaca isinya dengan mengakses TCNTn.
Register TCCR (Timer/Counter Control Register) digunakan untuk mengatur mode operasi dari Timer. Pada Register TIFR (Timer/Counter Interupt Flag Register) terdapat flag TOVn (Timer Overflow) yang akan di set 1 saat timer overflow. Pada register OCRn (Output Compare Register), isi dari register OCR akan dibandingkan dengan isi Register TCNTn, dan jika sama maka flag OCF pada register TIFR akan di set 1.
1. Timer 0 Programing Timer 0 adalah Timer 8 Bit dengan registernya adala TCNT0. TCCR0 (Timer/Counter Control Register 0) TCCR0 adl register 8 bit yg digunakan untuk mengatur Timer 0.
FOC0 = Force Compare Match, bit ini hanya dapat ditulis saja yang digunakan untuk menghasilkan sinyal/gelombang. Menulis bit 1 pada FOC0 akan mengakibatkan generator sinyal bekerja. WGM00, WGM01 COM01, 00
CS02-00
Contoh : 1. 2
TIFR (Timer/Counter Interrupt Flag Register) Register TIFR berisi flag-flag Timer-timer yang berbeda. Yang akan dibahas adalah Flag TOV0 yang berhubungan dengan Timer 0.
TOV0 = flag ini akan di set 1 jika counter overflow, dari $FF ke $00. Flag ini di reset/clear dengan software.
Langkah-langkah memprogram Timer 0 pada mode Normal Untuk menghasilkan waktu tunda menggunakan Timer 0 pada mode normal, berikut langkah-langkah yang harus dilakukan. 1. Isi register TCNT0 dengan nilai awal. 2. Isi nilai pada register TCCR0, yang mengindikasikan mode timer yang digunakan (8 bit dan 16 bit) dan pilihan prescaler. 3. Tetap memonitor flag overflow timer (TOV0), jika TOV0 berlogika high, maka keluar dari looping. 4. Stop timer dengan memutuskan sumber clock dengan memberikan nilai $00 pada register TCCR0. 5. Reset / clear flag TOV0 untuk proses selanjutnya. 6. Kembali ke langkah 1 untuk mengisi nilai TCNT0 lagi.
Contoh : Isi register TCNT0 dengan nilai 0xF2. Jalankan Timer 0 Timer 0 akan menghitung mulai dari nilai 0xF2 sampai 0xFF. Saat nilai 0xFF berubah menjadi 0x00, maka Timer 0 Overflow dan flag TOV0 akan bernilai 1. Matikan timer 0. Reset flag TOV0 kembali (nilai 0 ).
Contoh : Hitunglah waktu tunda yang dihasilkan oleh Timer 0 jika menggunakan XTAL = 8 MHz. Asumsikan bahwa nilai awal adalah 0xF2. Jawab: Periode clock adalah 1/8 MHz = 0,125 us. Waktu tunda = jumlah cacah Timer 0 x 0,125 us. Jumlah cacah Timer 0 dapat dihitung dengan melihat nilai awal register TCNT0 sebesar 0xF2. Untuk mencapai nilai 0xFF, diperlukan sebanyak 13 kali cacah. Ditambah 1 kali cacah saat nilai berubah dari 0xFF menjadi 0x00. Sehingga waktu tunda adalah 14 x 0,125 us = 1,75 us.
Menentukan Nilai Pada Register TCNT0 Jika kita sudah mengetahui besarnya waktu tunda yang dikehendaki, lalu bagaimana caranya menentukan nilai yang harus diisikan pada register TCNT0?. Berikut langkahlangkahnya. 1. Tentukan terlebih dahulua periode clock timer yang digunakan. 2. Bagi waktu tunda yang diinginkan dengan Tclock Untuk mengetahui berapa banyak clock yan dibutuhkan. 3. Lakuan pengurangan 256 n, dimana n adalah nilai desimal yang diperoleh dari langkah nomor 2. 4. Konversi hasil dari nomor 3 ke heksadesimal (hex), lalu diisikan ke register TCNT0.
Prescaler dan Waktu Tunda Yang Lebih Besar Besarnya waktu tunda tergantung dari 2 faktor yaitu frekuensi kristal dan register timer 8 bit. Jika pada kondisi Timer 0 tanpa Prescaler dan nilai register TCNT0 adalah 0x00, ternyata wantu tunda yang dihasilkan masih kurang sesuai (kurang lama), maka digunakan Prescaler untuk meningkatkan waktu tunda dengan mengurangi periode. Terdapat 4 jenis Prescaler pada Timer 0 yaitu 1. Clck/8 2. Clck/64 3. Clck/256 4. Clck/1024 Gambar dibawah ini menunjukkan Prescaler Timer 0
Mode Timer 0 pada CTC (Clear Timer on Compare Match) Jika kita memilih mode Timer 0 pada CTC, maka kita akan menggunakan register OCR0. Sama seperti mode normal, pada mode CTC, Nilai Timer akan naik mengikuti detak clock, tetapi kenaikan nilai timer ini sampai pada kondisi dimana nilai register TCNT0 sama dengan nilai register OCR0. Timer akan di reset dan flag OCR0 di set 1 jika clock selanjutnya muncul. Misalkan jika nilai TCNT0 = 0 dan nilai OCR0 = 9, maka lihat flag OCF0 dibawah ini.