Timer di AVR
Timer dalam embendded system sangat banyak kegunaannya.Itulah karenanya setiap mikrokontroler terdapat fitur timer. Mikrokontroller AVR keluaran Atmel memiliki beberapa timer(ATmega16 dalam hal ini,tipe lain yang lebih tinggi sama ,kecuali penambahan jumlah timernya),diantaranya timer0(8 bit),timer1(16 bit),dan timer2(8 bit).
Timer0 dan timer2(8 bit).
timer ini menghitung maksimal 255 hitungan.dimana periode setiap hitungan(detaknya) tergantung dari setting prescaler-nya. Untuk mengatur timer mode operasi apa yang digunakan dan mengatur prescaler digunakan register TCCRx(x=0,2).TCCRx adalah register 8 bit sebagai berikut:
FOC0 WGM00 COM01 COM00 WGM01 CS2 CS1 CS0
7 6 5 4 3 2 1 0
CS0,CS1,CS2 digunakan untuk pengaturan prescaller, misalnya
0 0 0 : timer dihentikan jika diset nilai ini
0 0 1 : sekali detaknya sama dengan detak oscillator crystal yang digunakan
0 1 0 : sekali detaknya sama dengan oscillator/8.misalnya oscilator 8 MHZ,maka sekali detak 1 perlu 1 mikrodetik.atau pada hitungan maksimal 255 us.
(atau clock berdetak 8 kali,timer baru sekali)
ànilai cs0,1,2 lain dapat dilihat di datasheetnya.
WGM00 dan WGM 01 digunakan untuk mode operasi dari timer,
Mode-Mode kerja Timer
1.mode normal,timer digunakan untuk ngitung saja,membuat delay,menghitung selang waktu .
2.mode PWM,phase correct
3.CTC,dalam mode ini ,nilai timer yang ada pada TCNTx akan di nol-kan lagi jika TCTx sudah match dengan nilai yang ada pada register OCRx.sebelumnya OCR diset dulu,.karena timer0 dan 2maksimumnya 255,maka range OCR 0-255.
4.Fast PWM
COM00,01:tergantung mode apa yang digunakan(nilaiWGM),COM00,01 untuk pengaturan lebih spesifik suatu mode timer.
Jadi hal utama jika akan menggunakan tiemr adalah setting TCCRx-nya,digunakan untuk mode apa(secara default,adalah sebagai mode normal).dan ketika saat timer jalan,jumlah hitungannya dapat dilihat Di register TCNTx.
Jika menggunakan compiler Seperti CodeVision ,penggunaannya auto generated,namun walaupun begitu ketika troubleshoot program setting manual adalah penting.
Interrupt Timer
1.Overflow Interrupt,akan terjadi interrupt jika TCNTx mencapai 255 untuk timer0 dan timer2 ,dan 65535 untuk timer1.
2.Compare Match interrupt,terjadi jika nilai OCR sama dengan TCNTx
Contoh Aplikasi:
1. Jam digital.
Digunakan Compare Match Interrupt,menggunakan crystal 12 MHZ,digunakan timer 0
Dengan prescaller Osc/8: 12mhz/8=1,5 mhz periode 1/1,5mhz==sekitar 100 us,jadi agar setara 1 detik harus dikali 10000.
Register OCR=0×96.
Output :tampilan Jam:Menit:Detik pada port C yang terhubung dengan LCD 2×16
/*********************************************
Project : jam digital
Date : 7/13/2007
Author : edee
Chip type : ATmega16
Program type : Application
Clock frequency : 12.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*********************************************/
#include <mega16.h>
#include <stdlib.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0×15
#endasm
#include <lcd.h>
unsigned int kdetik=0,detik=0,menit=0,jam=0;
unsigned char cdetik[10],cmenit[10],cjam[10];
// interrupt jika compare match
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
TCNT0=0; //jika sudah compare match,set awal lagi
if(++kdetik==10000)
{
if(++detik==60)
{ detik=0;
lcd_clear();
if(++menit==60)
{ menit=0;
lcd_clear();
if(++jam==24)
{
jam=0;
lcd_clear();
}
}
}
kdetik=0;
itoa(detik,cdetik);
itoa(menit,cmenit);
itoa(jam,cjam);
lcd_gotoxy(9,0);
lcd_putsf(“:”);
lcd_gotoxy(10,0);
lcd_puts(cdetik);
lcd_gotoxy(6,0);
lcd_putsf(“:”);
lcd_gotoxy(7,0);
lcd_puts(cmenit);
lcd_gotoxy(4,0);
lcd_puts(cjam);
lcd_gotoxy(0,1);
lcd_putsf(“= Jam Digital =”);
}
}
void main(void)
{
//PA.5,6,7 input,dengan pull up
PORTA=0xE0;
DDRA=0×00;
PORTB=0×00;
DDRB=0×00;
PORTC=0×00;
DDRC=0×00;
PORTD=0×00;
DDRD=0×00;
//timer 0 sumber 12mhz/8=1,5 mhz periode 1/1,5mhz
TCCR0=0×02;
TCNT0=0×00;
OCR0=0×96; //sekitar 100us
TCCR1A=0×00;
TCCR1B=0×00;
TCNT1H=0×00;
TCNT1L=0×00;
OCR1AH=0×00;
OCR1AL=0×00;
OCR1BH=0×00;
OCR1BL=0×00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0×00;
TCCR2=0×00;
TCNT2=0×00;
OCR2=0×00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0×00;
MCUCSR=0×00;
// interrupt timer digunakan
TIMSK=0×02;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0×80;
SFIOR=0×00;
lcd_init(16);
#asm(“sei”)
while (1)
{
};
}
2.Pengukur selang waktu
Dalam aplikasi ini timer digunakan untuk mengukur selang waktu dua kejadian,dimulai start dan stop(tanpa menggunakan interrupt apapun)
Deklarasi awal:
#define TSTART() TCCR1B = 0×02
//stop timer
#define TSTOP() TCCR1B = 0×00
#define TRESET() TCNT1=0×00
#define THABIS 65000
Penggunaan di program:
TSTART();
while(PINB.0!=1) //jika syarat stop terpenuhi
{
hitung++;
if(hitung==THABIS) //sampai nilai max
{ //j=0; // return 0;
break;
}
}
TSTOP();
t=TCNT1;
akhir2 ini sering pake timer.
47 comments so far
Leave a reply


