Tujuan
Setelah menyelesaikan praktikum ini, diharapkan dapat memahami:
1. Mengakses Timer dengan mode normal dan CTC serta Timer sebagai counter
2. Memprogram timer dengan ketiga mode tersebut
3. Mengaplikasi fungsi timer pada mikrokontroler AVRTeori Dasar
II.
Dasar Teori
Jenis timer yang diberikan oleh AVR ada dua yaitu timer dengan resolusi 8-bit dan
16-bit. Sedangkan fitur timer dari masing-masing resolusi tersebut adalah sebagai
berikut :
1. TIMER 0 dan 2 (resolusi 8-bit)
Features:
a. Single Compare Unit Counter
b. Clear Timer on Compare Match (Auto Reload)
c. Glitch-free, Phase Correct Pulse Width Modulator (PWM)
d. Frequency Generator
e. External Event Counter
f. 10-bit Clock Prescaler (1, 8, 64, 256, 1024)
g. Overflow and Compare Match Interrupt Sources (TOV0 and OCF0)
Dari mode CTC ini, terdapat istilah pembagi clock (prescaller = N) yang harus
diketahui dalam menghitung waktu atau frekuensi yang akan ditentukan nantinya,
rumusan tersebut yaitu :
Atau:
Sehingga jika ingin didapatkan waktu maksimum dari timer 1 yang memiliki
resolusi 16 bit dengan
prescaller =1 didapatkan
Dimana :
Salah satu fitur AVR ATMega16 yaitu fitur Timer tersebut difungsikan sebagai counter
yang bisa menerima masukan dari luar. Masukan sinyal fitur timer tersebut terbagi dua
yang dikendalikan oleh multiplekser clock select, yaitu :
1. via prescaler
merupakan konstanta yang digunakan sebagai faktor pembagi terhadap kristal yang
digunakan untuk menjadi denyut mikrokontroler, konstanta tersebut bernilai 1, 8, 64,
256
dan 1024 untuk diturunkan sebagai sumber clock - clkTn.
2. via sinyal eksternal
merupakan pengaktifasian timer sebagai counter, tiap fitur Timer di AVR
ATMega16 memiliki beda pin masukan yaitu T0-Timer0, T1-Timer1 dan/atau TOSC1Timer2. Kemudian sinyal eksternal tersebut masuk ke blok edge detector untuk
mendeteksi sinyal apakah sebagai rising edge atau falling edge.
Timer sebagai counter ini berjalan secara increment, dimana nilai akan MAX dan
nilai counter akan kembali ke 0 kembali. Selain itu nilai counter bisa ditentukan pada
register TCNTx untuk menentukan hitungan yang diinginkan untuk menjalankan
interrupt. Mekanisme ini ditentukan oleh register TCCRx dengan menentukan sumber
clock yaitu pada bit-bit CS[02:00]=110 atau 111. Selain itu pula pastikan mode timer
harus menggunakan mode normal yaitu bit-bit WGM[01:00]=00. Berikut ini ilustrasi
pada Timer0 untuk pengaturan register agar timer bisa menjadi counter.
Selain itu juga ada fitur mikrokontroler AVR ATMega16 yang juga mampu menerima
sinyal luar yang secara khusus dan spesifik terhadap masukan yang diterimanya. Dari
fitur tersebut bisa dijelaskan sebagai berikut :
1. Fitur Timer sebagai Counter
Pada fitur ini difungksikan sebuah timer yang ada di AVR ATMega16 dimana ada
dua timer yang bisa menerima sinyal data dari luar yaitu :
a. Timer0 pada pin T0
Berikut ini merupakan blok dari unit counter dimana sebuah input Tn atau T0
difungsikan sebagai sinyal eksternal yang masuk ke sistem counter dari Timer0.
Sinyal keluaran clkTn ditentukan oleh multiplekser untuk pembeda sinyal masuk
dari prescaler atau T0.
TCNT1H dan TCNT1L. register TEMP diisi dari TCNT1H ketika TCNT1L dibaca.
Dan TCNT1H diisi oleh register TEMP ketika register TCNT1L ditulis
III.
IV.
1 Unit
1 Unit
1 Buah
Prosedur Percobaan
Prosedur Umum
1.
2.
Atur semua kode program yang ada kemudian diletakkan sesuai pada bagian-bagian
kode hasil generate wizard.
3.
4.
Selanjutnya download program tersebut ke MS-16 via USB dengan menekan ShiftF9 dan tekan tombol Program the chip.
5.
Amati dan analisa hasilnya kemudian catat hasil tersebut sebagai laporan
sementara.
Prosedur Khusus
Percobaan ke :
1. Generate delay 1 detik TIMER1 menggunakan mode normal
// 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=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
PORTB=0x00;
DDRB=0x00;
// 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=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
PORTD=0x00;
DDRD=0xFF;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 10.800 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=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: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
MCUCSR=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
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
};
}
/***************************************************
This program was produced by the
CodeWizardAVR V2.03.4 Standard
Automatic Program Generator
Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project : Flip-flop using TIMER1 mode CTC
Version : 1.0
Date : 2013-03-11
Author : Taufiqurrahman
Company : D206 - EEPIS
Comments: Timer 1 mode CTC interrupt
Chip type : ATmega16
Program type : Application
Clock frequency : 11.059200 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
#define LED_DETIK PORTD
// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
While(1)
{
// Place your code here
};
}
maka BarLED menjalankan running led dan hitungan ke-3 running led tersebut
akan padam hingga proses tersebut berjalan seterusnya.
/*****************************************************
This program was produced by the
CodeWizardAVR V2.03.4 Standard
Automatic Program Generator
Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project : Running LED using TIMER0 as Counter
Version : 1.0
Date : 2013-03-11
Author : Taufiqurrahman
Company : D206 - EEPIS
Comments: Timer 0 as counter
Chip type : ATmega16
Program type : Application
Clock frequency : 11.059200 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
#include <delay.h>
#define BarLED PORTD
unsigned char a, b, kondisi=1, LED[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if (kondisi==1){
// Reinitialize first condition Timer 0 value
TCNT0=0xFD;
// Place your code here
kondisi=2;
for(b=1;b<=3;b++){
for(a=0;a<=7;a++)
{
BarLED = ~LED[a];delay_ms(100);
}
}
}
else if(kondisi==2) {
// Reinitialize second condition Timer 0 value
TCNT0=0xFE;
// Place your code here
kondisi=3;
for(a=1;a<=10;a++){
BarLED = 0x55;delay_ms(100);BarLED = 0xAA;delay_ms(100);
}
}
else if(kondisi==3) {
// Reinitialize third condition Timer 0 value
TCNT0=0xFA;
// Place your code here
kondisi=1;
for(a=1;a<=10;a++){
BarLED = 0x00;delay_ms(100);BarLED = 0xFF;delay_ms(100);
}
}
}
// 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=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
PORTB=0x00;
DDRB=0x00;
// 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=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
PORTD=0x00;
DDRD=0xFF;
// Timer/Counter 0 initialization
// Clock source: T0 pin Rising Edge
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x07;
TCNT0=0xFA;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// 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=0x01;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
};
}
V.
Data Percobaan
pada percobaan 1 menmbuat program dengan timer (pewaktuan) dengan mode
Normal dengan mengisi register TCNT
TCNT=(1+FFFFh)-(
T timer x Fclk
N
TCNT=(1+FFFFh)-(
1 x 11059200
1024
)
)
TCNT=65526-10800 desimal
TCNT=10000h-2A30h
TCNT=D5D0
Sehingga nilai register yang diisi pada codewizard timer 1 pada mode normal adalah
D5D0h.
Berikut adalah gambar hasil percobaaan yang dilakukan:
Pada
Pada saat
saat PORTD
PORTD
dalam
dalam kondisi
kondisi
LOW
HIGH
1 x 11059200
1024
OCR=
)-1
OCR=2A30-1
OCR=2A2F
Maka nilai register OCR diisi dengan nilai 2A2Fh.
Berikut adalah gambar hasil percobaan pada percobaan timer dengan mode
CTC
VI.
Tugas
1. Jelaskan edge detector serta jelaskan jenisnya?
Pada AVR at-mega16 yang dimaksud Edge Detector ialah PIN external dimana
2. Apa perbedaan dan persamaan dari Digital Input, Eksternal Interrupt dan Timer
sebagai Counter?
Perbedaan dari Digital Input, Eksternal Interrupt dan Timer sebagai
Counter adalah pada digital input hanya berfungsi sebagai masukan atau
keluaran data secara digital saja (high atau low), sedangkan pada
External interupt merupakan inputan data yang dapat menginterupsi
suatu program dan timer sebagai counter sebagai counter yang
berjalan(bereksekusi ) berdasarkan waktu yang ditentukan dengan
mengisi nilai register TCNT ataupun Register OCR.
Persamaan dari Digital Input, Eksternal Interrupt dan Timer sebagai
Counter adalah pada Digital input, Ekternal Interupt dan Timer sebagai
Counter sama-sama merupakan mendapatkan inputan data dari luar dan
memberikan data keluar.
3. Jelaskan fungsi dari Prescaller pada timer AVR
Prescaller merupakan konstanta yang digunakan sebagai faktor pembagi terhadap
kristal yang digunakan untuk menjadi denyut mikrokontroler, konstanta tersebut
bernilai 1, 8, 64, 256 dan 1024 untuk diturunkan sebagai sumber clock - clkTn.
5. Melibatkan ISR apa untuk interrupt pada timer sebagai counter, ilustrasikan
pada penggunaan vector interrupt berdasarkan dari percobaan anda diatas!
Pada percobaan diatas menggunakan ISR interupt timer0/counter overflow yang
dinyatakan seperti penggalan program berikut:
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
Program diatas menyatakan ISR dalam mode interupt timer0/counter overflow
diamana vector interupt tersebut pada urutan ke-10 seperti yang dinayatakan
tabel dari datasheet Atmega 16 pada gambar dibawah:
VII.
Kesimpulan
Pada parktikum yang dilakukan dapat disimpulkan bahwa:
1. Timer /Counter adalah suatu peripheral yang tertanam didalam microcontroller
yang berfungsi pewaktu. Dengan peripheral ini pengguna microcontroller dapat
dengan mudah menentukan kapan suatu perintah dijalankan (delay), tentu saja
fungsi timer tidak hanya untuk penundaan perintah saja, timer juga dapat berfungsi
sebagai oscilator, PWM, ADC, dan lain-lain.
2. Pada mikrokontroler ATMEGA 16 memiliki 3 buah timer yaitu timer 0 (8bit),
timer1 (16bit), dan timer 2 (8bit). Untuk mengenai register lengkapnya bisa dibaca
pada datasheet. Namun yang akan dibahas pada tulisan kali ini hanya timer 0(8bit)
dan timer1 (16 bit) saja.
3. Register-register yang digunakan pada Timer & Counter