Friday, February 23, 2018

Laporan dan Source Code Tugas 1 Sistem Mikroprosesor: Jam Digital





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
Komponen dan alat yang dipakai dalam percobaan ini adalah sebagai berikut.
  • Komputer.
  • Software Arduino.
  • Arduino Uno beserta kabel USB.
  • Breadboard.
  • Seven segment.
  • Kabel jumper.
3.2                       Langkah-langkah Percobaan
Langkah-langkah yang dilakukan pada percobaan ini adalah sebagai berikut.
  • 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