LAPORAN
PRAKTIKUM 6
TIMER
DAN COUNTER
NAMA: MUHAMMAD RIZKI
NIM : 3211301031
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.
Prosedur :
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.
boolean dataLed = 0;
unsigned int overflowCount = 0;
void setup() { Serial.begin(9600);
pinMode(13, OUTPUT);
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 34286;
TCCR1B |= (1 << CS12); // 256 prescaler TIMSK1
|= (1 << TOIE1);
sei(); }
ISR(TIMER1_OVF_vect) {
TCNT1 = 34286;
if(dataLed == 0) {
dataLed = 1; }
else {
dataLed = 0; }
digitalWrite(13, dataLed); overflowCount++;
}
void loop() {
Serial.print("Overflow
count = "); Serial.println(overflowCount,DEC); delay(100);
}
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.25uS 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 selama program sedang bejalan sehingga tidak bisa diselingi
oleh program lainnya ,
sedangkan
ð Timer overflow adalah penghitung atau pencacah sehingga selama menghitung dapat disiapkan beberapa program.
ð Timer overflow adalah penghitung atau pencacah sehingga selama menghitung dapat disiapkan beberapa program.
3. Jelaskan fungsi tiap baris dari sintaks program pada Percobaan 6.1 !
boolean dataLed = 0; //menganalisa
Variable bertipe bolean(1/0)
unsigned int overflowCount = 0; //pengisolasian over flow count bernilai 0
void setup() //defult program
{
Serial.begin(9600); //kecepetan transfer data serial
pinMode(13, OUTPUT); //pin 131 sebagai output
TCCR1A = 0; //timer register 1a=0
TCCR1B = 0;
//timer
register 1b=0
TCNT1 = 34286; //set timer 1 counter value ke 34286
TCCR1B |= (1 << CS12); // 256 prescaler
TIMSK1 |= (1 << TOIE1); //timer counter interrupt mask
register
sei(); } //global interupt
ISR(TIMER1_OVF_vect) { //interrupt
service roitin (ISR) untuk timer 1
TCNT1
= 34286; //set
timer 1 counter initial value to 34286
if(dataLed == 0) { //kondisi
jika data LED=0
dataLed = 1; } //meksekusi data LED=1
else { //jika
tidak
dataLed = 0; } //eksekusi
data LED=0
digitalWrite(13, dataLed); //baca pin 13 dari variable
data led
overflowCount++; //nilai overFlowCount di tambah 1
}
void loop() {
Serial.print("Overflow
count = "); //serial
menampilkan tulisan overflow Count
Serial.println(overflowCount,DEC); //menampilkan nilai dari variable overflow count
delay(100); //delay
selama 100 mili second
}
6.2 Jam Digital Menggunakan Timer
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.
#include<LiquidCrystal.h> 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);
}
Tugas dan Pertanyaan :
1. Ubahlah sintaks program pada Percobaan 6.2 sehingga jam menampilkan waktu
saat ini !
ð Hal
ini dapat dilakukan pada praktikum secara langsung
2. Jika dilakukan perhitungan dengan konfigurasi register pada sintaks program
Percobaan 6.2, timer 1 akan overflow setiap berapa milliseconds ?
ð Timer
1 akan overflow setiap 60000 ms
3. Jelaskan fungsi tiap baris dari sintaks program pada Percobaan 6.2 !
#include<LiquidCrystal.h> //mengambil library
dari LCD
LiquidCrystal lcd(2,3,4,5,6,7); //menginilisasi
pin pada LCD
unsigned int jam, menit, detik; //menginilisasi
variable jam,menit,detik
boolean led = 0; //variable
LED bertipe bolean (0 atau 1)
ISR(TIMER1_OVF_vect) {
//interrupt
service routin untuk timer 1
TCNT1H=0xC2; //time
value 1 H hex=122(c2)
TCNT1L=0xF7; //time
value 1L hex=157
detik++; //looping tiap detik +1
if(detik>=60) { //jika kondisi nilai detik >= 60
detik = 0; //nilai output =0 (low)
menit++; //menitnya
bertambah 1
if(menit>=60) { //jika kondisi nilai menit >= 60
menit = 0; //nilai output menitnya = 0
jam++; //jam bertambah 1
if(jam>=24 { //jika jam
>=24
jam = 0;
//maka
nilai outputnya menjadi = 0
}
}
}
}
void initTimer1() {
//fungsi
penginisialisasi timer 1
TCCR1A=0x00; //nilai
timer regirter 1A = 0
TCCR1B=0x05; // nilai
timer register 1B=hexadecimal 05
TCNT1H=0xC2; //nilai
couter/timer 1H penghitung sampai c2 (122)/presceler
TCNT1L=0xF7; //nilai
counter 1L akam menghitung sampai F7 (157) /presceler
ICR1H=0x00; //timer
input capture register
ICR1L=0x00; //timer
output capture register
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
TIMSK1=0x01; //timer
interrupt mask register(TIMSK)
sei();
}
void setup() { //fungsi
penginisialisasa keluaran
lcd.begin(16,2); //set
crsor LCD di mulai pada baris & kolom 16,2
lcd.clear(); //menghapus
data LCDsebelumnya
initTimer1(); //penginisialisasi timer 1
}
void loop() { //fungsi
mengeksekusi program
lcd.clear(); //menghapus data pada LCD sebelumnya
lcd.setCursor(0,0); //set cursor
pada LCD pada baris dan kolom 0,0
lcd.print("Jam Digital"); //menampilkan
tulisan “jam Digital” pada LCD
lcd.setCursor(0,1); //set cursor pada LCD pada baris dan kolom 0,1
lcd.print(jam,DEC); //menampilkan
tulisan pada layar lcd “JAM” dalam bentuk bilangan decimal
lcd.print(":"); // menampilakan tanda “:” pada layar LCD setelah
tampilan “JAM”
lcd.print(menit,DEC); // menampilkan tulisan pada layar lcd “Menit” dalam
bentuk
bilangan decimal
lcd.print(":"); // menampilakan tanda “:”
pada layar LCD setelah
tampilan “Menit”
lcd.print(detik,DEC); // menampilkan tulisan
pada layar lcd “Detik” dalam
bentuk bilangan decimal
delay(500); //
Waktu jeda pause tiap looping yaitu 500 mS
}
6.3 Counter Mode Falling Edge
Pada percobaan kali ini akan dibuat program yang berfungsi untuk menghitung
jumlah penekanan switch pada input counter. Konfigurasi counter menggunakan mode
falling edge.
Prosedur :
1. Buatlah rangkaian seperti pada Gambar 6.3.
Gambar 6.3 Rangkaian Percobaan 6.3
2. Tuliskan sintaks program berikut ini, kemudian lakukan kompilasi dan upload
program ke sistem minimum Arduino.
void setup() { Serial.begin(9600);
TCCR1A=0x00;
TCCR1B=0x06;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
}
void loop() {
Serial.print("Nilai TCNT1 = "); Serial.println(TCNT1,DEC); delay(100);
}
3. Buka Serial Monitor pada Arduino IDE, kemudian tekan switch pushbutton dan
amati nilai TCNT1 yang ditampilkan pada Serial Monitor.
Tugas dan Pertanyaan :
1. Kapankah nilai counter (TCNT1) akan berubah ? Saat switch ditekan atau dilepas ?
Jelaskan !
ð
Nilai counter TCNT1 akan berubah pada saat kondisi push button
dilepas kemudian ditekan. Hal ini
terjadi karena pada program ini yang digunakan adalah mode falling edge.
2. Berapakah nilai maksimal counter jika input counter menggunakan pin T1 (Timer
1) ? Jelaskan kenapa !
(65535)
Karena
Nilai counter ada pada Register TCNT1
3. Jelaskan fungsi tiap baris dari sintaks program pada Percobaan 6.3 !
void setup() { //fungsi ini untuk mengatur kondisa dalam posisi awal
//fungsi ini hanya jalan sekali
//fungsi
setup () akan di panggil saat sintaks program akan di //jalankan
Serial.begin(9600); //kecepata transfer data
TCCR1A=0x00; //register control timer 1 A
TCCR1B=0x06; //timer control register 1 B byte = 00000110
TCNT1H=0x00; //timer control register 1H, nilai byte 00
TCNT1L=0x00; //timer control register 1L, nlai byte 00
ICR1H=0x00; //input register capture1 dengan nilai = 16 byte
ICR1L=0x00; //input register capture1 dengan nilai = 16 byte
OCR1AH=0x00; //
output capture register1 A High
OCR1AL=0x00; //output capture register1 A Low
OCR1BH=0x00; //output capture register1 B High
OCR1BL=0x00; //output
capture register1 B High
}
void loop() { //fungsi untuk mengeksekusi program
Serial.print("Nilai TCNT1 = "); //Menampilakn
tulisan di layar LCD “NilaiTCNT1=”
Serial.println(TCNT1,DEC); //transfer data serial
TCNT1 dalam bentuk bilangan
decimal
delay(100); //menunda selama 1 mS
}
6.4 Counter Mode Rising Edge
Pada percobaan kali ini akan dibuat program yang fungsinya sama dengan
Percobaan 6.3. Namun pada percobaan kali ini konfigurasi counter menggunakan mode
rising edge.
Prosedur :
1. Gantilah sintaks program pada Percobaan 6.5 dengan sintaks program berikut ini,
kemudian lakukan kompilasi dan upload program ke sistem minimum Arduino.
void setup() { Serial.begin(9600); TCCR1A=0x00; TCCR1B=0x07;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
}
void loop() {
Serial.print("Nilai TCNT1 = "); Serial.println(TCNT1,DEC); delay(100);
}
2. Buka Serial Monitor pada Arduino IDE, kemudian tekan switch pushbutton dan
amati nilai TCNT1 yang ditampilkan pada Serial Monitor.
Tugas dan Pertanyaan :
- Kapankah nilai counter akan berubah ? Saat switch ditekan atau dilepas ? Jelaskan !
ð Nilai
counter TCNT1 akan berubah pada saat kondisi switch ditekan kemudian dilepas.
Hal ini terjadi karena pada program
ini yang digunakan adalah mode rising edge.
2. Jelaskan perbedaan penggunaan counter mode falling edge dan mode rising edge !
ð Mode
falling edge adalah perubahan yang terjadi saat data atau nilainya berubah dari
kondisi high ke low ,sedangkan
ð Mode rising edge adalah perubahan yang terjadi saat data atau nilainya berubah dari kondisi low ke high
ð Mode rising edge adalah perubahan yang terjadi saat data atau nilainya berubah dari kondisi low ke high
3. Jelaskan fungsi tiap baris dari sintaks program pada Percobaan 6.4 !
void setup() {
Serial.begin(9600); //kecepatan
mentransfer data / baudrate
TCCR1A=0x00; //register control timer 1 A
TCCR1B=0x07; //timer control register 1 B byte = 0000 0110
TCNT1H=0x00; //timer counter register 1 , nilai byte 00
TCNT1L=0x00; //timer counter register 1 , nilai byte 00
ICR1H=0x00; //input register capture1 dengan nilai = 16 byte
ICR1L=0x00; //input register capture1 dengan nilai = 16 byte
OCR1AH=0x00; //
output capture register1 A High
OCR1AL=0x00; //output capture register1 A Low
OCR1BH=0x00; //output capture register1 B High
OCR1BL=0x00; //output
captire register1 B Low
}
void loop() { //fungsi untuk mengeksekusi program
Serial.print("Nilai TCNT1 = "); //Menampilakn tulisan di layar LCD “Nilai TCNT1=”
Serial.println(TCNT1,DEC); //transfer
data serial TCNT1 dalam bentuk bilangan decimal
delay(100); //menunda selama 1 mS
}
Kesimpulan:
Pada praktikum kali
ini kita dapat mengetahui bagaimana cara membuat program jam digital
menggunakan arduino dantampilannya memeakai LCD, dan pada pembuatan program
kita harus mengetahui maksud-maksud dan fungsi
dari sintaks program tersebut
.






