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 kondisi nya) 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 ko mpilasi dan upload
program ke sistem minimum Arduino.
boolean dataLed
= 0; // untuk menginilisasi variabel dataled bertipe
boolean(1/0)
unsigned int
overflowCount = 0; //
menginilasisasi overflowcount bernilai 0
void setup() { //
Default program yang kita buat
Serial.begin(9600); //
Kecepatan transfer data serial
pinMode(13, OUTPUT); //
Pin 13 pada arduino jadi 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. Kemu dian amati teks yang ditampilkan pada Serial Monitor. Amati
juga kondisi nyala dan mati LED pada pin 12.
Tugas dan Pertanyaa n :
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 jeda waktu yang mana selama
waktu jeda tersebut semua program berhenti/ tidak berjalan.
timeroverflow adalah penghitung atau
pencacah jadi selama menghitung program masih dapat di eksekusi.
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 overfl ow, variabel detik,
menit dan jam akan di -update nilainya. Nilai variabel tersebut akan
ditampilkan pada LCD.
Prosedur :
1.
Buatlah rangkaian s eperti Gambar 6.2.

G
ambar 6.2 Rangkaian jam digital bebasis Arduino
2.
Tuliskan sintaks program berikut ini, lakukan kompilasi dan upl oad
program.
include<LiquidCrystal.h> // memanggil
library dari lcd
LiquidCrystal lcd(2,3,4,5,6,7); // menginilisasi pin pada lcd
unsigned int
jam, menit, detik; // menginilissasi 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 kita
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
bari
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
}
Tugas dan Pertanyaan :
1. Ubahlah
sintaks program pada Percobaan 6.2 sehingga jam menampilkan waktu saat ini !
2. Jika
dilakukan per hitungan dengan konfigurasi register pada sintaks program
Percobaan 6.2, timer 1 akan overflow setiap berapa milliseconds
?
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()
{ Serial.begin(9600); // Kecepatan transfer data serial
TCCR1A=0x00; //
nilai timer1 register 1 A = 0
TCCR1B=0x06; //
nilai timer1 register 1B = hexadesimal 06
TCNT1H=0xC2; //
Memasukan nilai timer1 register H hex=122(c2)
TCNT1L=0xF7; //
Memasukan timer1/counter register L hex=157
ICR1H=0x00; //
inisialisasi panjang pulsa di rgiste H
ICR1L=0x00; //
inisialisasi panjang pulsa di rgiste L
OCR1AH=0x00; //
Output compare register
OCR1AL=0x00; //
Output compare register
OCR1BH=0x00; //
Output compare register
OCR1BL=0x00; //
Output compare register
}
void loop() {
Serial.print("Nilai TCNT1 = "); // menampilkan "Nilai TCNT1 =
"
Serial.println(TCNT1,DEC);
// menampilkan nilai TCNT 1
delay(100); // jeda 100
milisecond
}
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 !
Nilai counter berubah saat switch di tekan. Karna saat switch
di tekan pin 5 akan terhubung ke ground yang artinya pin 5 bernilai nol (
falling).
2.
Berapakah
nilai maksimal counter jika input counter menggunakan pin T1 (Timer
1)
? Jelaskan kenapa !
- Jelaskan
fungsi tiap baris dari sintaks program pada Percobaan 6.3 !
void setup()
{ Serial.begin(9600); // Kecepatan transfer data serial
TCCR1A=0x00; //
nilai timer1 register 1 A = 0
TCCR1B=0x06; // nilai timer1 register 1B = hexadesimal 06 (falling)
TCNT1H=0xC2; //
Memasukan nilai timer1 register H hex=122(c2)
TCNT1L=0xF7; //
Memasukan timer1/counter register L hex=157
ICR1H=0x00; //
inisialisasi panjang pulsa di rgiste H
ICR1L=0x00; //
inisialisasi panjang pulsa di rgiste L
OCR1AH=0x00; //
Output compare register
OCR1AL=0x00; //
Output compare register
OCR1BH=0x00; //
Output compare register
OCR1BL=0x00; //
Output compare register
}
void loop() {
Serial.print("Nilai TCNT1 = "); // menampilkan "Nilai TCNT1 =
"
Serial.println(TCNT1,DEC);
// menampilkan nilai TCNT 1
delay(100); // jeda 100
milisecond
}
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() { 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 Pertanyaa n :
1.
Kapankah
nilai counter akan berubah ? Saat switch ditekan atau dilepas ?
Jelaskan !
Nilai
counter berubah saat switch dilepas. Karna saat switch di lepas pin 5 yang
terhubung ke ground yang artinya pin 5 bernilai nol berubah menjadi bernilai 1
(rising).
2.
Jelaskan
perbedaan penggunaan counter mode falling edge dan mode rising
edge !
Perbedaannya
adalah Saat switch di tekan terjadi perubahan nilai input yang tadinya bernilai
1 berubah menjadi bernilai 0 (falling), dan Saat switch dilepas terjadi
perubahan input dari 0 ke 1 (RISING).
3.
Jelaskan
fungsi tiap baris dari sintaks program pada Percobaan 6.4 !
void setup()
{ Serial.begin(9600); // Kecepatan transfer data serial
TCCR1A=0x00; //
nilai timer1 register 1 A = 0
TCCR1B=0x07; // nilai timer1 register 1B = hexadesimal 07 (falling)
TCNT1H=0x00; //
Memasukan nilai timer1 register H hex=0
TCNT1L=0x00; //
Memasukan timer1/counter register L hex=0
ICR1H=0x00; //
inisialisasi panjang pulsa di rgiste H
ICR1L=0x00; //
inisialisasi panjang pulsa di rgiste L
OCR1AH=0x00; //
Output compare register
OCR1AL=0x00; //
Output compare register
OCR1BH=0x00; //
Output compare register
OCR1BL=0x00; //
Output compare register
}
void loop() {
Serial.print("Nilai TCNT1 = "); // menampilkan "Nilai TCNT1 =
"
Serial.println(TCNT1,DEC);
// menampilkan nilai TCNT 1
delay(100); // jeda 100
milisecond
}







