Anda di halaman 1dari 6

TIMER DAN COUNTER AVR

>>>TIMER<<<

Pada ATmega8535 terdapat 3 buah timer, yaitu Timer0 (8 bit), Timer1 (16 bit) dan Timer2 (8
bit). Untuk perbedaan dan cara kerja masing-masing timer, dapat membacanya pada
datasheet.

Perhitungan untuk Timero dan Timer1 adalah sebagai berikut:


Ttimer0 = Tosc*(256-TCNT0)*N (8 bit = 256)
Ttimer1 = Tosc*(65536-TCNT1)*N (16 bit = 65536)

Tosc = 1/Fosc pada aplikasi ini menggunakan kristal 12 MHz, sehingga:


Tosc = 1/12Mhz = 0,0000000833 detik

Dimana:
Ttimer0 = lamanya periode Timer0
Ttimer1 = lamanya periode Timer1
TCNT0 = Register Timer0
TCNT1 = Register Timer1
N = Skala clock (mempunyai nilai 1, 8, 64, 256 dan 1024)
Tosc = periode clock
Fosc = frekuensi clock kristal

aplikasi timer yang ditampilkan pada LCD, cara kerjanya pada LCD akan menampilkan nilai
awal yaitu 0 kemudian setelah 1 detik (menggunakan timer) nilai tersebut akan naik menjadi
1, kemudian 2 dan seterusnya, jika sudah sampai 100 maka akan diset kembali menjadi 0.
Menggunakan Timer1:
Ttimer1 = Tosc*(65536-TCNT1)*N

Pada aplikasi diatas diinginkan lamanya timer adalah 1 detik (Ttimer1 = 1 detik) dan jika
menggunakan kristal 12 MHz dan menggunakan skala clock N = 1024, maka didapat:

1=0,0000000833*(65536-TCNT1)*1024
TCNT1= 53818 = D23A (dalam hexa)

Dari perhitungan diatas didapat nilai 53818 atau dalam hexa D23A, nilai tersebut harus
diisikan pada register TCNT1 agar Timer 1 bernilai 1 detik.

Berikut adalah gambar untuk mensetting pada CodeVision CodeWizard AVR:


Pada settingan diatas digunanakan nilai clock value yaitu 11.719 kHz, nilai tersebut didapat
dari Fosc/N atau 12 Mhz/1024. Berikut adalah listing programnya

#include <mega16.h>
#include <stdlib.h>

#asm
.equ __lcd_port=015 ;PORTC
#endasm
#include <lcd.h>

// Timer 1 overflow interrupt service routine


interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCNT1H=0xD23A >> 8;
TCNT1L=0xD23A & 0xff;
data++; //setelah 1 detik increament data
}

void main(void)
{
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 11.719 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=000;
TCCR1B=005;
TCNT1H=0xD2;
TCNT1L=0x3A;
ICR1H=000;
ICR1L=000;
OCR1AH=000;
OCR1AL=000;
OCR1BH=000;
OCR1BL=000;

// Timer(s)/Counter(s) Interrupt(s) initialization


TIMSK=004;

// Analog Comparator initialization


// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=080;
SFIOR=000;

// LCD module initialization


lcd_init(16);

// Global enable interrupts


#asm(sei)

while (1)
{
if (data==100)
{
lcd_clear();
data=0;
}
lcd_gotoxy(0,0);
lcd_putsf(ElectrO-cOntrOl);
itoa(data,temp); //menampilkan di LCD
lcd_gotoxy(0,1);
lcd_puts(temp);
};
}

Menggunakan Timer0:
Ttimer0 = Tosc*(256-TCNT0)*N

Dengan menggunakan Timer0, untuk aplikasi yang sama seperti diatas, sebenarnya timer0 ini
tidak dapat menghasilkan periode timer selama 1 detik dikarenakan keterbatasan jumlah bit
yaitu hanya 8 bit (256) saja. Tetapi kita masih dapat memanupulasi program agar dapat
menghasilkan timer selama 1 detik, caranya dengan membuat timer selama 10 ms kemudian
dilakukan pengulangan sebanyak 100 kali, maka akan dihasilkan timer selama 1 detik.
10 ms * 100= 1 detik

Pada aplikasi ini diinginkan lamanya timer adalah 10 ms (Ttimer0=10 ms=0.01 s) dan jika
saya menggunakan kristal 12 MHz dan menggunakan skala clock N = 1024, maka didapat:

0.01 = 0,0000000833*(256-TCNT0)*1024
TCNT0= 138 = 8A (dalam hexa)

Dari perhitungan diatas didapat nilai 138 atau dalam hexa 8A, nilai tersebut harus diisikan
pada register TCNT0 agar Timer 0 bernilai 10 mili detik.

Berikut adalah gambar untuk mensetting pada CodeVision CodeWizard AVR:

Pada settingan diatas digunanakan nilai clock value yaitu 11.719 kHz, nilai tersebut didapat
dari Fosc/N atau 12 Mhz/1024. Berikut adalah listing program lengkapnya:

unsigned char temp[6], loop=0;


int data;

#include <mega16.h>
#include <stdlib.h>

#asm
.equ __lcd_port=015 ;PORTC
#endasm
#include <lcd.h>

// Timer 0 overflow interrupt service routine


interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0x8A;
loop++;
if (loop>=100)
{
data++;
loop=0;
}
}

void main(void)
{
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 11.719 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=005;
TCNT0=0x8A;
OCR0=000;

// Timer(s)/Counter(s) Interrupt(s) initialization


TIMSK=001;

// Analog Comparator initialization


// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=080;
SFIOR=000;

// LCD module initialization


lcd_init(16);

// Global enable interrupts


#asm(sei)

while (1)
{
if (data==100)
{
lcd_clear();
data=0;
}
lcd_gotoxy(0,0);
lcd_putsf(ElectrO-cOntrOl);
itoa(data,temp); //menampilkan di LCD
lcd_gotoxy(0,1);
lcd_puts(temp);
};
}

Anda mungkin juga menyukai