Timer/Counter
Apa itu timer/counter? Merupakan suatu pencacah(counter) yang bisa menghitung naik/turun Pencacah berupa register 8 bit/16 bit Nilai cacahan yg tersimpan di register tersebut akan naik/turun pada transisi naik (positive edge) clock masukan
Gambaran timer Register pencacah mux select enable Clock in Clock internal mux Clock eksternal select
Timer dan counter Timer : clock untuk timer berasal dari clock yang dipakai oleh sistem (internal).Jika kita menggunakan kristal, clock untuk timer bersumber dari kristal. Timer biasanya digunakan untuk pewaktuan Counter: clock berasal dari pin Tn(T0,T1 atau TOSC1-TOSC2). Digunakan untuk mencacah event dari luar(mencacah pulsa dsb)
Sumber clock untuk timer Langsung terhubung ke clock sistem(f_clk) Lewat prescaler(pembagi) f_clk/8 f_clk/64 f_clk/256 f_clk/1024
Timer 0 Timer 8 bit Register yang digunakan: TCNT0 register pencacah, menampung nilai yang dicacah TCCR0 register kontrol, untuk memilih mode operasi, memilih prescaler OCR0 register untuk menentukan nilai maks pada mode operasi compare TIMSK register untuk meng-enable/disable dan memilih interupsi timer(digunakan juga di timer1 dan 2) TIFR register flag yang menandai terjadinya suatu interupsi timer (digunakan juga di timer1 dan 2)
Mode Operasi Timer 0 Mode Normal Register TCNT0 count up dari suatu nilai sampai mencapai nilai 0xFF kemudian restart ke nilai 0x00 Peristiwa restart itu disebut overflow Pada saat overflow, bit TOV0 akan logika 1 dan mengakibatkan interupsi(jika interupsi di-enable)
Mode Operasi Timer 0 2. Mode clear timer on compare match(CTC) TCNT0 akan count up dari suatu nilai sampai mencapai nilai maks (< 0xFF) Nilai maks ini didefinisikan di register OCR0 Setelah mencapai nilai maks, TCNT0 akan reset kembali ke 0x00 dan bit OCF0 (output compare flag) akan set Interupsi akan terjadi jika di-enable
Mode Operasi Timer 0 3. Fast PWM mode 4. Phase correct PWM 3 dan 4 akan dibicarakan pada pertemuan berikutnya
Register TCNT0
Register TCCR0,bit WGM Bit WGM digunakan untuk memilih mode operasi
Reg TCCR0 bit COM Digunakan untuk konfigurasi mode CTC(compare match)
TCCR0 bit CS Untuk memilih sumber clock dan prescaler
Output Compare Register (OCR0) Digunakan untuk menyimpan nilai ‘compare’ yang akan selalu dibandingkan dengan nilai TCNT0 pada mode compare match
Timer interrupt mask register Digunakan untuk aktivasi interupsi timer, yang digunakan untuk timer 0 hanya bit 0 dan 1
Memakai timer 0 dalam program Memakai timer 0 dalam mode overflow,menggunakan interupsi Setting vektor interupsi, memberikan perintah RJMP pada alamat vektor interupsi timer 0 overflow, yaitu alamat 0x009 Inisialisasi : mengisi nilai awal TCNT0 Setting TCCR0 untuk setting mode operasi overflow (WGM00=0,WGM01=0) dan memilih sumber clock dan prescaler (CS02 .. CS01) Meng-enable bit TOIE0 pada register TIMSK Meng-enable global interrupt (perintah SEI)
Timer 0 compare match Memakai timer 0 dalam mode compare match,menggunakan interupsi Setting vektor interupsi, memberikan perintah RJMP pada alamat vektor interupsi timer 0 overflow, yaitu alamat 0x013 Inisialisasi: mengisi nilai awal TCNT0 dan mengisi nilai OCR0 Setting TCCR0 untuk setting mode operasi overflow (WGM00=0,WGM01=1) dan memilih sumber clock dan prescaler (CS02 .. CS01) Meng-enable bit TOIE0 pada register TIMSK Meng-enable global interrupt (perintah SEI)
Contoh soal Buatlah sebuah tampilan pencacah naik yang ditampilkan di LED pada PORTC. Pencacah naik setiap 1 detik. Kristal yang digunakan 4 MHz. Sistem juga menampilkan variasi nyala LED pada PORTB, yang timing-nya diatur dengan delay register
Setting timer Misalnya diinginkan menggunakan timer 0 dalam mode normal (overflow) timer dirancang overflow 0.01 detik sekali (100 Hz-biar frekuensi tidak terlalu kecil) Karena frekuensi overflow cukup rendah, gunakan prescaler 1024, jadi frekuensi xtal 4 MHz akan dibagi 1024 baru masuk ke pencacah F_pencacah=4 M/1024 = 3906.25 Hz Untuk mencapai 100 Hz harus dibagi 39 Sehingga TCNT0 harus diisi dahulu dengan nilai sebesar 0xFF – 39 = 216, nilai ini juga harus diisikan ulang pada saat interupsi timer Timer 0 sudah bisa overflow tiap 0.01 detik, supaya bisa menghasilkan 1 detik, pada rutin interupsi timer dilakukan operasi increment register bantu