Selasa, 28 Februari 2012

Interrupt Timer 1 Pada AVR ATMega

Pada mikrokontroller ATMega 8535 memiliki 3 buah timer yakni Timer0,Timer1,Timer2. Ketiga timer tersebuat dibagi menjadi 2 bagian yakni Timer 8 bit dan 16 bit.

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.



Sekarang kita akan mencoba membahas Timer 1 pada ATMega 8535. Pada Timer ini ada beberapa register yang perlu kita pahami dalam menggunakannya. register ini yakni.TCCR1A,TCCR1B dan TCNT1H,TCNT1L
  •  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 inginkan
XTAL     = frekuensi xtal yg dipakai
prescaler = nilai prescaler
Sekarang kita akan mencoba membuat timer 1 berjalan dengan siklus 1 detik. Pertama kita buat new project pada CodeVisionC AVR dan pilih mikrokontroller ATMega 8535

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)
    {

    };
    }
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