Anda di halaman 1dari 17

I.

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)

2. TIMER 1 (resolusi 16-bit)


Features:
a. True 16-bit Design (i.e., Allows 16-bit PWM)
b. Two Independent Output Compare Units
c. Double Buffered Output Compare Registers
d. One Input Capture Unit
e. Input Capture Noise Canceler
f. Clear Timer on Compare Match (Auto Reload)
g. Glitch-free, Phase Correct Pulse Width Modulator (PWM)
h. Variable PWM Period
i. Frequency Generator
j. External Event Counter
k. Four Independent Interrupt Sources (TOV1, OCF1A, OCF1B, and ICF1)

Secara umum mode pada Timer/Counter 0, 1 dan 2, diantaranya :


a. Normal
Mode yang paling sederhana dalam penggunaan timer adalah mode Normal
(WGM01:00=0). Didalam mode normal ini arah hitungan timer bersifat hitung naik
(incrementing). Pola kerja dari timer mode normal ini menghitung hingga
TOP=0xff dan kembali restart ke 0x00 (untuk timer resolusi 8-bit). Dan nilai
hitungan timer dapat diisi setiap saat pada register TCNTx
b. CTC (Clear Timer on Compare Match)
Didalam mode CTC menggunakan register OCRx untuk memanipulasi nilai
hitungan timer (WGM01:00=2). Mode CTC ini mulai menghitung naik
(incrementing) dan otomatis kembali Nol ketika nilai register TCNTx sama dengan
nilai register OCRx. Fenomena ini dikatakan mekanisme autoreload, dimana
internal AVR secara otomatis memberikan isi register TCNT bernilai 0 kembali dan
berjalan hitung naik kembali dan seterusnya. Sehingga timer dengan mode CTC ini
lebih presisi dibandingkan mode normal.

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:

Rumusan waktu maksimum dari suatu timer adalah sebagai berikut:

Dimana : Fclk = nilai frekuensi kristal yang digunakan.


= nilai bit timer yang digunakan, bisa 8-bit atau 16-bit.

jika 8-bit maka = 255


jika 16-bit maka = 65535

N = Prescaller, faktor pembagi mulai 8, 64, 256 1024.


Contoh :
Diketahui Fclk = 11.059200 Mhz dan menggunakan TIMER 0/2, maka = 255
Hitung waktu maksimum timer tersebut dengan prescaller 1.
Jawab :

Sehingga jika ingin didapatkan waktu maksimum dari timer 1 yang memiliki
resolusi 16 bit dengan
prescaller =1 didapatkan

Dimana :

Interval Timer = Waktu yang diinginkan


Clock Value= Frekuensi kristal per prescaler:

Timer Value = besaran waktu yang akan ditanamkan pada mikrokontroler


= nilai bit timer yang digunakan, bisa 8-bit atau 16-bit.

jika 8-bit maka = 255


jika 16-bit maka = 65535
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.

Timer1 pada pin T1


Berikut ini merupakan blok dari unit counter dimana sebuah input Tn atau T1
difungsikan sebagai sinyal eksternal yang masuk ke sistem counter dari Timer1.
Dikarenakan Data Counter adalah 16-bit, register TCNT1 dipecah menjadi 8-bit taitu
TCNT1H dan TCNT1L. register TEMP diisi dari TCNT1H ketika TCNT1L dibaca.
Dan TCNT1H diisi oleh register TEMP ketika register TCNT1L ditulis

III.

IV.
V.

Alat dan Bahan


1. Komputer
2. Trainer board Mikrokontroller AVR
3. Kabel USB

1 Unit
1 Unit
1 Buah

Setting Percobaan
Prosedur Percobaan
Prosedur Umum
1.

Secara keseluruhan beberapa percobaan dibawah ini menggunakan wizard sehingga


kode digenerate secara otomatis.

2.

Atur semua kode program yang ada kemudian diletakkan sesuai pada bagian-bagian
kode hasil generate wizard.

3.

Pastikan hasil compile tidak menghasilkan error dengan menekan F9.

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

Selanjutnya ketikan program berikut:


/****************************************************
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 Normal
Version : 1.0
Date : 2013-03-11
Author : Taufiqurrahman
Company : D206 - EEPIS
Comments: Timer 1 overflow interrupt service routine
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 BarLED PORTD
int kondisi=0;
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Reinitialize Timer 1 value
TCNT1H=0xD5;
TCNT1L=0xD0;

// Place your code here


if(kondisi){
BarLED=0xff;
kondisi=0;
}else{
BarLED=0x00;
kondisi=1;
}
}
// 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: 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
};
}

2. Generate delay 1 detik TIMER1 menggunakan mode CTC (Clear Timer on


Compare Match Interrupt)
Mekanisme berikut ini adalah membuat delay 1 detik pada timer 1. Agar
memperoleh waktu yang lebih presisi, didapatkan nilai Compare A = 2A2FH

/***************************************************
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)
{
// Place your code here
LED_DETIK=~LED_DETIK;
}
// 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
// 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
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: CTC top=OCR1A
// 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: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x0D;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x2A;
OCR1AL=0x2F;
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
// 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
};
}
3. Mengakses Timer0 sebagai Counter, penerima External Signal
Mengaktifkan fungsi T0 pada timer untuk menerima signal eksternal disimulasikan
menggunakan Push-Button yang terhubung dengan T0. Serta diimplementasikan pada
masukan sensor optocoupler yang sama sama terhubung pada T0.

Tambahkan program dalam fungsi void main di bagian while


Tetapi untuk mengakses optocoupler dengan LCD tidak bisa diakses bersamaan haru
memilih jumper 3 sesuai ilustrasi berikut ini.

4. Mengakses Timer0 sebagai counter dengan interrupt


Untuk membuat interrupt ketika timer0 difungsikan sebagai counter, dimana
ketika hitungan tercapai maka flag interrupt aktif. Berikut ini dibuat hitungan ke-6
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,

{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

LED[8]

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

Tugas
1. Jelaskan edge detector serta jelaskan jenisnya?
2. Apa perbedaan dan persamaan dari Digital Input, Eksternal Interrupt dan Timer

sebagai Counter
3. Jelaskan fungsi dari Prescaller pada timer AVR
4. Apa yang dimaksud dengan autoreload Timer, ilustrasikan!
5. Melibatkan ISR apa untuk interrupt pada timer sebagai counter, ilustrasikan
pada penggunaan vector interrupt berdasarkan dari percobaan anda diatas

I.

Analisa Dan Kesimpulan

Anda mungkin juga menyukai