>>>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.
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.
#include <mega16.h>
#include <stdlib.h>
#asm
.equ __lcd_port=015 ;PORTC
#endasm
#include <lcd.h>
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;
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.
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:
#include <mega16.h>
#include <stdlib.h>
#asm
.equ __lcd_port=015 ;PORTC
#endasm
#include <lcd.h>
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;
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);
};
}