MODUL 3
TE201427
Sistem Mikroprosesor dan
Mikrokontroler
MODUL 3
TIMER COUNTER
1. Dasar Teori
Timer dan Coutner merupakan salah satu peripheral yang dimiliki oleh mikrokontroler
ATMega328p. Timer dan Counter memiliki fungsi pewaktu dan pencacah. Adapun peripheral Timer
dan Counter pada mikrokontroler ATMega328p dimiliki oleh Timer Counter 0, Timer Counter 1,
dan Timer Counter 2. masing-masing peripheral Timer memiliki resolusi yang berbeda. Timer
Counter 0 dan Timer Counter 2 memiliki resolusi 8 bit, sedangkan Timer Counter 1 memiliki
resolusi 16 bit.
Sebagai pewaktu, peripheral Timer Counter dapat digunakan untuk menghasilkan sinyal
Pulse Width Modulation (PWM) dan Timer interrupt. Sinyal PWM banyak digunakan untuk
aplikasi kendali motor DC, sedangkan Timer Interrupt banyak digunakan untuk pensamplingan
dengan interval waktu yang konstan. Mode PWM pada mikrokontroler ATMega328p ada phase
correct dan fast PWM. Frekuensi PWM phase correct yang dihasilkan oleh Timer dapat didekati
dengan persamaan berikut.
Sebagai pencacah, peripheral Timer Counter dapat menghitung jumlah pulsa, sehingga
peripheral Timer Counter dapat digunakan sebagai interface dengan rotary encoder. Selain itu,
Timer Counter juga dapat digunakan untuk menghitung lebar pulsa yang terhubung oleh pin
mikrokontroler.
Register yang terdapat pada peripheral Timer Counter 0 antara lain Timer Counter Control
Register A (TCCR0A), Timer Counter Control Register B (TCCR0B), Timer Counter Interrupt
Mask Register (TIMSK0), General Timer Counter Control Register (GTCCR), Timer Counter
Counter Value Register (TCNT0), Timer Counter Output Compare Register A (OCR0A), Timer
Counter Output Compare Register B (OCR0B), dan Timer Counter Interrupt Flag Register (TIFR0).
Timer Counter 1 dan 2 memiliki beberapa tambahan register. Pada Timer Counter 1, tambahan
register pada register low untuk 8 bit LSB dan register high untuk 8 bit MSB. Sedangkan pada
Timer Counter 2 terdapat Asynchronous Status Register.
Gambar 1: diagram blok peripheral Timer Counter
Gambar 2: Ouput PWM phase correct
Sinyal PWM dihasilkan dari perbandingan antara nilai pada register TCNT dan Output
Compare Register (OCR). Perbandingan kedua nilai register menghasilkan tingkah laku pada pin
Output Compare (OC) tergantung mode yang dikonfigurasi pada register TCCRA yang dapat
ditunjukkan melalui Tabel 1, Tabel 2, dan Tabel 3. Mode dari PWM dapat dikonfigurasi juga
melalui register TCCRA sesuai dengan Tabel 4.
Sebagai pewaktu, nilai register TCNT akan naik melalui trigger dari sumber clock. Sumber
clock dapat berasal dari clockspeed yang digunakan mikrokontroler, yaitu sekitar 16MHz, atau
dapat dibagi menggunakan prescaler yang terdapat pada register TCCRB. Nilai prescaler berkisar
antara 1 hingga 1024. Nilai prescaler dapat ditunjukkan melalui Tabel 5.
Apabila peripheral Timer Counter difungsikan sebagai pencacah, maka pada register
TCCRB dikonfigurasikan pin T0 sebagai sumber clock. Trigger sumber clock dapat dipilih falling
edge detection atau rising edge detection. Konfigurasi pin T0 sebagai sumber clock dapat
ditunjukkan melalui Tabel 5.
Tabel 1. Compare output mode, non-PWM
Tabel 2. Compare output mode, Fast PWM
Tabel 3. Compare output mode, Phase Correct PWM
Tabel 4. Mode PWM
Tabel 5. Prescaler clocksource
Inisialisasi peripheral Timer Counter sebagai pewaktu dan menghasilkan sinyal PWM dapat
dilakukan dengan mengkonfigurasi pin OCA atau OCB sebagai output. Kemudian menentukan
mode PWM, compare output mode, dan clocksource. Dutycyle dari sinyal PWM ditentukan oleh
Register OCRA dan OCRB. Sedangkan inisialisasi Timer Counter sebagai pencacah dilakukan
dengan mengkonfigurasi pin T0 pada Timer Counter 0 sebagai input. Kemudian mode PWM
normal, compare output mode normal dan pin T0 sebagai clocksource.
Percobaan 1: Penghasil Sinyal PWM
1. Buka program Microchip Studio, dan buatlah project menggunakan bahasa assembly.
2. Tulis program seperti berikut:
Bahasa Assembly:
start:
.equ ledA= 200
.equ ledB= 2
ldi r16,0b01100000
out ddrd,r16
ldi r16,0b00000000
out portd,r16
ldi r16,0b10100001
out tccr0a,r16
ldi r16,0b00000101
out tccr0b,r16
ldi r16,ledA
out OCR0A,r16
ldi r16,ledB
out OCR0B,r16
Bahasa C:
#include <xc.h>
#define LEDA 200
#define LEDB 50
int main(void)
{
DDRD|= (1<<PIND5)|(1<<PIND6);
PORTD&= 0x00;
TCCR0A|= (1<<WGM00)|(1<<COM0A1)|(1<<COM0B1);
TCCR0B|= (1<<CS00)|(1<<CS02);
OCR0A|= LEDA;
OCR0B|= LEDB;
while (1)
{
}
}
3. Lakukan debug pada program yang tertulis pada instruksi no 2.
4. Amati register yang berubah, kemudian jelaskan PORT dan pin ke berapa berfungsi sebagai
apa!
5. Buatlah rangkaian seperti gambar di bawah ini menggunakan SimulIDE
6. Amati kedua pin pada osiloskop dan jelaskan pengaruh program dengan mikrokontroler!
Percobaan 2: Pencacah
1. Buka program Microchip Studio, dan buatlah project menggunakan bahasa assembly.
2. Tulis program seperti berikut:
Bahasa Assembly:
start:
ldi r16,0x00
out ddrd,r16
ldi r16,0xff
out ddrc,r16
clr r16
out portc,r16
ldi r17,0x06
out tccr0b,r17
loop:
in r18,tcnt0
out portc,r18
rjmp loop
Bahasa C:
start:
ldi r16,0x00
out ddrd,r16
ldi r16,0xff
out ddrc,r16
clr r16
out portc,r16
ldi r17,0x06
out tccr0b,r17
loop:
in r18,tcnt0
out portc,r18
rjmp loop
3. Lakukan debug pada program yang tertulis pada instruksi no 2.
4. Amati register yang berubah, kemudian jelaskan PORT dan pin ke berapa berfungsi sebagai
apa!
5. Buatlah rangkaian seperti gambar di bawah ini menggunakan SimulIDE
6. Amati kedua bar!
Percobaan 3: Dimmer
1. Buka program Microchip Studio, dan buatlah project menggunakan bahasa assembly.
2. Tulis program seperti berikut:
Bahasa Assembly:
start:
clr r16
clr r18
out ddrc,r16
ldi r16,0x20
out ddrd,r16
clr r16
out portd,r16
ldi r17,0x21
out tccr0a,r17
ldi r17,0x02
out tccr0b,r17
loop:
out ocr0b,r18
in r19,pinc
mov r16,r19
andi r16,0x01
cpi r16,0x01
breq backtoloop
inc r18
rjmp loop
backtoloop:
mov r16,r19
andi r16,0x02
cpi r16,0x02
breq loop
dec r18
rjmp loop
3. Lakukan debug pada program yang tertulis pada instruksi no 2.
4. Amati register yang berubah, kemudian jelaskan PORT dan pin ke berapa berfungsi sebagai
apa!
5. Buatlah rangkaian seperti gambar di bawah ini menggunakan SimulIDE
6. Amati kedua LED pada mikrokontroler saat pushbutton ditekan dan jelaskan pengaruh
program dengan mikrokontroler arduino uno anda!
Percobaan 4: Timer Interrupt
1. Buka program Microchip Studio, dan buatlah project menggunakan bahasa assembly.
2. Tulis program seperti berikut:
Bahasa Assembly:
.org 0x0000
rjmp main
.org 0x001a
rjmp TIM1_OVF_ISR
segment:
.db 0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101,
0b00000111, 0b01111111, 0b01101111
main:
cli
ldi r16, 0xff
out ddrc, r16
out portc, r16
ldi r16, 0x00
sts tccr1a, r16
ldi r16, 0x02
sts tccr1b, r16
ldi r16, 0x01
sts timsk1, r16
sei
ldi ZL, LOW(segment+27)
ldi ZH, HIGH(segment+27)
loop:
rjmp loop
recount:
ldi ZL, LOW(segment+27)
ldi ZH, HIGH(segment+27)
TIM1_OVF_ISR:
lpm r16, Z+
out portc, r16
cpi ZL, LOW(segment+38)
breq recount
reti
3. Lakukan debug pada program yang tertulis pada instruksi no 2.
4. Amati register yang berubah, kemudian jelaskan PORT dan pin ke berapa berfungsi sebagai
apa!
5. Buatlah rangkaian seperti gambar di bawah ini menggunakan SimulIDE
6. Amati kedua seven segment!
Tugas
1. Buatlah program dalam bahasa C untuk percobaan 3 dan percobaan 4