PERCOBAAN :
6.1 Penggunaan Timer Ov
erflow 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.
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.
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 !
Timer/Counter adalah hal yang
hampir sama, Timer berarti Penghitung interval atau selang waktu sedangkan
Counter adalah penghitung cacahan. Dalam penggunaannya dalam mikrokontroler
perbedaan antara timer dan counter adalah pada penggunaan sumber clock nya.
Timer/Counter berfungsi sebagai Timer jika sumber clock nya menggunakan
internal clock yaitu Kristal lalu akan berfungsi sebagai Counter jika
sumber clock nya menggunakan external clock. Sedangkan delay yaitu fungsi yang digunakan
untuk mengatur kecepatan pada program, fungsi ini biasanya digunakan programmer
untuk mengatur kecepatan akurasi, namun fungsi ini tidak dapat dijalankan
langsung pada codeblocks seperti layaknya pada Turbo C.
3.
Jelaskan
fungsi tiap baris dari sintaks program pada Percobaan 6.1 !
boolean dataLed = 0; // inisialisasi
untuk menggunakan al jabar boolean
unsigned int overflowCount = 0; // menginilasisasi overflowcount bernilai 0
void setup() {//
setting program pada awal
Serial.begin(9600);//kecepatan transfer
data serial
pinMode(13, OUTPUT); //pin 13 sebagai
output
TCCR1A = 0; // timer register 1 port A
bernilai 0
TCCR1B = 0; // teimer register 1 prt B
bernilai 0
TCNT1 = 34286; // Set timer 1counter initial valu to 34286
TCCR1B |= (1
<< CS12); // 256
prescaler
TIMSK1 |= (1 << TOIE1); // Timer/Counter Interrupt Mask Register
sei();
}
ISR(TIMER1_OVF_vect)
//interrupt untuk timer 1
{TCNT1 = 34286;
if(dataLed == 0) //
jika led bernilai 0
{
dataLed = 1; //led bernilai 1
}
else {
dataLed = 0; led bernilai 0
}
digitalWrite(13,
dataLed); //pin 13 sebagai dataled
overflowCount++;
}
void loop() { // mengulang
program yang dieksekusi
Serial.print("Overflow count = "); //mengirimkan data
serial berupa “overflow count = “
Serial.println(overflowCount,DEC);
/mengirimkan data overflowCount, DEC
delay(100);
menunda selama 1 mS
}
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.
2. Tuliskan
sintaks program berikut ini, lakukan kompilasi dan upl oad 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() //memanggil fungsi timer
{ 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);
}
Pertanyaan
1.
Jelaskan
fungsi tiap baris dari sintaks program pada Percobaan 6.2 !
#include<LiquidCrystal.h> //library
lcd
LiquidCrystal
lcd(2,3,4,5,6,7); //input lcd pada pin 2,3,4,5,6,7
unsigned
int jam,
menit, detik; //inisialisasi jam,detik,menit
boolean led = 0;
ISR(TIMER1_OVF_vect)
//register untuk timer 1
{ TCNT1H=0xC2; //program memanggil timer/counter 1
TCNT1L=0xF7; //program memanggil timer/counter 1
detik++;
if(detik>=60) {
detik = 0; menit++;if(menit>=60) {
menit = 0; jam++; if(jam>=24) {
jam = 0;
}
}
}
2
}
void initTimer1() //memanggil
fungsi timer1
{ 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 (kolom dan baris)
lcd.clear(); //
menghapus tampilan lcd
initTimer1();//memanggil
funsi timer 1
}
void loop()
{ lcd.clear();
//menghapus tampilan lcd
lcd.setCursor(0,0);//pada baris 1
lcd.print("Jam Digital"); //lcd menampilkan “Jam
Digital”
lcd.setCursor(0,1);
//pada baris 2
lcd.print(jam,DEC);
//lcd menampilkan “jam”
lcd.print(":"); //lcd menampilkan “ : “
lcd.print(menit,DEC);
//lcd menampilkan “menit”
lcd.print(":"); //lcd menampilkan “ : “
lcd.print(detik,DEC);
//lcd menampilkan “detik”
delay(500);
ditunda selama 5mS
}
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.
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.
Pertanyaan :
1. Kapankah
nilai counter (TCNT1) akan berubah ? Saat switch ditekan atau
dilepas ? Jelaskan ! nilai counter berubah pada saat ditekan push button . mencacah
nilainya dari HIGH menuju LOW
3. 2. Jelaskan
fungsi tiap baris dari sintaks program pada Percobaan 6.3 !
void setup()
{ Serial.begin(9600); //kecepatan
mentransfer data
TCCR1A=0x00; //register control timer 1 A
TCCR1B=0x06; //timer control register 1 B 0000 0110
TCNT1H=0x00; //timer counter register 1 dengan byte 00
TCNT1L=0x00; //timer counter register 1 dengan byte 00
ICR1H=0x00; //input register capture1 16 byte
ICR1L=0x00; //input register capture1 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() { //program mengulang eksekusi
program
Serial.print("Nilai
TCNT1 = "); //menanfer data serial “Nilai TCNT1=”
Serial.println(TCNT1,DEC); //transfer data serial TCNT!
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.
Pertanyaan
Pertanyaan
1.
Kapankah
nilai counter akan berubah ? Saat switch ditekan atau dilepas ?
Jelaskan !
nilai
counter berubah pada saat ditekan push button . pada saat nilai nya LOW menuju
HIGH
2.
Jelaskan
perbedaan penggunaan counter mode falling edge dan mode rising
edge !
Counter
falling edge mencacah nilainya dari HIGH menuju LOW sementara rising edge
mencacah dari HIGH menuju LOW
3.
Jelaskan
fungsi tiap baris dari sintaks program pada Percobaan 6.4 !
void setup()
{ Serial.begin(9600); //kecepatan
mentransfer data
TCCR1A=0x00; //register control timer 1 A
TCCR1B=0x07; //timer control register 1 B 0000 0111
TCNT1H=0x00; //timer counter register 1 dengan byte 00
TCNT1L=0x00; //timer counter register 1 dengan byte 00
ICR1H=0x00; //input register capture1 16 byte
ICR1L=0x00; //input register capture1 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() { //program mengulang eksekusi
program
Serial.print("Nilai
TCNT1 = "); //menanfer data serial “Nilai TCNT1=”
Serial.println(TCNT1,DEC); //transfer data serial TCNT!
delay(100);//menunda selama 1 mS
}
Terima Kasih