Mikrokontroler mempunyai funsi timer, timer dapat digungsikan untuk mengerjakan tuatu perintah/program dalam interfal waktu tertentu. Contoh sederhana dari timer adalah membuat clock 1 detik untuk membuat jam digital. catatan untuk kepresisian clock 1, detik lebih baik menggunakan komponen tambahan seperti IC RTC(Real Time Clock).
ATMega16 memiliki 3 buah timer: timer 0, timer 1 dan timer 2. setiap timer mempunyai kelebihan, pada kesempatan ini akan dibahas timer yang paling sederhana yaitu timer 0
Rangkaian 1. Contoh program Led berkediap setiap 1 setik.

/* * timer.c * internal clock 4 MHz */ #include <io.h> char counter; bit a; // Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { // Place your code here counter++; if (counter==61){a=~a;counter=0;} PORTC=a; } void main(void) { DDRC=0xff; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 15,625 kHz // Mode: Normal top=0xFF // OC0 output: Disconnected // Timer Period: 16,384 ms // 4000000/256/255=61,274 TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (1<<CS02) | (0<<CS01) | (0<<CS00); TCNT0=0x00; OCR0=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (1<<TOIE0); a=1; // Global enable interrupts #asm("sei") while (1) { // Please write your application code here } }
pembahasan:
ATMega16 mempunyai 3 buah timer yaitu timer0, timer1 dan timer2. pada kesempatan kali ini akan kita bahas tentang interupt timer0. pada rangkaian dan program diatas akan mengeksekusi perintah dalam interfal tertentu. pada kasus ini interfal waktu 1 detik. ada dua register yang perlu diketahui yaitu Timer Counter Control Register 0(TCCR0) dan Timer Interupt Mask(TIMSK)
interrupt [TIM0_OVF] void timer0_ovf_isr(void) { // Place your code here counter++; if (counter==61){a=~a;counter=0;} PORTC=a; }
pada baris program diatas merupakan sub program interupt0. ketika sudah kurang lebih 1 detik akan menghidupkan atau mematikan LED pada PORT C.
TCCR0=(0<<WGM00)|(0<<COM01)|(0<<COM00)|(0<<WGM01)|(1<<CS02)|(0<<CS01)|(0<<CS00);
TCCR0 yang perlu diperhatikan adalah CS002, CS01 dan CS00. Clock Speed(CS) berfungsi untuk memilih kecepatan timer
CS02 | CS01 | CS00 | keterangan |
0 | 0 | 0 | Timer off |
0 | 0 | 1 | clock/1 |
0 | 1 | 0 | clock/8 |
0 | 1 | 1 | clock/64 |
1 | 0 | 0 | clock/256 |
1 | 0 | 1 | clock/1024 |
1 | 1 | 0 | external clock T0 faling |
1 | 1 | 1 | external clock T0 rising |
timer sangat tergantung dari kecepatan clock ATMega. contoh 1 detik diatas bila clock menggunakan 4MHz, bila menggunakan clock lain semisal 12MHz maka untuk menghasilkan rangkaian berkedip 1 detik perlu melakukan perhitungan sbb:
12.000.000/256/255=183,82
maka pada pada program pada baris 16 diganti dengan:
if (counter==183){a=~a;counter=0;}
catatan: timer ini tidak bisa persisi menghasilkan waktu 1 detik.
kemudian pengaturan pada TIMSK, perlu mengaktifkan hanya perlu memberi logika 1 pada TOIE0 sehingga menjadi seperti dibawah ini
TIMSK=(0<<OCIE2)|(0<<TOIE2)|(0<<TICIE1)|(0<<OCIE1A)|(0<<OCIE1B)|(0<<TOIE1)|(0<<OCIE0)|(1<<TOIE0);