Anda di halaman 1dari 11

Praktikum 3

AVR Timer
Pada modul ini peserta praktikum diharapkan mampu membuat program timer pada
mikrokontroller AVR

Gambar 7 : Diagram block Timer/counter 8 bit

Gambar 8: Prescaller Timer

Gambar 9: Register TIFR0

Gambar 10: TCCR0B


CS02
0
0
0
0
1
1
1
1

CS01
0
0
1
1
0
0
1
1

CS00
0
1
0
1
0
1
0
1

Description
No clock source (Timer/Counter stopped)
clk I /O /( No prescaling)
clk I /O /8(From prescaler)
clk I /O /64(From prescaler)
clk I /O /256(From prescaler)
clk I /O /1024(From prescaler)
External clock source on T0 pin. Clock on falling edge
External clock source on T0 pin. Clock on rising edge

Gambar 11: Prescaller timer


Mode

WGM2

WGM1

WGM0

Timer/counter

TOP

Update of

TOV Flag Set

on( 1) (2)
MAX
BOTTOM
MAX
MAX
BOTTOM

Mode of Operation

0
1

0
0

0
0

0
1

Normal
PWM, Phase

0xFF
0xFF

OCRx at
Immediate
TOP

2
3
4
5

0
0
1
1

1
1
0
0

0
1
0
1

correct
CTC
Fast PWM
Reserved
PWM, Phase

OCRA
0xFF
OCRA

Immediate
TOP
TOP

6
7

1
1

1
1

correct
Reserved
0
Fast PWM
1
OCRA BOTTOM
Gambar 12: Pembangkitan gelombn timer 0

TOP

Peralatan yang digunakan


1. Software Eclipse
2. Plugins AVR Eclipse
3. Toolset GCC-AVR compiler
4. AVR development board Xtal 16 MHz, BarLED portA, PushBtn1
5. Oscilloscpe
6. Frekuensi counter

Percobaan 1- Timer 0 Mode Normal


Pada percobaan ini peserta praktikum dikenalkan tentang konsep dasar timer pada AVR
Langkah Percobaan
1. Pasang modul arduino pada pc
2. Hubungkan probe oscilloscope dengan pin 13 (PORB bit 7)dari arduino
3. Jalankan eclipse
4. Isi kode berikut pada main,.c
#include <avr/io.h>
void TimerInit();
unsigned char periode;
int main(void) {
DDRB |= _BV(PB7);
TimerInit();
while(1) {
if (TIFR0&(1<<TOV0)) {
TCNT0 = (unsigned char)-31;
TIFR0|=(1<<TOV0);
PORTB ^= (1<<PB7);
}
}
}
void TimerInit(void) {
TCNT0 = (unsigned char) -62;
TCCR0B = (1<<CS00)|(1<<CS01);
}

5. Compile, upload lihat dengan oscilloscope dan analisa hasilnya

Percobaan 2-Timer 0 Mode Normal dengan Interrupt


Pada percobaan ini peserta praktikum dikenalkan tentang konsep dasar timer AVR

Gambar 14: TIMSK0

#include <avr/io.h>
#include <avr/interrupt.h>
Gambar 15:TIFR0
#include <avr/sleep.h>

Langkah Percobaan

void TimerInit();
1. Pasang modul arduino pada pc
unsigned char periode;

2. Hubungkan probe oscilloscope dengan pin 13 (PORB bit 7)dari arduino


3. Jalankan
eclipse
ISR
(TIMER0_OVF_vect)
{4. Isi kode berikut pada main,.c
PORTB ^=(1<<PB7);
TCNT0= -62;

}
int main (void) {
DDRB |=_BV(PB7);
TimerInit();
sei();
while (1){
sleep_mode();
}
}
void TimerInit(void) {
TCNT0=-62;
TCCR0B=(1<<CS00)|(1<<CS01);
TIMSK0 |=(1<<TOIE0);
}

5. Compile, upload lihat dengan oscilloscope dan analisa hasilnya

6. Generate frekuensi 1Khz, 2Khz, 4Khz, 16 Khz, 20Khz, 30Khz berturut turut untuk
kelompok sampai 6

Percobaan 3-Timer 0 Mode CTC


Pada percobaan ini peserta praktikum dikenalkan tentang penggunaan timer dengan
menggunakan mode CTC

gambar 17: Timer CTC

Gambar 18: TCCR0A


COM0A1
0
0
1
1

COM0A0
0
1
0
1

Description
Normal port operation, OC0B disconnected
Toggle OC0B on Compare Match
Clear OC0B on Compare Match
Set OC0B on Compare Match
Gambar 20: Mode Compare output non PWM

Langkah Percobaan
1. Pasang modul arduino pada pc
2. Hubungkan probe oscilloscope dengan pin 13 (PORB bit 7)dari arduino
3. Jalankan eclipse

