Rabu, 14 Desember 2011

Aplikasi RTC ( Real Time Clock ) Menggunakan DS1307

Oleh : Dwi Kurniawan

DS1307 merupakan IC RTC yang menggunakan protokol I2C (Inter IC Bus ) yang sesuai dengan protokol TWI (2 wire serial interfaces) pada mikrokontroler AVR. Dalam komunikasi menggunakan protokol I2C hanya diperlukan 2 jalur data yakni SCL (Serial Clock) dan SDA (Serial Data).

1. Skema Rangkaian Percobaan
Percobaan RTC DS1307 ini menggunakan arduino deumilanove dengan mikrokontrolernya adalah Atmega328 yang mana pin SCL terletak pada kaki no 28 pada Atmega328 dan dalam arduino board disebut sebagai pin A5, sedangkan pin SDA terletak pada kaki no 27 pada Atmega328 dan dalam arduino board disebut sebagai pin A4.
Skematik rangkaian percobaan untuk modul RTC ditunjukan oleh gambar dibawah ini.
Gambar.1 Skematik rangkaian percobaan modul RTC dengan IC DS1307


2. Algoritma Penggunaan RTC ( Real Time Clock) dengan IC DS1307

Pada penggunaan IC DS1307 dilakukan 2 proses yakni menulis data ke IC DS1307 ( dalam hal ini adalah seting waktu ) dan yang kedua adalah membaca data waktu dari IC DS1307. Prosedur kedua proses ini mengacu pada protokol I2C agar komunikasi berjalan sebagai mana mestinya.
Sesuai dengan protokol I2C, prosedur penulisan data dilakukan dengan langkah – langkah sebagai berikut.
  • Master mengirim start sequence
  • Master mengirim alamat slave yang akan ditulis data dengan bit R/W low (alamat genap)
  • Master mengirim alamat dari internal register yang ingin ditulis
  • Master mengirim byte data
  • Jika data belum tertulis semua, setelah slave mengirim ACK=0 maka byte data berikutnya dikirim
  • Master mengirim stop sequence.
Sedangkan prosedur pembacaan data dilakukan dengan langkah – langkah sebagai berikut.
  • Master mengirim start sequence
  • Master mengirim alamat slave yang akan ditulis data dengan bit R/W low (alamat genap)
  • Master mengirim alamat dari internal register yang ingin dibaca
  • Master mengirim start sequence
  • Master mengirim alamat slave yang akan ditulis data dengan bit R/W high (alamat ganjil)
  • Master membaca byte data dari slave
  • Master mengirim stop sequence.
Didalam software arduino IDE versi 0022 telah tersedia library “wire.h” yang berfungsi mempermudah pengguna yang akan melakukan komunikasi master – slave menggunakan sistem I2C. Library ini mengacau pada aturan komunikasi I2C dengan kata kunci untuk memanggil prosedure dan funsi dari library “wire.h” sebagai berikut.
Wire.begin();
Wire.beginTransmission(alamat yang dituju);
Wire.endTransmission();
Wire.requestFrom(alamat + bit read);
Wire.send(data bit dalam BCD);
Wire.receive();
Wire.onReceive();
Wire.onRequest() ;
Untuk masing – masing prosedure penulisan dan pembacaan data ditunjukan oleh source code dibawah dengan terlebih dahulu memanggil library “wire.h” dan mendeklarasikan alamat DS1307 pada 0x68 di bagian inisialisasi.
#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68
//*****menulis data set waktu ke DS1307*****//
void setDateDs1307(byte second,byte minute,byte hour,byte dayOfWeek,byte dayOfMonth,byte month, byte year){
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0);
Wire.send(decToBcd(second)); // 0 to bit 7 starts the clock
Wire.send(decToBcd(minute));
Wire.send(decToBcd(hour)); // If you want 12 hour am/pm you need to set
// bit 6 (also need to change readDateDs1307)
Wire.send(decToBcd(dayOfWeek));
Wire.send(decToBcd(dayOfMonth));
Wire.send(decToBcd(month));
Wire.send(decToBcd(year));
Wire.endTransmission();
}

//*****mengambil data dari DS1307*****//
void getDateDs1307(byte *second,byte *minute,byte *hour,byte *dayOfWeek,byte *dayOfMonth,byte *month,byte *year){
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
*second = bcdToDec(Wire.receive() & 0x7f);
*minute = bcdToDec(Wire.receive());
*hour = bcdToDec(Wire.receive() & 0x3f);
*dayOfWeek = bcdToDec(Wire.receive());
*dayOfMonth = bcdToDec(Wire.receive());
*month = bcdToDec(Wire.receive());
*year = bcdToDec(Wire.receive());
}
Penulisan data ke DS1307 dilakukan dengan memanggil prosedur setDateDS1307(second, minute,hour, dayOfWeek, dayOfMonth, month, year) dan ini dilakukan pada saat pertama menggunakan IC DS1307, setelah itu data tersimpan dan perhitungan waktu akan terus berjalan.
Selama suplai tegangan pada DS1307 aktif dan tidak ada kerusakan pada rangkaian, maka data waktu pada DS1307 dapat diambil kapan saja. Apabila suplai tegangan pada DS1307 hilang, maka perlu dilakukan penulisan ulang waktu dan tanggal karena data yang tersimpan diregister internal DS1307 merupakan data terakhir IC ini bekerja secara normal (mendapat suplai tegangan).
Contoh pemanggilan prosedur untuk menulis data ke DS1307 adalah sebagai berikut.
void loop(){
second = 30;
minute = 7;
hour = 3;
dayOfWeek = 4;
dayOfMonth = 18;
month = 8;
year = 11;
setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
}

Setelah, data tertulis ke DS1307, langkah selanjutnya adalah pengambilan data kalender pada DS1307. Contoh pemanggilan prosedur untuk membaca data pada DS1307 adalah sebagai berikut.
void loop() {
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
if(hour>0){
if(hour<=12){
Serial.print(hour, DEC);}
else {
Serial.print(hour-12, DEC);}
}
else{
Serial.print("12");}
Serial.print(":");
if (minute < 10) {
Serial.print("0");}
Serial.print(minute, DEC);
Serial.print(":");
if (second < 10) {
Serial.print("0");}
Serial.print(second, DEC);
if(hour<12){
Serial.print("am");}
else{
Serial.print("pm");}
Serial.print(dayOfMonth,DEC);
Serial.print("-");
Serial.print(month,DEC);
Serial.print("-");
Serial.print(year,DEC);
Serial.println();
delay(1000);
}
Hasil eksekusi program pembacaan data DS1307 diatas diamati menggunakan serial monitor dengan seting baud rate 9600 bps. Hasil pengujian ditunjukan oleh gambar 2.

Gambar 2. Pembacaan data DS1307

Lihat Vidio Tutorial di sini

Tidak ada komentar:

Posting Komentar