Timer/Counter 1 (16 bit) pada AVR

Timer AVR (www.albireo.at)

TCNT1, digunakan untuk menyimpan nilai timer yang diinginkan dan dibagi menjadi 2 register 8 bit, yaitu: TCNT1H dan TCNT1L.

Tabel 8 Register TCNT1
Tabel 8 Register TCNT1

TIMSK  dan  TIFR,  Timer  Interrupt Mask Register (TIMSK) dan Timer Interrupt Flag (TIFR) digunakan untuk mengendalikan interrupt mana yang akan diaktifkan dengan cara melakukan setting pada TIMSK dan untuk mengetahui interrupt mana yang sedang terjadi.

Tabel 9 Register TIMSK
Tabel 9 Register TIMSK

Keterangan:

Bit 7: Timer/Counter2 Output Compare Match Interrupt Enable

Bit 6: Timer/Counter2 Overflow Interrupt Enable

Bit 5: Timer1 Input Capture Interrupt Enable

Bit 4: Timer/CounterA Output Compare Match Interrupt Enable

Bit 3: Timer/CounterB Output Compare Match Interrupt Enable

Bit 2: Timer/Counter1 Overflow Interrupt Enable

Bit 1: Timer/Counter0 Output Compare Match Interrupt Enable

Bit 0: Timer/Counter0 Overflow Interrupt Enable

Tabel 10 Register TIFR
Tabel 10 Register TIFR

Keterangan:

Bit 7: Output Compare Flag2

Bit 6: Timer/Counter2 Overflow Flag

Bit 5: Timer1 Input Capture Interrupt Flag

Bit 4: Output Compare Flag1A

Bit 3: Output Compare Flag1B

Bit 2: Timer/Counter1 Overflow Flag

Bit 1: Output Compare Flag0

Bit 0: Timer/Counter0 Overflow Flag

OCR1n, Output Compare Register Timer 1 n (n = A, B) merupakan register yang digunakan untuk membangkitkan interupsi eksternal dengan melakukan perbandingan (Output Compare) atau juga dapat digunakan untuk membangkitkan bentuk gelombang (PWM). Fungsi tersebut dikeluarkan oleh pin OC1n (n = A, B).

Tabel 11 Register OCR1n
Tabel 11 Register OCR1n

Dalam perhitungan, Timer1 dapat menggunakan rumus sebagai berikut:

Timer 1 = Tosc*(65536-TCNT1)*N → (16 Bit = 65536 ≈ 2^16)

Contoh penggunaan untuk timer 1 detik (Timer1 = 1 detik) dengan crystal 12 MHz dan menggunakan skala clock 1024 maka akan menghasilkan :

Tosc = 1/Fosc = 1/12 = 0,083
1 = 0.083*(65536-TCNT1)*1024
TCNT = 53818 = D23A (Hexadesimal)

Berdasarkan perhitungan diatas maka hasil yang diperoleh adalah D23A, maka nilai tersebut harus dimasukkan kedalam register TCNT1 agar timer 1 bernilai 1 detik. Berikut ini contoh penggunaannya pada Codevision AVR:

Setting TIMER1 AVR (www.geyosoft.com)
Gambar 3 Setting TIMER1 AVR (www.geyosoft.com)

Membuat Blink Led dengan Timer1 (16 bit)

Buatlah program menyalakan Led selama delay 1 detik menggunakan Timer1 (Timer 16 bit). PORTB sebagai output yang dihubungkan ke Led.

Gambar 4 Konfigurasi Timer1 Blinking Led
Gambar 4 Konfigurasi Timer1 Blinking Led
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.3 StAndard
Automatic Program Generator
© Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 23/08/2015
Author  : Sh.mukti
Company : Jangan gunakan software bajakan!
Comments: 


Chip type               : ATmega16
Program type            : Application
AVR Core Clock frequency: 10,800000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/

#include <mega16.h>

// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Reinitialize Timer1 value
TCNT1H=0xD5;
TCNT1L=0xD0;
// Place your code here
    if(f1_timer==1)     //periksa flag timer
    {
        PORTC=0xff;    //jika f1_timer=1 -> Led Mati
        f1_timer=0;    //clear f1_timer
    }  
    else
    {
        PORTC=0x00;    //jika f1_timer=0 -> led nyala
        f1_timer=1;    //set f1_tmer
    }

}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
PORTB=0x00;
DDRB=0xFF;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 10800,000 kHz
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x01;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 10800,000 kHz
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0xD5;
TCNT1L=0xD0;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Global enable interrupts
#asm("sei")
f1_timer=0; //kondisi awal flag timer berlogika '0'
while (1)
      {
      // Place your code here

      }
}

Jika artikel ini bermanfaat buat Anda, mohon untuk di Share because “Sharing is Caring”

Referensi:

One thought on “Timer/Counter 1 (16 bit) pada AVR”

Leave a Reply

Your email address will not be published. Required fields are marked *