IMPLEMENTASI
JAM DIGITAL PADA SEVEN SEGMENT MENGGUNAKAN ARDUINO
Theo
Gunawan (13215029)
Yoland
Nababan (13215053)
EL3014-Sistem Mikroprosesor
Program Studi Teknik Elektro - Sekolah Teknik Elektro dan Informatika ITB
Abstrak
Percobaan ini adalah mengenai implementasi jam digital pada seven segment
dengan menggunakan Arduino. Pada percobaan ini dibuat sebuah source code untuk
menjalankan jam digital, kemudian dibuat sebuah rangkaian implementasi jam
digital pada breadboard yang dihubungkan menuju komputer menggunakan kabel USB.
Source code diunggah menuju Arduino untuk diuji keberjalannya pada rangkaian.
Kata
kunci: Implementasi jam digital, seven segment, Arduino
1.
Pendahuluan
Arduino
merupakan sebuah mikroprosesor yang banyak digunakan dalam pembuatan rangkaian
tertentu. Salah satu implementasi yang dapat dilakukan dengan menggunakan
Arduino adalah jam digital. Pada percobaan ini dibahas mengenai implementasi
jam digital dengan menggunakan Arduino.
2.
Studi Pustaka
Berikut adalah beberapa referensi yang digunakan dalam membuat implementasi
ini.
Deskripsi register (misal: port output)
didefinisikan sebagai berikut.[1]
Gambar 4-1 Deskripsi
register
Deskripsi timer/counter didefinisikan
sebagai berikut.[1]
Gambar 4-2 Deskripsi timer/counter TCCR
Clock select didefinisikan sebagai
berikut.[1]
Gambar 4-3 Daftar clock select dan prescaler
TCNT, OCR, TIMSK, dan TIFR didefinisikan sebagai berikut.[1]
Gambar 4-4 TCNT, OCR, TIMSK, dan TIFR
3.
Metodologi
3.1
Komponen dan Alat
- Komputer.
- Software Arduino.
- Arduino Uno beserta kabel USB.
- Breadboard.
- Seven segment.
- Kabel jumper.
3.2
Langkah-langkah Percobaan
- Merangkai implementasi jam digital pada breadboard.
- Membuat source code sesuai dengan lampiran menggunakan software Arduino.
- Memasang kabel USB pada Arduino dan pada komputer.
- Mengunggah kode pada Arduino untuk diuji dan dilihat keberjalanannya.
4.
Hasil dan Analisis
4.1
Hasil Percobaan
Hasil dari percobaan kali ini adalah sebuah jam digital yang dapat diimplementasikan
pada seven segment dengan menggunakan
Arduino. Berikut merupakan beberapa gambar implementasinya.
Gambar 4-1 Implementasi jam digital pada seven segment (1)
Gambar 4-2 Implementasi jam digital pada seven segment (2)
Hasil percobaan lebih lanjut terlampir pada video.
4.2
Analisis
Pada tugas kali ini, dibuat sebuah jam
digital yang diimplementasikan ke dalam empat buah seven
segment. Seven segment yang
digunakan terdiri dari empat buah untuk mewakiliki format hh:mm. Seven segment membutuhkan sebanyak 8 pin untuk dapat dinyalakan. Karena
menggunakan 4 buah seven segment,
maka akan dibutuhkan pin sekitar 32 pin. Sementara pin yang tersedia pada
Arduino Uno tidak sebanyak itu. Oleh karena itu, seven segment akan dinyalakan secara bergantian sehingga jumlah pin
yang dibutuhkan adalah 12 buah pin. Seven
segment harus berganti cukup cepat sehingga mata manusia tidak dapat
mendeteksi perubahannya. Akibatnya, seven
segment akan menyala seperti dinyalakan secara bersamaan. Untuk menjalankan
fungsi sebagai sebuah jam digital, maka dibutuhkan pewaktuan
pada jam tersebut. Hal ini dapat tercapai dengan menggunakan
timer pada Arduino—dalam hal ini merupakan mikroprosesor
ATMEGA 328p. Setelah itu, program ini akan
menjalankan program utamanya. Program utamanya adalah sebuah prosedur yang
digunakan untuk menyalakan keempat seven
segment tersebut. oleh karena itu, program akan selalu berulang untuk
menampilkan display tersebut.
Prosedur untuk menampilkan seven segment
ini berisi prosedur yang berfungsi sebagai decoder pada seven segment. Seven segment
yang digunakan menggunakan seven segment dengan
common cathode. Oleh karena itu, untuk menyalakan satu
buah seven segment, pin katoda
diberikan nilai LOW dan pin anodanya diberi nilai HIGH. Sementara untuk
memadamkan satu seven segment, nilai
anoda tidak perlu diubah ubah, hanya perlu mengubah nilai katoda menjadi HIGH
untuk memastikan beda tegangan antara kedua kaki tidak cukup besar untuk
menyalakan seven segment. Dalam
prosedur tersebut, ada bagian yang berfungsi untuk melakukan fungsi ini. Oleh
karena itu, untuk menyalakan seven
segment, maka nilai katoda dari masing masing seven segment diubah. Ketika 1 pin bernilai LOW, maka tiga pin
lainnya bernilai HIGH dan begitu seterusnya. Sementara metode yang digunakan
untuk menghasilkan jam yang cukup akurat adalah dengan menggunakan interrupt dan overflow pada timer. Interrupt berfungsi untuk menjalankan
suatu prosedur atau instruksi yang cukup singkat. Program utama akan dihentikan
sebentar kemudian prosedur interrupt
akan dijalankan. Sementara, memastikan delay yang dihasilkan adalah 1 detik dapat
dilakukan dengan melakukan pengesetan terlebih dahulu pada beberapa register timer. Pertama-tama adalah dengan
mengeset nilai clock yang digunakan. Selain interrupt,
program ini akan berjalan menggunakan konsep overflow. Ketika suatu register counter/timer
mencapai nilai maksimumnya, maka overflow akan terjadi. Oleh karena itu, untuk menghasilkan delay 1 detik, maka dilakukan dengan
mengisikan suatu nilai awal pada register counter/timer.
Untuk percobaan ini akan digunakan TIMER1. Timer
ini memiliki nilai maksimum sebesar 65535. Oleh karena itu, untuk menghasilkan delay sebesar 1 sekon, maka dapat
dilakukan dengan cara sebagai berikut.
Untuk mengatur nilai prescaler,
dapat dilakukan dengan mengubah nilai register TCCR1B. Nilai prescaler yang digunakan adalah sebesar
1024. Nilai awal ini akan menghasilkan delay
jika bertambah dari nilai awal tersebut sampai nilainya overflow. Overflow ini
nantinya akan digunakan sebagai sinyal untuk memanggil interupsi. Oleh karena
itu, pada saat mendeklarasikan prosedur interrupt
(ISR), maka digunakan vector TIMER1_OVF_vect. Sedangkan untuk membuat overflow dapat dimanfaatkan maka akan digunakan
sebuah register yang berujuan untuk meng-enable
fitur tersebut. Caranya adalah dengan mengubah nilai register TIMSK yang
merupkan register yang bertujuan untuk melakukan enable pada fungsi interrupt jika overflow terjadi. Hal inilah yang kita butuhkan untuk menghasilkan
perilaku yang kita harapkan. Artinya ketika terjadi overflow pada register TCNT1, maka akan terjadi overflow yang nantinya menjadi pemicu
terjadinya interrupt. Bagian prosedur
ISR digunakan untuk mengupdate nilai jam, menit, dan detik. Oleh karena itu,
pada program interrupt ini, nilai
detik akan mengalami penambahan sebanyak 1 dan akan diubah ke dalam nilai jam
dan menit. Kemudian nilai counter di-reset ke nilai awal tadi yaitu TCNT1 =
0xC2F7. Kemudian dilakukan implementasi pada program yang sudah dirancang. Dari
program tersebut dapat menghasilkan delay
yang akurat yaitu 1 detik.
5.
Kesimpulan
Dari
hasil percobaan ini dapat disimpulkan:
- Jam digital dapat diimplementasikan dengan menggunakan counter/timer dan interrupt.
- Implementasi jam digital menggunakan counter/timer dan interrupt sudah dapat dijalankan dengan baik.
Daftar Pustaka
[1]
Mervin T. Hutabarat dkk., Petunjuk
Praktikum Sistem Mikroprosesor, ed. 2017-2018, Laboratorium Dasar Teknik
Elektro Institut Teknologi Bandung, Bandung, 2018.
Lampiran
Source code proyek
#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>
#include <avr/interrupt.h>
int val[4] = {0,0,0,0};
unsigned int detik ;
void timer1_init()
{
// initialize counter
TCNT1 = 0xC2F7;
// set up timer with no prescaling
TCCR1B |= ((1 << CS10) | (1 << CS12)); //1024 prescaler
}
void cetakSemua(){
reset();
PORTB = 0b00001110;
decoder(val[0]);
reset();
PORTB = 0b00001101;
decoder(val[1]);
reset();
PORTB = 0b00001011;
decoder(val[2]);
reset();
PORTB = 0b00000111;
decoder(val[3]);
}
void decoder(unsigned char A)
{
if(A == 0)
{
PORTD = 0b11101101;
}
if(A == 1)
{
PORTD = 0b00101000;
}
if(A == 2)
{
PORTD = 0b11001110;
}
if(A == 3)
{
PORTD = 0b01101110;
}
if(A == 4)
{
PORTD = 0b00101011;
}
if(A == 5)
{
PORTD = 0b01100111;
}
if(A == 6)
{
PORTD = 0b11100111;
}
if(A == 7)
{
PORTD = 0b00101100;
}
if(A == 8)
{
PORTD = 0b11101111;
}
if(A == 9)
{
PORTD = 0b01101111;
}
}
void reset(){
PORTD = 0x00;
PORTB |= (1<<PB3)|(1<<PB2)|(1<<PB1)|(1<<PB0);
}
int main (void) {
detik = 0;
DDRB = 0x0F;
DDRD = 0xFF;
PORTB |= (0<<3)|(0<<2)|(0<<1)|(0<<0);
PORTD = 0x00;
TIMSK1 |= (1 << TOIE1); //enable overflow interrupt
sei();
timer1_init();
//
// initialize counter
//
TCNT1 = 0xC2F7;
//
//
// set up timer with no prescaling
//
TCCR1B |= ((1 << CS10) | (1 << CS12)); //1024 prescaler
while (1){
cetakSemua();
//
Serial.print("oke\n");
}
}
ISR(TIMER1_OVF_vect){
detik = detik + 1;
TCNT1 = 0xC2F7;
//
PORTC ^= (1<<0);
if (detik%60 == 0){
val[3] = ((detik/60)/60)/10;
val[2] = ((detik/60)/60)%10;
val[1] = ((detik/60)%60)/10;
val[0] = ((detik/60)%60)%10;
//
detik=0;
}
}
No comments:
Post a Comment