Apa perbedaan dari Timer 8 bit dengan 16 bit???
- Timer 8 bit yakni pada Timer0 dan Timer2, sesuai dengan namanya timer 8 bit yakni timer yang dapat mencacah dari 0 - 255 atau 0x00 - 0xFF.
- Timer 16 bit yakni pada Timer1, sesuai dengan namanya timer 16 bit yakni timer yang dapat mencacah dari 0 - 65535 atau 0x0000 - 0xFFFF.
- TCCR1A dan TCCR1B merupakan register timer untuk mensetting prescaller yang akan kita gunakan. Prescaller adalah nilai pembagi dalam menentukan clock source pada timer.Biasanya clock source yg saya pakai adalah clock sistem (XTAL). Dan kita bisa menset besarnya nilai ini. Maximum sama dengan XTAL, minimum XTAL/1024. Nah nilai pembagi (1024) ini yg disebur nilai prescaler.Untuk menentukan prescaller dapat dilihat tebel register TCCR yakni
Jika kita ingin menggunakan prescaller 256 maka nilai TCCR1B = 0x04.
- Sedangkan TCNT1H dan TCNT1L adalah besarnya nilai timer yang akan kita gunakan. Untuk perhitungan pada Timer 1 yakni
TCNT = (1+0xFFFF) - (waktu *( XTAL / prescaler) )
waktu = waktu yg kita inginkanSekarang kita akan mencoba membuat timer 1 berjalan dengan siklus 1 detik. Pertama kita buat new project pada CodeVisionC AVR dan pilih mikrokontroller ATMega 8535
XTAL = frekuensi xtal yg dipakai
prescaler = nilai prescaler
kemudian setting timer1 yakni:
Setelah itu pilih File--> generate save and exit
Perhatikan contoh program dibawah ini,
#include <mega8535.h>
#include <stdio.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
unsigned char buff[30];
unsigned long detik;
// sub rutin saat terjadi interrupt Timer 1
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCNT1H=0x48;
TCNT1L=0xe5;
detik++;
lcd_clear();
sprintf(buff,"detik %d",detik);
lcd_puts(buff);
}
void main(void)
{
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x04;
TCNT1H=0xC2;
TCNT1L=0xF7;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x80;
SFIOR=0x00;
// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm("sei")
lcd_putsf("wait...");
while (1)
{
};
}
#include <stdio.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
unsigned char buff[30];
unsigned long detik;
// sub rutin saat terjadi interrupt Timer 1
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCNT1H=0x48;
TCNT1L=0xe5;
detik++;
lcd_clear();
sprintf(buff,"detik %d",detik);
lcd_puts(buff);
}
void main(void)
{
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x04;
TCNT1H=0xC2;
TCNT1L=0xF7;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x80;
SFIOR=0x00;
// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm("sei")
lcd_putsf("wait...");
while (1)
{
};
}
Perhatikan pada nilai TCNT1A dan TCNT1B serta TCCR0B.
karena kita akan membuat timer 1 bekerja pada 1 detik dengan XTAL 12MHz maka perhitungannya
TCNT = (1+0xFFFF) - (1 *( 12000000 /256) )
Jika kita hitung maka nilai TCNT = 0x48E5, sehingga TCNT1H = 0x48 dan TCNT1L = 0xE5dan karena menggunakan prescaller 256 maka nilai TCCR1B = 0x04.
Tidak ada komentar:
Posting Komentar