TIMER DAN COUNTER
TUJUAN :
1. Mampu membuat program yang mengunakan fitur timer sebagai pewaktu.
2. Mampu membuat program yang menggunakan fitur timer sebagai penghitung.
3. Mampu mempergunakan fitur timer pada mikrokontroler untuk membuat jam digital
sederhana.
PERALATAN :
1. Komputer : 1 set
2. Arduino Uno : 1 pcs
3. Kabel USB tipe B : 1 pcs
4. Project board : 1 pcs
5. Kabel jumper : 1 set
6. LED : 1 pcs
7. Resistor 330 Ohm : 1 pcs
8. Switch pushbutton : 1 pcs
9. LCD : 1 pcs
10. Potensiometer : 1 pcs
PERCOBAAN :
6.1 Penggunaan Timer Overflow Untuk LED Blinking
Pada percobaan kali ini akan dibuat program untuk membuat led berkedip per 500
milliseconds. Pada dasarnya LED akan toggle (berubah kondisinya) setiap terjadi
interupsi timer overflow. Nilai register timer di-set sedemikian rupa sehingga
menghasilkan waktu overflow per 500 milliseconds.
1. Buatlah rangkaian seperti pada Gambar 6.1.
Gambar 6.1 Rangkaian Percobaan 6.1
2. Tuliskan sintaks program berikut ini, kemudian lakukan kompilasi dan upload
program ke sistem minimum Arduino.
unsigned int overflowCount = 0;
// menginilasisasi overflowcount bernilai 0
void setup() { //
settingan awal program
Serial.begin(9600); // kecepatan
transfer data serial
pinMode(13, OUTPUT); // pin 13 pada arduino dijadikan pin output
TCCR1A = 0; // timer register 1 a bernilai 0
TCCR1B = 0; // timer register 1 b bernilai 0
TCNT1 = 34286; // Set timer
1counter initial valu to 34286
TCCR1B |= (1 << CS12);
// 256 prescaler(sama seperti dibawah)
TIMSK1 |= (1 << TOIE1); // Timer/Counter Interrupt Mask Register
sei();
}
ISR(TIMER1_OVF_vect) { // interupt service routin untuk timer 1
TCNT1 = 34286; //
Set timer
1counter initial valu to 34286
if(dataLed == 0) { // kondisi jika dataled = 0
dataLed = 1; //
maka eksekusi dataled bernilai = 1
}
else { // jika dataled bernilai 0
dataLed = 0; //
masukan dataled bernilai 0
}
digitalWrite(13, dataLed); // baca
digital pin 13 dari variabel dataled
overflowCount++; //
nilai overflowcount ditambah 1
}
void loop() {
Serial.print("Overflow count = "); // serial menampilkan tulisan overflow
count =
Serial.println(overflowCount,DEC); // menampilkan nilai dari variabel overflow
count
delay(100); // delay 100
milisecond
}
3. Buka Serial Monitor pada Arduino IDE, pastikan baudrate pada Serial Monitor
adalah 9600. Kemudian amati teks yang ditampilkan pada Serial Monitor. Amati
juga kondisi nyala dan mati LED pada pin 12.
Tugas dan Pertanyaan :
1. Jika dilakukan perhitungan konfigurasi register
pada sintaks program Percobaan
6.1, timer 1 akan overflow setiap berapa milliseconds ?
1/fCLK x (FFFFh+1)=0.125uS x 34286 =
0.004285
TMAX = 1/fCLK x (FFFFh+1) x
N=0.004285*256
= 19,72
2. Jelaskan perbedaan penggunaan delay dan timer overflow !
Delay adalah waktu tunda selagi program berjalan
dan tidak bisa diselingi oleh program lain sedangkan, timeroverflow adalah
penghitung atau pencacah jadi selama menghitung kita dapat menyisipkan sebuah
program
Pada percobaan kali ini akan dibuat program sederhana yang berfungsi sebagai jam
digital dengan memanfaatkan fitur timer mikrokontroler. Timer akan dikonfigurasi
sehingga terjadi overflow setiap 1 detik. Tiap timer terjadi overflow, variabel detik,
menit dan jam akan di--update nilainya. Nilai variabel tersebut akan ditampilkan pada
LCD.
Prosedur :
1. Buatlah rangkaian seperti Gambar 6.2.
Gambar 6.2 Rangkaian jam digital bebasis Arduino
2. Tuliskan sintaks program berikut ini, lakukan kompilasi dan upload program.
LiquidCrystal lcd(2,3,4,5,6,7);
unsigned int jam, menit, detik;
boolean led = 0;
ISR(TIMER1_OVF_vect) {
TCNT1H=0xC2;
TCNT1L=0xF7;
detik++;
if(detik>=60) {
detik = 0;
menit++;
if(menit>=60) {
menit = 0;
jam++;
if(jam>=24) {
jam = 0;
}
}
}
}
void initTimer1() {
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0xC2;
TCNT1L=0xF7;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
TIMSK1=0x01;
sei();
}
void setup() {
lcd.begin(16,2);
lcd.clear();
initTimer1();
}
void loop() {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Jam Digital");
lcd.setCursor(0,1);
lcd.print(jam,DEC);
lcd.print(":");
lcd.print(menit,DEC);
lcd.print(":");
lcd.print(detik,DEC);
delay(500);
}
1. Ubahlah sintaks program pada Percobaan 6.2 sehingga jam menampilkan waktu
saat ini !
2. Jika dilakukan perhitungan dengan konfigurasi register pada sintaks program
Percobaan 6.2, timer 1 akan overflow setiap berapa milliseconds ?
3. Jelaskan fungsi tiap baris dari sintaks program pada Percobaan 6.2 !
LiquidCrystal lcd(2,3,4,5,6,7); // menginilisasi pin pada lcd
unsigned int jam, menit, detik; //
menginilisasi variabel jam,menit,detik
boolean led = 0; // variabel led
bertipe bolean (0 atau 1)
ISR(TIMER1_OVF_vect) { // Interupt service routin
untuk timer 1
TCNT1H=0xC2; // Memasukan nilai timer1 register H
hex=122(c2)
TCNT1L=0xF7; // Memasukan timer1/counter register
L hex=157
detik++; //
tambahkan nilai di variabel detik
if(detik>=60) { //
kondisi jika detik lebih besar dari 60
detik = 0; // masukan nilai 0 ke
variabel detik
menit++; //
tambahkan nilai variabel menit
if(menit>=60) { //
kondisi jika nilai menit lebih besar dari 60
menit = 0; // variabel menit nilai nya 0
jam++; //
tambahkan nilai pada variabel jam
if(jam>=24) { //
kondisi jika nilai variabel jam lebih besar dari 24
jam = 0; // masukan nilai 0 pada variabel jam
}
}
}
}
void initTimer1() { //
void untu timer
TCCR1A=0x00; // nilai timer1 register 1 A = 0
TCCR1B=0x05; // nilai timer1 register 1B =
hexadesimal 05
TCNT1H=0xC2; // nilai counter/timer 1H penghitung sampai
C2(122) /presceler
TCNT1L=0xF7; // nilai counter/timer 1L akan menghitung sampai
F7(157)/presceler
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
TIMSK1=0x01; // Timer/Counter Interrupt Mask Register
sei(); //
global intrupsi
}
void setup() { //
void untuk default dari program
lcd.begin(16,2); // menjelaskan lcd 16x2 baris x kolom
lcd.clear(); // menghapus tampilan lcd sebelum
nya
initTimer1(); // masukan program dalam void
initTimer1
void loop() { //
void untuk eksekusi ( berulang)
lcd.clear(); // menghapus tampilan lcd sebelumnya
lcd.setCursor(0,0); // peletakan cursor pertama dalam menampilkan output lcd
lcd.print("Jam Digital"); // lcd menampilkan tulisam jam digital
lcd.setCursor(0,1); // posisi kursor berada di kolom dan baris
lcd.print(jam,DEC); // menampilkan nilai dari variabel jam,dalam
desimal
lcd.print(":"); // menampilkan tanda :
lcd.print(menit,DEC); // menampilkan nilai dari variabel
menit,dalam desimal
lcd.print(":"); // setelah program
diatas akan di print tanda :
lcd.print(detik,DEC); // menampilkan nilai dari variabel
detik, dalam desimal
delay(500); // waktu tunda sebanyak 500
milisecond
}
6.3
Counter Mode Falling Edge
Pada percobaan kali ini akan
dibuat program yang berfungsi untuk menghitung jumlah penekanan swit ch
pada input counter. Konfigurasi counter menggunakan mode falling
edge.
Prosedur :
1. Buatlah rangkaian s
eperti pada Gambar 6.3.
Gambar
6.3 Rangkaian Percobaan 6.3
2. Tuliskan sintaks
program berikut ini,
kemudian lakukan ko mpilasi
dan upload
program ke sistem minimum Arduino.
void setup() // untuk settingan awal
program
{
Serial.begin(9600);
//
kecepatan tarnsfer data
TCCR1A=0x00; // nilai timer1 register 1 A = 0
TCCR1B=0x06; // nilai timer1 register 1 B = 6
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
}
void loop() { //
untuk pengulangan program yang ada di void
Serial.print("Nilai
TCNT1 = "); //
serial print menampilkan Nilai TCNT1
Serial.println(TCNT1,DEC);
// TCNT1
bernilai decimal
delay(100); //
interval waktu untuk program
}
3. Buka
Serial Monit or pada Arduino IDE, kemudian tekan swi tch pushbutton dan
amati nilai TCNT1 yang ditampilkan pada Serial Monitor.
Tugas dan Pertanyaa n :
1. Kapankah
nilai counter (TCNT1) akan berubah ? Saat switch ditekan atau
dilepas ? Jelaskan !
Pada saat ditekan, karena pada program ini yang digunakan
adalah mode falling edge
2.
Berapakah nilai ma ksimal counter jika input
counter menggun akan pin T1 (Timer
1)
? Jelaskan kenapa !
6.4
Counter Mode Rising Edge
Pada percobaan ka li ini akan
dibuat program yang fungsi nya sama dengan Percobaan 6.3. Namun pada percobaan
kali ini konfigurasi counter menggunakan mode rising edge.
Prosedur :
1. Gantilah
sintaks pr ogram pada Percobaan 6.5 dengan sintaks p rogram berikut ini,
kemudian lakukan kompilasi dan upload program ke sistem minimum Arduino.
void setup() // untuk settingan awal
program
{
Serial.begin(9600);
//
kecepatan tarnsfer data
TCCR1A=0x00; // nilai timer1 register 1 A = 0
TCCR1B=0x07; //
nilai timer1 register 1 B = 6
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
}
void loop() { //
untuk pengulangan program yang ada di void
Serial.print("Nilai TCNT1 = "); // serial print menampilkan Nilai
TCNT1
Serial.println(TCNT1,DEC);
// TCNT1 bernilai
decimal
delay(100); // interval waktu
untuk program
}
2. Buka
Serial Monit or pada Arduino IDE, kemudian tekan swi tch pushbutton dan
amati nilai TCNT1 yang ditampilkan pada Serial Monitor.
Tugas dan Pertanyaa n :
1.
Kapankah nilai counter akan berubah ? Saat switch
ditekan atau dilepas ? Jelaskan !
Pada saat dilepas , karena pada program kali ini yang di
pakai adalah mode rising edge
2.
Jelaskan perbedaan penggunaan counter mode falling
edge dan mode rising edge !
Mode falling edge adalah perubahan terjadi saat posisi
switch berubah dari kondisi 1 ke 0, sedangkan rising adalah sebaliknya.


