Belajar 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:

FOC0 WGM00 COM01 COM00 WGM01 CS2 CS1 CS0

7 6 5 4 3 2 1 0


CS0,CS1,CS2 digunakan untuk pengaturan prescaller, misalnya

0 0 0 : timer dihentikan jika diset nilai ini

0 0 1 : sekali detaknya sama dengan detak oscillator crystal yang digunakan

0 1 0 : sekali detaknya sama dengan oscillator/8.misalnya oscilator 8 MHZ,maka sekali 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:
1. 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=0×96.

Output :tampilan Jam:Menit:Detik pada port C yang terhubung dengan LCD 2×16

/*********************************************

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 

#include 

// Alphanumeric LCD Module functions

#asm

.equ __lcd_port=0×15

#endasm

#include 

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=0×00;

PORTB=0×00;

DDRB=0×00;

PORTC=0×00;

DDRC=0×00;

PORTD=0×00;

DDRD=0×00;

//timer 0 sumber 12mhz/8=1,5 mhz periode 1/1,5mhz

TCCR0=0×02;

TCNT0=0×00;

OCR0=0×96; //sekitar 100us

TCCR1A=0×00;

TCCR1B=0×00;

TCNT1H=0×00;

TCNT1L=0×00;

OCR1AH=0×00;

OCR1AL=0×00;

OCR1BH=0×00;

OCR1BL=0×00;

// Timer/Counter 2 initialization

// Clock source: System Clock

// Clock value: Timer 2 Stopped

// Mode: Normal top=FFh

// OC2 output: Disconnected

ASSR=0×00;

TCCR2=0×00;

TCNT2=0×00;

OCR2=0×00;

// External Interrupt(s) initialization

// INT0: Off

// INT1: Off

// INT2: Off

MCUCR=0×00;

MCUCSR=0×00;

// interrupt timer digunakan

TIMSK=0×02;

// Analog Comparator initialization

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

// Analog Comparator Output: Off

ACSR=0×80;

SFIOR=0×00;

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 = 0×02

//stop timer

#define TSTOP() TCCR1B = 0×00

#define TRESET() TCNT1=0×00

#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.





Semoga bermanfaat !!
Referensi : http://offground.wordpress.com/2007/09/28/timer-di-avr/

Postingan terkait:

Belum ada tanggapan untuk "Belajar Timer di AVR"

Kontes Robot

Kontes Robot