Timer / Counter Hendawan Soebhakti November 2009
Sub Pokok Bahasan
Jenis Timer/Counter Register TIMSK dan TIFR Interrupt Timer
Sistem Mikrokontroler - By : Hendawan Soebhakti
2
Timer/Counter Jenis-jenis Timer Pada ATMega8535L terdapat 4 buah fasilitas timer yaitu : Timer 0 : Adalah timer 8 bit dengan timer value 00 s/d FF Timer 1 : Adalah timer 16 bit dengan timer value 0000 s/d FFFF Timer 2 : Adalah timer 8 bit dengan timer value 00 s/d FF Watchdog timer : Adalah timer untuk mereset sendiri Timer pada dasarnya hanya menghitung pulsa clock. Frekuensi pulsa clock yang dihitung tersebut bisa sama dengan frekuensi crystal yang dipasang atau dapat diperlambat menggunakan prescaler dengan faktor 8, 64, 256 atau 1024. Sedangkan Counter menghitung pulsa pada pin Tn dan tidak bisa diperlambat seperti halnya timer.
Sistem Mikrokontroler - By : Hendawan Soebhakti
3
Timer 8 bit Maximum Value TCNTx=FF
FF Timer Overflow TOV=1
Initial Value Put in TCNTx
TMAX = 1/fCLK x (FF+1)xN TMAX fCLK N
: Waktu maksimum timer : Frekuensi clock : Prescaler
Example : fCLK = 8MHz Prescaler =1024
7F ... 03
Zero TCNTx=00
02 01 00
00
TMAX = 1/fCLK x (FF+1) x N = 0.125uS x 256 x 1024 = 32768uS = 32.768mS
8-bit Up Counter
Sistem Mikrokontroler - By : Hendawan Soebhakti
4
Timer 16 bit Maximum Value TCNTxH=FF, TCNTxL=FF
FFFF Timer Overflow TOV=1
Initial Value Put in TCNTxH & TCNTxL
TMAX = 1/fCLK x (FFFF+1)xN TMAX fCLK N
: Waktu maksimum timer : Frekuensi clock : Prescaler
Example : fCLK = 8MHz Prescaler =1024
007F ... 0003 0002 0001 0000
Zero TCNTxH=00, TCNTxL=00
0000
TMAX = 1/fCLK x (FFFF+1) x N = 0.125uS x 65536 x 1024 = 8388608 uS = 8.388608 S
16-bit Up Counter
Sistem Mikrokontroler - By : Hendawan Soebhakti
5
Timer Value (TCNT) Untuk menentukan berapa timer value yang harus diisikan ke TCNT agar menghasilkan waktu timer tang kita inginkan dapat dihitung dengan persamaan sbb : Timer 8 bit :
TCNT=(FF+1)-((Ttimer x fCLK)/N)
Timer 16 bit : TCNT=(FFFF+1)-((Ttimer x fCLK)/N) Contoh : Diinginkan sebuah timer 16 bit bekerja selama 1 detik, dengan frekuensi clock sebesar 11,0592MHz dan presecaller 1024 maka diperoleh nilai TCNT sebesar : TCNT=(FFFF+1) - ((Ttimer x fCLK)/N) TCNT=(FFFF+1) - ((1 x 11059200)/1024) TCNT=10000h - 10800d TCNT=10000h - 2A30h TCNT=D5D0h Dengan demikian nilai TCNTH = D5h dan TCNTL = D0h Sistem Mikrokontroler - By : Hendawan Soebhakti
6
Register TIMSK dan TIFR Timer Interrupt Mask Register (TIMSK) dan Timer Interrupt Flag (TIFR) Register digunakan untuk mengendalikan interrupt mana yang diaktifkan dengan cara melakukan setting pada TIMSK dan untuk mengetahui interrupt mana yang sedang terjadi. 7
6
5
4
3
2
1
0
OCIE2
TOIE 2
TICIE 1
OCIE 1A
OCIE1B
TOIE1
OCIE0
TOIE 0
TIMSK / Timer/Counter Interrupt Mask Register
Bit
Symbol
Fuction
7
OCIE2
Timer /Counter2 Output Compare Match Interrupt Enable.
6
TOIE2
Timer /Counter2 Overflow Interrupt Enable.
5
TICIE1
Timer 1 Input Capture Interrupt Enable
4
OCIE1A
Timer /Counter1A Output Compare Match Interrupt Enable.
3
OCIE1B
Timer /Counter1B Output Compare Match Interrupt Enable.
2
TOIE1
Timer /Counter1 Overflow Interrupt Enable.
4
OCIE0
Timer /Counter0 Output Compare Match Interrupt Enable.
0
TOIE0
Timer /Counter0 Overflow Interrupt Enable.
Sistem Mikrokontroler - By : Hendawan Soebhakti
7
Register TIMSK dan TIFR 7
6
5
4
3
2
1
0
OCF2
TOV2
ICF 1
OCF1A
OCF1B
TOV1
OCF0
TOV0
TIFR / Timer/Counter Interrupt Flag Register
Bit
Symbol
Fuction
7
OCF2
Output Compare Flag2.
6
TOV2
Timer /Counter2 Overflow Flag.
5
ICF1
Timer 1 Input Capture Interrupt Flag
4
OCF1A
Output Compare Flag1A.
3
OCF1B
Output Compare Flag1B.
2
TOV1
Timer /Counter1 Overflow Flag.
4
OCF0
Output Compare Flag0.
0
TOV0
Timer /Counter0 Overflow Flag.
Sistem Mikrokontroler - By : Hendawan Soebhakti
8
Interrupt Timer Interrupt yang dapat dihasilkan dari timer adalah sbb : Vector No
Program Address
Source
Interrupt Definition
4
0x0003
TIMER2 COMP
Timer/Counter2 Compare Match
5
0x0004
TIMER2 OVF
Timer/Counter2 Overflow
6
0x0005
TIMER1 CAPT
Timer/Counter1 Capture Event
7
0x0006
TIMER1 COMPA
Timer/Counter1 Compare Match A
8
0x0007
TIMER1 COMPB
Timer/Counter1 Compare Match B
9
0x0008
TIMER1 OVF
Timer/Counter1 Overflow
10
0x0009
TIMER0 OVF
Timer/Counter0 Overflow
20
0x0013
TIMER0 COMP
Timer/Counter0 Compare Match
Sistem Mikrokontroler - By : Hendawan Soebhakti
9
Setting Timer 0 Pada CodeWizard 1. Menentukan fungsi Timer atau Counter Sebagai Timer : Clock Source = System Clock Sebagai Counter : Clock Source = T0 pin Falling Edge atau T0 pin Rising Edge
Sistem Mikrokontroler - By : Hendawan Soebhakti
10
Setting Timer 0 Pada CodeWizard 2. Menentukan Prescaler Sebagai Timer : Clock Value dapat dipilih sbb : Timer 0 Stopped : Clock eksternal 11059.200 kHz : No prescaler 1382.400 kHz : Prescaler 8 172.800 kHz : Prescaler 64 43.200 kHz : Prescaler 256 10.800 kHz : Prescaler 1024
Sebagai Counter : Tidak ada prescaler
Sistem Mikrokontroler - By : Hendawan Soebhakti
11
Setting Timer 0 Pada CodeWizard 3. Menentukan Mode Timer Sebagai Timer atau Counter : Mode timer dapat dipilih sbb : Normal top=FFh Phase correct PWM top=FFh CTC top=OCR0 Fast PWM top=FFh
: : : :
Mode Mode Mode Mode
Sistem Mikrokontroler - By : Hendawan Soebhakti
normal PWM Clear Timer on Compare Match High Frequency PWM
12
Setting Timer 0 Pada CodeWizard 4. Menentukan Mode Pulsa pada pin OC0 (Output Compare Timer 0) Sebagai Timer atau Counter : Mode Pulsa pada pin OC0 dapat dipilih sbb : Toggle on compare match : Pulsa berubah ketika terjadi match Clear on compare match : Pulsa low ketika match Set on compare match : Pulsa high ketika match Fungsi ini berguna saat pin OC0 berfungsi sebagai waveform generator (Pembangkit pulsa)
Sistem Mikrokontroler - By : Hendawan Soebhakti
13
Setting Timer 0 Pada CodeWizard 5. Mengaktifkan Timer Interrupt dan Compare Match Interrupt Sebagai Timer atau Counter : Overflow Interrupt Jika diaktifkan maka pada saat timer overflow akan terjadi interrupt dan CPU akan menjalankan Timer 0 overflow interrupt service routine (timer0_ovf_isr). Nilai TCNT dapat diisikan pada Timer Value : …. h Compare Match Interrupt Jika diaktifkan maka pada saat timer value TCNT0 match dengan nilai register OCR0 akan terjadi interrupt dan CPU akan menjalankan Timer 0 output compare interrupt service routine (timer0_comp_isr). Nilai OCR0 dapat diisikan pada Compare : …. h
Sistem Mikrokontroler - By : Hendawan Soebhakti
14
Setting Timer 1 dan 2 Pada CodeWizard Setting Timer 1 dan Timer 2 hampir sama dengan setting Timer 0, hanya saja untuk Timer 1 lebih banyak fasilitas yang disediakan dan timer ini adalah timer 16 bit.
Sistem Mikrokontroler - By : Hendawan Soebhakti
15
Example Percobaan 1. Interrupt Timer 1 Pada percobaan ini, kita akan membuat program interrupt yang dihasilkan oleh Timer 1. Pada kondisi normal PortA akan bernilai 0xFF, namun pada saat ada interrupt kondisinya berubah menjadi 0x00 selama 500mS. Interrupt timer terjadi setiap 5S (Timer Value = 2D10h). Setting CodeWizard PortA sebagai Output Timer 1 : Clock Source : System Clock Clock Value : 10.800 kHz Mode : Normal top=FFFFh Interrupt on : Timer 1 Overflow Value : 2d10 h
Sistem Mikrokontroler - By : Hendawan Soebhakti
16
Example #include <mega8535.h> #include <delay.h> // Timer 1 overflow interrupt service routine interrupt [TIM1_OVF] void timer1_ovf_isr(void) { // Reinitialize Timer 1 value TCNT1H=0x2D; TCNT1L=0x10; // Place your code here PORTA=0x00; delay_ms(500); } // Declare your global variables here void main(void) { . . . while (1) { // Place your code here PORTA=0xFF; }; }
Timer 1 Overflow ISR
Normal Condition
Sistem Mikrokontroler - By : Hendawan Soebhakti
17
Example Percobaan 2. Counter 0 Pada percobaan ini, kita akan membuat program counter dengan mode compare match interrupt. Mikrokontroler akan menghitung jumlah pulsa yang masuk pada T0 (PINB.0). Jika jumlah pulsanya sama dengan 10 pulsa (0x0A) maka mikrokontroler akan melaksanakan void timer0_comp_isr. Setting CodeWizard PortA sebagai Output Timer 0 : Clock Source : T0 pin Falling Edge Mode : Normal top=FFh Compare Match Interrupt Compare : 0a h
Sistem Mikrokontroler - By : Hendawan Soebhakti
18
Example #include <mega8535.h> #include <delay.h> // Timer 0 output compare interrupt service routine interrupt [TIM0_COMP] void timer0_comp_isr(void) { // Place your code here PORTA=0x0F; delay_ms(500); PORTA=0xF0; delay_ms(500); PORTA=0x0F; delay_ms(500); PORTA=0xF0; delay_ms(500); } // Declare your global variables here void main(void) { . . . while (1) { // Place your code here PORTA=0xFF; delay_ms(500); PORTA=0x00; delay_ms(500); }; } Sistem Mikrokontroler - By : Hendawan Soebhakti
Timer 0 Output Compare ISR
Normal Condition 19
Example Percobaan 3. Menghitung Pulsa Per Detik Pada percobaan ini, kita akan membuat program untuk menghitung jumlah pulsa yang masuk pada pin T0 setiap detiknya. Untuk itu maka Timer 0 difungsikan sebagai counter dan Timer 1 difungsikan sebagai timer 1 detik. Hasil perhitungan pulsa akan ditampilkan ke PortA. Setting CodeWizard PortA sebagai Output Timer 0 : Clock Source : T0 pin Falling Edge Mode : Normal top=FFh Compare Match Interrupt Timer 1 : Clock Source Clock Value Mode Interrupt on Value Sistem Mikrokontroler - By : Hendawan Soebhakti
: : : : :
System Clock 10.800 kHz Normal top=FFFFh Timer 1 Overflow d5d0 h 20
Example #include <mega8535.h> // 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 PORTA=TCNT0; TCNT0=0; } // Declare your global variables here void main(void) { . . . while (1) { // Place your code here }; }
Timer 1 Overflow ISR
Normal Condition
Sistem Mikrokontroler - By : Hendawan Soebhakti
21
Latihan 1.
Buatlah program untuk menaikkan (increment) data pada PortA dari 0x00 sampai ke 0xFF setiap interval 3 detik. Gunakan fasilitas timer 2.
2.
Buatlah program untuk menghitung jumlah pulsa pada pin T0 setiap 5 detik. Tampilkan hasilnya pada PortA.
Sistem Mikrokontroler - By : Hendawan Soebhakti
22