4. Isi kode berikut pada main.c


#include <avr/io.h>
void TimerInit ();
unsigned char periode ;
int main (void) {
DDRB |=_BV(PB7);
TimerInit();
while (1) {
if (TIFR0&(1<<OCF0A)){
PORTB ^= (1<<PB7);
TIFR0 |= (1<<OCF0A);
}
}
}
void TimerInit (void) {
TCCR0B = (1<<CS01);
TCCR0A |=_BV(WGM01);
OCR0A = 50;
}

5. Compile, upload lihat dengan oscilloscope untuk pin arduino no 13 kemudin analisa
6. Generate frekuensi 200Khz, 2Khz, 4Khz, 16 Khz, 20Khz, 300Khz berturut turut
untuk kelompok sampai 6

Percobaan 4-Timer 0 Mode CTC dengan Interrupt


Pada percobaan ini peserta praktikum dikenalkan tentang penggunaan dengan menggunakan
mode CTC
Langkah Percobaan
1. Pasang modul arduino pada pc
2. Hubungkan probe oscilloscope dengan pin 13 (PORB bit 7)dari arduino
3. Jalankan
eclipse
#include
<avr/io.h>
4. Isi kode<avr/interrupt.h>
berikut pada main,.c
#include
#include <avr/sleep.h>

1. Compile, upload lihat dengan oscilloscope untuk pin arduino no 13 kemudin analisa
void TimerInit();
unsigned char periode;

ISR(TIMER0_COMPA_vect)
{
PORTB ^=(1<<PB7);
}
int main (void){
DDRB |=_BV(PB7);
TimerInit();
sei();
while(1){
sleep_mode();
}
}
5. Compile, upload lihat dengan oscilloscope untuk pin arduino no 13 kemudin analisa
void TimerInit (void){
6. Generate
1Khz, 2Khz, 4Khz, 16 Khz, 20Khz, 30Khz berturut turut untuk
TCCR0B frekuensi
= (1<<CS01);
TIMSK0 |= (1<<OCIE0A);
TCCR0A |=_BV(WGM01);
OCR0A=50;
}

kelompok sampai 6

Percobaan 5-Timer 0 dengan 0C0A enable


Peserta praktikum dikenalkan tentang penggunaan timer dengan menggunakan mode CTC
Langkah Percobaan
1. Pasang modul arduino pada pc
2. Hubungkan probe oscilloscope dengan pin 13 (PORB bit 7)dari arduino
3. Jalankan eclipse
4. Isi kode berikut pada main,.c

#include <avr/io.h>
void TimerInit();
unsigned char periode;
int main(void) {
DDRB |=_BV(PB7);
TimerInit();
while (1){
}
}
void TimerInit(void){
TCCR0B=(1<<CS01);
OCR0A=50;
TCCR0A |=_BV(WGM01);
TCCR0A |=(1<<COM0A0);
}

5. Compile, upload l
Lihat dengan oscilloscope untuk pin arduino no 13 kemudin analisa

Praktikum Mikrkontroller
Tanggal 21 April 2016
Laboratorium Embedded
1. Dian Sekar R
2. M.Nurul Qomar
Diketahui : f = 20Khz
T= 1/f = 50 us

JUDUL PRAKTIKUM
AVR TIMER

Frekuensi : 4kHz
T = 1/Frekuensi = 1/4000 = 0,25 ms (delay) utk Tlow saja maka = 0,125 ms = 125us
Prescaller yang cocok untuk nilai 0,25ms adalah psc 64
Tick pada psc 64 yaitu 4us dengan nilain OVF 1ms
Counter = delay/tick = 250 us/ 4 us = 31
Percobaan 1
Pada percobaan 1 nilai TCNT akan terus menerus mengalami kenaikan clock tiap
diclock (counter up). Jika sudah mencapai maximumnya nilai TCNT akan kembali dan
menggeser bit TOV0 diregister TIFR0. Waktu interval dapat dirubah rubah dengan merubah
TCNT. Semakin kecil nilai TCNT semakin kecil pula waktu intervalnya .
Percobaan 2
Pada awal program dalam fungsi timer init TCNT diberi nilai -31 maka TCNT akan
terus mengalami kenaikan , ketika mencapai nilai, maka bit TOIE0 sebagai enable overflow
interrupt akan enable sehingga program berpindah ke ISR .ISR = portbit flip kemudian
TCNT bernilai -31 kemudian TCNT mengalami kenaikan lagi. Begitu sistem kerjanya
Percobaan 3
Pada percobaan 3, timer 0 mode CTC. Mode ini membandingkan antara nilai
hitungan(counter) TCNT dengan nilai OCR. Ketika nilai OCR=TCNT maka akan terjadi
overflow begitu seterusnya.
Percobaan 4

