April 14, 2012

program Jam Digital

DS1307 merupakan IC Real Time Clock (RTC) yang dapat diakses dengan mikrokontroler menggunakan komunikasi serial I2C. Berikut ini saya beri contoh untuk menampilkan RTC DS1307 pada LCD dan Hyperterminal menggunakan Bascom AVR. Dengan adanya RTC ini maka kita dapat menampilkan waktu yang berupa jam, menit, dan detik, serta tanggal, yaitu hari, bulan dan tahun, untuk selengkapnya bisa dilihat di datasheet.

Berhubung gambar dibawah ini dimaksudkan untuk kepentingan simulasi langsung dengan Proteus, maka kalau ingin mempraktekkannya dengan alat yang nyata, virtual terminal ini dapat diganti dengan rangkaian serial atau biasanya menggunakan IC MAX232, sebagai berikut:



Hyperterminal dapat diakses dengan meng-klik Start --> All Programs --> Accessories --> Communications --> Hyperterminal. Kemudian lakukan pengaturan sesuai yang diminta pada wizard jika Hyperterminal baru pertama kali dibuka, selanjutnya pilih COM port yang digunakan atau terhubung dengan kabel DB9 atau USB, dan baud rate yang digunakan, dalam program ini saya menggunakan baud rate 9600.

Contoh tampilan pada Hyperterminal sbb:


Dan jangan lupa, agar jam dan tanggal pada RTC tetap dapat berjalan pada alat, pasang baterai lithium 3 volt pada kaki 3 atau VBat.

Simulasi dengan Proteus:



Data jam dan tanggal pada RTC dapat diubah pada Hyperterminal, tekan huruf "A" pada keyboard untuk mengganti data jam, dan huruf "B" untuk mengganti data tanggal.



Listing program Bascom AVR nya:
'=======================================================
'Programmer: Wahyu Rahmaniar
'Company   : Technologination
'
'RTC DS1307
'=======================================================

$regfile = "m32def.dat"
$crystal = 8000000
$baud = 9600

Config Lcdpin = Pin , Rs = Portc.2 , E = Portc.3 , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7
Config Lcd = 16 * 2

$lib "ds1307clock.lib"

Config Sda = Portc.1
Config Scl = Portc.0
Const Ds1307w = &HD0
Const Ds1307r = &HD1

Config Clock = User

Dim Weekday As Byte
Dim Char As String * 10 , Tanda As String * 1
Dim Jam As String * 10 , Menit As String * 10 , Detik As String * 10
Dim Hari As String * 10 , Bulan As String * 10 , Tahun As String * 10
Dim A As Byte , B As Byte , C As Byte
Dim X As Byte , Y As Byte , Z As Byte
Dim Waktu As String * 10
Dim Tanggal As String * 10

Print "DS1307"
Waitms 100

Time$ = "15:30:00"
Date$ = "04-30-11"

Print "Tanggal: " ; Date$
Print "Waktu:" ; Time$

  Cls
  Cursor Off
  Locate 1 , 1
  Lcd "Tanggal: " ; _day ; ":" ; _month ; ":" ; _year
  Locate 2 , 1
  Lcd "Waktu : " ; _hour ; "-" ; _min ; "-" ; _sec
  Wait 1

Mulai:
Do
Tanda = Inkey()
   If Tanda = "A" Then
   'untuk ganti settingan waktu RTC tekan huruf A pada keyboard
      Input "Masukkan waktu (hh:mm:ss):" , Waktu
      Jam = Mid(waktu , 1 , 2)
      Menit = Mid(waktu , 4 , 2)
      Detik = Mid(waktu , 7 , 2)
      Time$ = Jam + ":" + Menit + ":" + Detik
      A = Val(jam)
      B = Val(menit)
      C = Val(detik)

      _hour = A
      _min = B
      _sec = C
      Gosub Settime
    End If

    If Tanda = "B" Then
   'untuk ganti settingan tanggal RTC tekan huruf A pada keyboard
      Input "Masukkan Tanggal (mm-dd-yy):" , Tanggal
      Bulan = Mid(tanggal , 1 , 2)
      Hari = Mid(tanggal , 4 , 2)
      Tahun = Mid(tanggal , 7 , 2)
      Date$ = Bulan + "-" + Hari + "-" + Tahun
      X = Val(bulan)
      Y = Val(hari)
      Z = Val(tahun)

      _day = Y
      _month = X
      _year = Z
      Gosub Setdate
    End If

Print "Tanggal: " ; Date$
Print "Waktu:" ; Time$
  Cls
  Cursor Off
  Locate 1 , 1
  Lcd "Tanggal: " ; _day ; ":" ; _month ; ":" ; _year
  Locate 2 , 1
  Lcd "Waktu : " ; _hour ; "-" ; _min ; "-" ; _sec
  Wait 1
Loop
End

'Pengambilan data RTC DS1307
Getdatetime:
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 0

  I2cstart
  I2cwbyte Ds1307r
  I2crbyte _sec , Ack
  I2crbyte _min , Ack
  I2crbyte _hour , Ack
  I2crbyte Weekday , Ack
  I2crbyte _day , Ack
  I2crbyte _month , Ack
  I2crbyte _year , Nack
  I2cstop
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 4
  I2cwbyte _day
  I2cwbyte _month
  I2cwbyte _year
  I2cstop
Return

Settime:
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 0
  I2cwbyte _sec
  I2cwbyte _min
  I2cwbyte _hour
  I2cstop
Return


atau download simulasi RTC DS1307 dan source code.

Jika sudah didownload sekali, maka download kembali dengan menghapus bagian program:
Time$ = "15:30:00"
Date$ = "04-30-11"
Karena RTC sekali download sudah tersimpan datanya dan jika ingin diubah bisa menggunakan Hyperterminal seperti yang telah dijelaskan diatas. 

Kalau bagian tsb tidak dihapus maka jam dan tanggal akan terus mengulang dari pengaturan tsb.

sumber