Timer di AVR
Timer dalam embendded system sangat banyak kegunaannya.Itulah karenanya setiap mikrokontroler terdapat fitur timer. Mikrokontroller AVR keluaran Atmel memiliki beberapa timer(ATmega16 dalam hal ini,tipe lain yang lebih tinggi sama ,kecuali penambahan jumlah timernya),diantaranya timer0(8 bit),timer1(16 bit),dan timer2(8 bit).
Timer0 dan timer2(8 bit).
timer ini menghitung maksimal 255 hitungan.dimana periode setiap hitungan(detaknya) tergantung dari setting prescaler-nya. Untuk mengatur timer mode operasi apa yang digunakan dan mengatur prescaler digunakan register TCCRx(x=0,2).TCCRx adalah register 8 bit sebagai berikut:
FOC0WGM00 COM01COM00 WGM01CS2 CS1 CS0
7 6543210
CS0,CS1,CS2 digunakan untuk pengaturan prescaller, misalnya
000: timer dihentikan jika diset nilai ini
001: sekali detaknya sama dengan detak oscillator crystal yang digunakan
010 : sekali detaknya sama dengan oscillator/8.misalnya oscilator 8 MHZ,makasekali detak 1 perlu 1 mikrodetik.atau pada hitungan maksimal 255 us.
(atau clock berdetak 8 kali,timer baru sekali)
ànilai cs0,1,2 lain dapat dilihat di datasheetnya.
WGM00 dan WGM 01 digunakan untuk mode operasi dari timer,
Mode-Mode kerja Timer
1.mode normal,timer digunakan untuk ngitung saja,membuat delay,menghitung selang waktu .
2.mode PWM,phase correct
3.CTC,dalam mode ini ,nilai timer yang ada pada TCNTx akan di nol-kan lagi jika TCTx sudah match dengan nilai yang ada pada register OCRx.sebelumnya OCR diset dulu,.karena timer0 dan 2maksimumnya 255,maka range OCR 0-255.
4.Fast PWM
COM00,01:tergantung mode apa yang digunakan(nilaiWGM),COM00,01 untuk pengaturan lebih spesifik suatu mode timer.
Jadi hal utama jika akan menggunakan tiemr adalah setting TCCRx-nya,digunakan untuk mode apa(secara default,adalah sebagai mode normal).dan ketika saat timer jalan,jumlah hitungannya dapat dilihat Di register TCNTx.
Jika menggunakan compiler Seperti CodeVision ,penggunaannya auto generated,namun walaupun begitu ketika troubleshoot program setting manual adalah penting.
Interrupt Timer
1.Overflow Interrupt,akan terjadi interrupt jika TCNTx mencapai 255 untuk timer0 dan timer2 ,dan 65535 untuk timer1.
2.Compare Match interrupt,terjadi jika nilai OCR sama dengan TCNTx
Contoh Aplikasi:
- Jam digital.
Digunakan Compare Match Interrupt,menggunakan crystal 12 MHZ,digunakan timer 0
Dengan prescaller Osc/8: 12mhz/8=1,5 mhz periode 1/1,5mhz==sekitar 100 us,jadi agar setara 1 detik harus dikali 10000.
Register OCR=0x96.
Output :tampilan Jam:Menit:Detik pada port C yang terhubung dengan LCD 2x16
/*********************************************
Project : jam digital
Date : 7/13/2007
Author: edee
Chip type : ATmega16
Program type : Application
Clock frequency : 12.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*********************************************/
#include <mega16.h>
#include <stdlib.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15
#endasm
#include <lcd.h>
unsigned int kdetik=0,detik=0,menit=0,jam=0;
unsigned char cdetik[10],cmenit[10],cjam[10];
// interrupt jika compare match
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
TCNT0=0; //jika sudah compare match,set awal lagi
if(++kdetik==10000)
{
if(++detik==60)
{ detik=0;
lcd_clear();
if(++menit==60)
{menit=0;
lcd_clear();
if(++jam==24)
{
jam=0;
lcd_clear();
} } } kdetik=0; itoa(detik,cdetik); itoa(menit,cmenit); itoa(jam,cjam); lcd_gotoxy(9,0); lcd_putsf(":"); lcd_gotoxy(10,0); lcd_puts(cdetik); lcd_gotoxy(6,0); lcd_putsf(":"); lcd_gotoxy(7,0); lcd_puts(cmenit); lcd_gotoxy(4,0); lcd_puts(cjam); lcd_gotoxy(0,1); lcd_putsf("= Jam Digital =");
}
}
void main(void)
{
//PA.5,6,7 input,dengan pull up
PORTA=0xE0;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
//timer 0 sumber 12mhz/8=1,5 mhz periode 1/1,5mhz
TCCR0=0x02;
TCNT0=0x00;
OCR0=0x96; //sekitar 100us
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// interrupt timer digunakan
TIMSK=0x02;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x80;
SFIOR=0x00;
lcd_init(16);
#asm(“sei”)
while (1)
{
};
}
2.Pengukur selang waktu
Dalam aplikasi ini timer digunakan untuk mengukur selang waktu dua kejadian,dimulai start dan stop(tanpa menggunakan interrupt apapun)
Deklarasi awal:
#define TSTART() TCCR1B = 0x02
//stop timer
#define TSTOP() TCCR1B = 0x00
#define TRESET() TCNT1=0x00
#define THABIS 65000
Penggunaan di program:
TSTART();
while(PINB.0!=1) //jika syarat stop terpenuhi
{
hitung++;
if(hitung==THABIS)//sampai nilai max
{ //j=0; // return 0;
break;
}
}
TSTOP();
t=TCNT1;
akhir2 ini sering pake timer.