Pada percobaan 4,frekuensi dibangkitkan dengan timer mode CTC seperti program 3,
hanya saja memanfaatkan interrupt sebagai reset. Program dimulai dengan mengatur nilai
counter TCNT0 bernilai 31. kemudian compare match interrupt diaktifkan dengan TIMSK0 |
= (1<<OCIE0A), setelah itu aktifkan timer CTC.
Percobaan 5
Pada percobaan ke 5 timer dengan OC0A enable kita mengatur nilai OCR0A = 31
( counter) . Untuk perintah TCCR0A |= (1<< COMOA0) berarti mengatur OCR0A pada pin
13 arduino mega mengalami toggle ketika counter = OCR0A compare match

ANALISA :
Timer merupakan counter yang berubah akibat adanya perubahan clock, sumber clock
terdiri dari 2, yaitu clock periodik yang menghasilkan counter sinkron(periodik) dan clock
aperiodik yang akan menghasilkan counter asinkron.
Penggunaan timer pada mikrokontroller dapat dibuat dengan berbagai mode.
Diantaranya mode Normal, mode Normal dengan Interrupt, mode CTC, mode CTC dengan
Interrupt dan mode OC0A enable.
Pada praktikum dengan menggunakan mode Normal, maka terdapat sub program
yang menyatakan set bit TOV0 pada register TIFR0 (register overflow) hal tersebut
dilakukan karena pada mode Normal ini, selalu memiliki logika high terus maka untuk
mengembalikan logika ke low maka dibutuhkan set bit tersebut (proses reset)
. . .while(1) {
if (TIFR0&(1<<TOV0))//REGISTER OVERFLOW
{
TCNT0 = (unsigned char)-31;
TIFR0|=(1<<TOV0);//SET BIT UTK RESET OVF
PORTB ^= (1<<PB7); . ..

Digunakan untuk melaksanakan pekerjaan yang berulang dgn interval tertentu juga
bisa digunakan utuk membuat delay. Nilai TCNT akan terus menerus mengalami kenaikan
tiap di clock oleh simber clok yg sudah dipilih. Jika sudah mencapai maksimumnya nilai
TCNT akan kembali 0 dan mengeset bit Flag TOV0 di register TIFR. Waktu interval dapat
dirubah rubah dengan merubah nilai maximum TCNT. Makin kecil nilai maximum TCNT
makin kecil pula waktu intervalnya.
Mode normal dengan interrupt juga dapat dilakukan. Untuk mode ini tidak perlu set
bit untuk mereset overflow, karena hal tersebut dilakukan secara hardware. Dan proses reset
overflow dilakukan di ISR. Untuk while (1) sleeping mode.
...

ISR (TIMER0_OVF_vect)
{
PORTB ^=(1<<PB7);
TCNT0= -31; . . .

Timer 0 dengan mode CTC (clear timer on compare match) . TCNT0 akan count up
dari suatu nilai sampai mencapai nilai maks (< 0xFF) Nilai maks ini didefinisikan di register
OCR0 Setelah mencapai nilai maks, TCNT0 akan reset kembali ke 0x00 dan bit OCF0
(output compare flag) akan set. Dan untuk mode CTC dengan interrupt hampir sama dan
interupsi akan terjadi jika di-enable.
KESIMPULAN :
Pada pratikum modul 4 digunakan Timer 0 dengan 256bit hitungan dan digunakan mode
Timer interrupt,Timer,CTC dan CTC interrupt. Untuk menghasilkan frekuensi 4khz maka
register TCNT0 di isi sesuai perhitungan diatas maka TCNT0=(unsigned char)-31. Maka
TCNT0 akan menghitung mulai dari 224 sampai 255 yang totalnya 31 hitungan setelah itu
terjadi overflow . Namun untuk mode compare nilai OCR0A di isikan dengan perhitungan
diatas. Maka setelah nilai TCNT0 sama dengan nilai OCRA akan terjadi overflow. Untuk
penggunakan interrupt untuk mengflip output dan pengisian nilai tcnt dimasukkan pada
progam berada di ISR. Namun pada penggunaan non interrupt di lakukan pada while(i) dan
dilakukan clear flag Hal ini agar hitungan tidak kembali dari 0.
Perbedaan TIMER 0 mode dg interrupt dan noninterupt dapat dilihat :
Interrupt
ISR(TIMER0_OVF_vect)
{
PORTB^=(1<<PB7);
TCNT0=(unsigned char)-125;
}

Non interupt
if(TIFRO&(1<<TOVO)){
PORTB^=(1<<PB7);
TCNT0=(unsigned char)-125;
TIFRO|=(1<<TOVO);
}

Anda mungkin juga menyukai