numpang tanya dong,,,
kalau aplikasi timer untuk menggerakkan 18 buah servo secara hampir bersamaan dengan sudut yang berbeda bagaimana??
mohon bantuannya,,,,
dalam hal ini saya menggunakan ATmega32,,,
terima kasih,,,
seingettku motor servo nge drive nya dengan pwm yaa?,dimana besar sudut setara dengan lebar pulsa(high) pwm dlm satu periode secara periodik.jadi pakae timer juga bisa,masalahnya kan jumlah timer atmega32 terbatas,Gimana kalau pakai multiplexer?.jadi pakai satu timer aja,gantian.mau bikin robot berkaki yach
butuh pertolongan,,
gmn kalo menhitung selang waktu antara inputan pertama dengan inputan berikutnya,trus hasil penghitungan selang waktu tersebut dijadikan input untuk menggerakkan motor steper???
mohon pertolongannya..
terima ksih bnyk bgt..
saya masih bingun soal timer dan counter pada mikro.
soalnya saya baru mengenal mikro 3 bulan yang lalu.
mohon bantuannya donk mengenai hal tersebut.
dan moho satu contoh program sederhana dengan aplikasi tiner dan counter.contohnya lampu kedip.
trimakasih byak……….???
==@ZUHDI
untuk menghitung selang waktu dua kejadian dengan timer,dapat menfaatkan fitur external interrupt pin pada AVR(INT0,INT1…dll),eksternal interrupt yang terjadi dimanfaatkan untuk mengatifkan timer,nah output dari timer ini bisa di konvert ke satuan yang diinginkan, us,milisekon,sekon dll.
==@JOko
untuk mempelajari timer(dan fitur lainnya),yang penting itu pelajari register2nya!!,kalo timer register yg dgunakan TCCR(ngeset mode kerja) dan TCNT(pnampung hitungan),dan register lain ,di datasheet diterangkan dgn jelas.
yup.. avr emang lebih mantap apalagi kalau programmingnya pakai bahasa C plus Code Vision.
iya
,tp mo migrasi ke avr-gcc dgan ide avr studio,kan gratis,open source gtu
klo pake x-tal yg 4MHz n 12MHz pengaruh ga sih sama itungan timernya?
ngaruh mas momogie…
minta bantu kasih contoh program mengukur selang waktu menggunakan timer dengan memanfaatkan eksternal interrupt int0 dan int1… dan cara mengkonvert output dari timer ke us or ms…
klo bisa cepat ya.. soalnya kurang ngerti mikro.. klo bisa contohnya lengkap kayak contoh jam digital..
mksh…
hohoho
bzi skali skrang aq….
misalnya kamu capture kejadian 1 di INT0 dan kejadian 2 di INT1,
menggunakan timer1(16bit-max 65535 tik)
//aktif jika int0 ada input,awal kejadian
interupt external_0
{
start timer1
}
//aktif jika int1 ada input,akhir kejadian
interupt external_1
{
stop timer1
waktu=mikro_sekon+konvert_us(TCNT)
tampilkan LCD
TCNT=0;
}
//
interupt timer1overflow
{
mikro_secon++
}
konvert_us adalah rutin pengubah ke us,tergantung menggunakan crystal dan prescaler timer berapa
thanks ya dah dijawab..
jika menggunakan crystal 11.059.200…. trus prescaler 1024, 256, 64, 8 bedanya apa??
oh iya sekalian nanya dari contoh jam digital..
Dengan prescaller Osc/8: 12mhz/8=1,5 mhz periode 1/1,5mhz==sekitar 100 us,jadi agar setara 1 detik harus dikali 10000.
Register OCR=0×96.
prtanyaanya periode 1/1,5mhz == sekitar 100us cara ngitungnya gmn?
trus register ocr=0×96 buat ngatur apa??
sorry nanya mulu.. coz baru belajar…
oth3rside…..
tolong dong yang lengkap mslah selang waktu… soalnya dicobain gak bisa2 eum.. aku pengen seperti proyek jam digital dicoba langsung jalan…
tolong ya ya ya…
klo bisa cepet… biar lansung dicoba n berhasil…
aku tunggu jawabannya,,
tolong dong yang bsa ngajarin timer….
aku gak ngerti….
aku mau belajar private
klo da yang bisa email za ke
dikdik_w4hyu@yahoo.com
@aku-1
Jika digunakan sumber crystal dengan nilai berbeda tentu menghitungnya juga berbeda.Prescaler digunakan
untuk mengatur besarnya frekuensi Timer berdasarkan nilai dari crystal yang digunakan
misalnya crystal 11,059 Mhz dengan prescaler 8,maka frekuensi timer = 11,059 dibagi 8 = 1.382375 Mhz -> Nilai menunjukkan dalam sedetik timer menyampling 1.3 juta kali.
periode=1/f=1/1.3juta=0.76923 mikrosecon
jadi setiap 0.76923 us,register TCNT nambah satu bit.
@aku-2
cara ngitung spt diatas,
register OCR(on compare register),pada program jam digital diatas saya gunakan untuk, interupt comapre match–interupt yang terjadi jika register OCR= TCNT—
pda program jam digital:
nilai 0×96(hexa)= 150 desimal
100 us didapat dari 150 x perioda timer
=150 x 0.666667 us
=100 us
@aku-3
)
namanya mencoba kan tdak harus langsung bisa
(buzy TA mas,bsok senin ini sidang ,doakan sukses ya
@dk
tempat belajar otodidak: http://www.avrfreaks.com
Nice Place……
otherside………
mau tanya boleh gak aku private ke km….
bingung nyari pengajar..
klo boleh tau alamat dan no. telpnya….
biar enak nanyanya langsung..
bisa di email ke
dikdik_w4hyu@yahoo,com
saya berharap bgt ma kamu…
tolong blz,,,,,
ruarr biazaaaa mas otherside ini…serba bisa euy! btw mas uda punya ce blum? pasti mpe kewalahan y nolak2 ce cz pinternya selangiiittt….
peace mas propesor
@ DK
Add aja Instant messenger ku: edieryhjce[at]yahoo.com
@meep

pEhhh,ahli efek doopler mampir lagi…….
aq ga bisa mbedakan pujian n hinaanmu
jadi drpada aku salah sangka(kpala membesar-eh besar kepala)
jadi di sama rata aj,itu adalah HINAAN
Ce ?
huw bout 4pri*ia? apa ada penawaran heheheh
waakakakkakakkk
*******
********
(hadoh…ojo nyebut nama prop…off the record…)
mas otherside…
aku dah nyoba program selang waktu
kyak yang dibawah ini, eror gak ada.. cuman belum jalan… gmn ya??? kurang apalagi.. trus cara nampilin ke LCDnya jg belum bisa…
#include
#include
#define start_timer1()TCCR1B=0×02
#define stop_timer1()TCCR1B=0×00
#define reset_timer1()TCNT1=0×00
#define habis_timer1()65000
#include
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0×15 ;PORTC
#endasm
#include
unsigned int mikro_secon;
unsigned int waktu;
unsigned int konvert_us;
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
start_timer1();
}
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
// Place your code here
stop_timer1();
waktu=mikro_secon+++konvert_us;
TCNT0=0;
}
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Place your code here
mikro_secon++;
}
tolong bantuannya…. pusing eum…
mas otherside….
kok coment yang aku hilang…
yang beserta program yang minta dikoeksiin…
gmn mas bisa ajarin gak?? minta no telp…
mas otherside bisa minta ketemuaan gak???
minggu besok tgl 27.. aku mau belajar ke kamu..
masalah program bahasa c..
biaya lain2 ada…
jadi private sehari gitu…
klo bisa kirim no. telp km ke dikdik_EL05@yahoo.com
tolong bgt ya bisa…
mas otherside…
aku dah nyoba program selang waktu
kyak yang dibawah ini, eror gak ada.. cuman belum jalan… gmn ya??? kurang apalagi.. trus cara nampilin ke LCDnya jg belum bisa…
#include
#include
#define start_timer1()TCCR1B=0×02
#define stop_timer1()TCCR1B=0×00
#define reset_timer1()TCNT1=0×00
#define habis_timer1()65000
#include
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0×15 ;PORTC
#endasm
#include
unsigned int mikro_secon;
unsigned int waktu;
unsigned int konvert_us;
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
start_timer1();
}
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
// Place your code here
stop_timer1();
waktu=mikro_secon+++konvert_us;
TCNT0=0;
}
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Place your code here
mikro_secon++;
}
tolong bantuannya…. pusing eum…
mas otherside…
aku dah nyoba program selang waktu
kyak yang dibawah ini, eror gak ada.. cuman belum jalan… gmn ya??? kurang apalagi.. trus cara nampilin ke LCDnya jg belum bisa…
#define start_timer1()TCCR1B=0×02
#define stop_timer1()TCCR1B=0×00
#define reset_timer1()TCNT1=0×00
#define habis_timer1()65000
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0×15 ;PORTC
#endasm
unsigned int mikro_secon;
unsigned int waktu;
unsigned int konvert_us;
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
start_timer1();
}
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
// Place your code here
stop_timer1();
waktu=mikro_secon+++konvert_us;
TCNT0=0;
}
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Place your code here
mikro_secon++;
}
tolong bantuannya…. pusing eum…
mas mau nanya nih…ak kan lagi buat TA make mikro, tapi ada masalah di pas ngedelaynya, ni penggalan prog buatan ak. mas
if (PINB==0){ PORTD.0=0;delay_ms(1000);PORTB.1=1;};
if (PINB==1){PORTD.0=1;delay_ms(9000); PORTB.1=0;};
nah masalahnya saat program dijalankan delay yg 1000 gak jalan sesuai nilainya, tapi ngikut delay 9000, nah pas delaynya di ilangi jg tetep ikut ke delay juga,.kerjanya. mohon bantuanya mas….klo bisa cepet yah thanks before
pada “if(PINB==0)” itu PINB yang mana?(0-7), kalau nulisnya gitu, PINB hrs sbg input semua dan harus 0 semua agar syarat terpenuhi.padahal di setelahnya kamu menggunakan portB sebagai output–> PORTB.1=1 (contradiktif). cek register DDRB-nya
oh ya mas ni prog yang benernya.
if(PINB.0==0){PORTD.0=0;delay_ms(1000);PORTB.1=1;}
if (PINB.0==1){PORTD.0=1;delay_ms(9000);PORTB.1=0;} settingan PORT B dah bener PORTB=0×00;DDRB=0xFE; maaf kemaren salah ketik , mohon bantuanya mas thanks before
aku mau nanya ja….
TUGAS AKHIR AKU BISA SELESAI GAK YA??????
masalah… ketika beda fasa sensor mendeteksi cosphi jelek mikro kontak relay buat aktif kapasitor tuk kompensasi.. setelah kapasitor aktif relay mendeteksi cosphi bagus maka mikro nyuruh agar relay off dan kapasitor off… sedangkan beban induktif masih kerja.. setelah kapasitor off cosphi jelek lagi…
nanti bolak-balik////////
bisa gak???
jadi ketika perbaikan cosphi telah diperbaiki kapasitor tidak off melainkan masuk ke program yang berbeda tuk scan beda fasa setelah kompensasi….
mohon petunjuk
tetep gak bisa mas,…matinya PORTD.0 dan nyalanya PORTB.1 tetep kedelay walaupun delaynya sudah dihapus…. mohon bantuanya.
leh nanya neh
LCD gw kok petak2 penuh, bagian atas doang!!!
ga da dihubungin kamana2 kok tetep dituuu:(
dah ku coba program beulang2 ga juga da perubahan tatep
walau cuman teg 5 doank yang di beri, kaki yang laen ga kemana2 tetep seperti ituuu
kenapa yahhhh
to ERI:
delay yang tidak sesuai dapat disebabkan karena pemilihan crystal clock untuk uC yang salah
aturfuse bitnya di CKSEL.lbih lengkap ttCKSEL dpat dbaca di dtasheet
to AJO:
kalo dihubungkan 5 volt aj,pin yang lain ga ya emang gitu(biasanya)
mas,minta tolong donk…
saya mau menghitung RPM(rotasi per menit) dari motor DC.
saya menggunakan sensor optocoupler…
jadi rencananya khan keluaran optocouplernya masuk ke pin eksternal interrupt…Catatan:anggap aja jumlah warna hitam putih pada gear masing-masing 4 jadi satu putaran itu terjadi misalnya 4 kali rising edge…
nah,mas bisa tidak saya minta tolong dituliskan programnya…klo bisa lengkap dengan setting-settinganya di code vision,ya…secepatnya ya mas…thanks before…
sorry,kayaknya belum terlalu jelas penjelasan saya yg sebelumnya mas,,,
catatan:
1. kecepatan putar motor berubah-ubah
(tergantung input dari PWMnya)…
2. diinginkan RPMnya ditampilkan ke LCD
3. keluran optocouplerya masing-masing 0.7 V & 5 V
4. jumlah terjadinya rising edge pd satu rotasi=4
5. sekalian dgn setting2nya ya, mas…
sorry,,,klo saya merepotkan…
sebelumnya:
thanks banget….
saya lagi buat jam digital, tapi masih belum ketemu programnya, tampilannya menggunakan Seven Segment,tanpa IC BCD,jadi langsuung ke port mikro,dan data2 tiap 7segment paralel(multiplex).mohon pencerahannya mas.terimakasih,jawabannya kirimkan jg ke email saya mas
jam digital di posting diatas hanya untuk contoh penggunaan timer, jadi tidak presisi, kalo untuk jam digital beneran.
kalo mo bwat jam digital,pbisa pakai ic RTC atau memanfaatkan RTC internal di uC AVR (dibeberapa tipe sudah ada,spt atmega16,32, dll)
mungkin aj langsung pakai port uC, kan bnyak port tersedia
minta bantuan nya dunk..
leh g mnta program yang ngtung dri 0 ampe 9, trus bsa trundri 9 ke 0….
krimin k email aq y
skyfirst@ymail.com
@Lufi
Do.It.be Yourself, it’s very fun. Good project for learning….., Okayyyy?
mas Q da beli buku mK AVR ATmega16 karangan Heri Andrianto.
jadi Q coba program jam digital, terus berhasil tapi jika mati lampu dia set dari awal lagi…
jadi gimana cara mengembangkan program agar mengeset dengan menggunakan saklar push botton.
blz ke email aku y mas
kalau 0CR0 DAH KETEMU NILAINYA”kemudian dari 100us tadi agar setara 1detik harus dikalikan 10.000″ nilai sepuluh ribu darimana ya mas…belum ngeh nih
10.000 adalah variabel pengali yang kita berikan di program. coba liat di kode program mulai :
if(++kdetik==10000)
{
if(++detik==60)
….
….
setiap ada interrupt variabel kdetik nambah 1, berulang terus sampai 10.000, baru var detik nambah satu. var detik nambah terus sampai 60 baru kmudian var menit nambah 1 dst.
mas, kalo kita pake timer buat mode normal (tanpa interrupt), kita ngeset 1 detiknya gimana?
masalahnya nantinya saya pengen perulangan tetapi naiknya perdetik, bukan perhitungan timer mikro soale bingungi…
contohnya gini mas:
void main ()
{
while 1()
{
while (i< 10) /*10 di sini q pengennya 10 detik gitu, bukan 10 hitungan mikro*/
{
………;
i++;
}
}
biar bisa kaya gitu gimana ya mas?
kalo pingin spt itu gunakan saja delay_ms(1000)~ 1 detik kan?
kalo pake codevision & avr-gcc hrus include delay.h
smg mmbantu
kira” di AVR bisa pake delay di bawah 1us ga???
soalnya kemaren pengen coba bangkitin gel kotak dengan frek 5us…tapi pas pake delay_us(5)>>>>terukur di osiloscop malah 50us
1 us sptnya sudah sangat kecil. periode 5 us maksudnya? atau 5 Hz?
ditengok lagi tentang apa “Frekuensi” dan “periode” …:-)
mas, tau g source code menghitung rpm dengan optocoupler. Klo tau pliz kasih tau ya!
ato email ke dhee_must18@yahoo.com!