• Tidak ada hasil yang ditemukan

Latihan-1: Jam Digital (LCD) dengan RTC DS1307

Okey, setelah sekilas saya berikan penjelasan tentang DS1307, maka ini saat-nya untuk melakukan latihan agar bisa dipahami dengan jelas bagaimana menangani DS1307 menggunakan mikrokontroler AVR, khususnya ATMega8535 (atau juga Atmega lainnya).

Rangkaian yang digunakan ditunjukkan pada Gambar 7.6 (Proteus 7.4 SP3). Perhatikan aturan rangkaian baku yang sudah dijelaskan sebelumnya. Pin SDA dan SCL bisa juga Anda hubungkan dengan dua pin terpisah lainnya, asalkan deklarasi pada BASCOM AVR-nya juga menyesuaikan.

Gambar 7.6. Rangkaian jam digital berbasis DS1307

Baiklah, seperti biasa kita awali program kita dengan mendeklarasikan berkas pustaka ATMega32 dan kristal yang digunakan (baris 1 dan 2). Sebagai tambahan kita deklarasikan juga sebuah variabel WEEKDAY sebagai byte (baris 4), variabel ini nantinya akan digunakan untuk membaca hari dalam minggu yang terdapat pada memori internal DS1307. Perlu diketahui juga, ada beberapa variabel yang tidak dideklarasikan secara eksplisit tetapi muncul dalam program, mengapa hal ini bisa terjadi dan tidak menyebabkan error? Akan dijelaskan lebih lanjut...

1: 'program RTC01.BAS

2: '

3: $regfile = "m16def.dat"

4: $crystal = 11059200

5:

6: Dim Weekday As Byte

7:

8: Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7

9: Config Lcd = 16 * 2

10: Config Date = Dmy , Separator = / ' setup format tgl & otomasi dekl. var. ybs 11: Config Clock = User ' aktivasi pemanggilan GetDateTime dari user 12:

Berikutnya, karena kita meggunakan LCD untuk menampilkan jam digital kita, maka perlu dilakukan deklarasi LCD seperti biasanya (baris 8 harus diketikkan dalam satu baris, dan baris 9).

Okey, sampai disini hal-hal rutin yang telah dijelaskan pada modul-modul sebelumnya sudah kita lakukan (baris 1 sampai dengan 9).

Selanjutnya akan saya perkenalkan deklarasi penting yang berhubungan dengan operasi DS1307. Pertama adalah CONFIG DATE sebagaimana ditunjukkan pada baris 10. Instruksi ini digunakan untuk

format DayMonthYear (Tanggal, Bulan, Tahun), dengan demikian Anda bisa menuliskan beberapa macam kemungkinan, misalnya MDY, YMD, YDM dan seterusnya. Kemudian untuk pemisah antara tanggal, bulan dan tahun digunakan tanda “/” (separator).

Instruksi berikutnya, pada baris 11, diperkenalkan deklarasi baru CONFIG CLOCK yang digunakan untuk mengkonfigurasi pewaktu yang digunakan oleh variabel TIME$ dan DATE$. Ini adalah dua variabel yang langsung akan dideklarasikan secara otomatis oleh BASCOM AVR saat Anda memberikan instruksi CONFIG CLOCK. Pilihan ada dua: CONFIG CLOCK = SOFT, artinya menggunakan rutin-rutin jam milik BASCOM AVR, tetapi karena kita ingin menggunakan rutin-rutin sendiri (mengambil data dari piranti eksternal DS1307), maka digunakan instruksi atau deklarasi CONFIG CLOCK = USER, sebagaimana ditunjukkan pada baris 11.

Sampai pada baris 11 tersebut, maka BASCOM AVR secara otomatis akan menyiapkan variabel-variabel: _sec , _min , _hour, _day , _month dan _year. Variabel-variabel tersebut yang nantinya akan digunakan dalam program kita, selain TIME$ dan DATE$ yang sudah dijelaskan sebelumnya. Baik. Langkah berikutnya adalah mendefisinikan sambungan I2C DS1307 (SCL dan SDA) dengan mikrokontroler, yaitu PORTC.0 dan PORTC.1 sebagaimana ditunjukkan pada baris 15 dan 17 (menyesuaikan rangkaian):

13: '---14: ' konfigurasi bus I2C

15: Config Scl = Portc.0 16: ' jalur untuk clock I2C 17: Config Sda = Portc.1 18: ' jalur untuk data I2C

19: '---20:

Perlu diketahui, komunikasi I2C membutuhkan alamat-alamat akses pada piranti yang bersangkutan. Untuk DS1307, alamat untuk mengakses penulisan memori adalah 0xD0 (&HD0), sedangkan untuk pembacaan data adalah 0xD1 (&HD1), kita lakukan dengan dua konstanta berikut (baris 22 dan 24):

21: ' perintah penulisan 22: Const Ds1307w = &HD0 23: ' perintah pembacaan 24: Const Ds1307r = &HD1 25: '---26:

Mengapa menggunakan alamat &HD0 dan &HD1? Perhatikan Gambar 7.7, pada bagian yang diberi panah, alamat DS1307 diawali dengan &HD, kemudian diikuti dengan pilihan Read atau Write (samping kanan dari bagian yang dipanah), jika menulis data R/W=0, untuk membaca data R/W=1, dengan demikian jika digabungkan menjadi &HD0 untuk penulisan data dan &HD1 untuk pembacaan data.

Baiklah, sudah kita siapkan semuanya, sekarang tinggal menuliskan rutinitas program-nya. Yaitu menampilkan jam digital melalui LCD 2x16 karakter.

Kita awali dengan menampilkan salam pembuka melalui layar LCD, silahkan mengganti sendiri kalau dirasa kurang menarik, atau hapus saja kalau dirasa tidak perlu. Rangkaian instruksi-nya ditunjukkan pada baris 28 sampai dengan 32, perlu ditahan sekitar 1 detik untuk menampilkan salam pembuka, apalagi kalau ada nama Anda ditampilkan di LCD, keren khan... he he he...

27: '---28: Cls 29: Cursor Off 30: Locate 1 , 3 31: Lcd "DS1307 demo!" 32: Wait 1 33:

Rutinitas-nya ditunjukkan antara DO dan LOOP pada baris 33 sampai dengan 42. Sebentar! Kok cuman kayak gitu? Mosok gak ada pemanggilan subrutin baca data dari DS1307?? Nah itu dia kelebihan saya... eh bukan maksudnya BASCOM AVR. Karena sudah kita definisikan menggunakan CONFIG CLOCK = USER, maka program akan secara otomatis memanggil subrutin internal GetDateTime (nama ini harus ditulis persis dan nantinya akan dijelaskan lebih lanjut).

So, yang perlu dilakukan dalam hal ini hanya cukup menampilkan isi dari variabel TIME$ (baris 35 dan 36) serta isi variabel DATE$ (baris 37 dan 38), cukup mudah bukan?

34: '---35: Cls

36: Do ' jalankan setiap saat 1 detik sekali 37: Locate 1 , 2

38: Lcd Time$ 39: Locate 2 , 2 40: Lcd Date$ 41:

42: Wait 1 ' tunggu 1 detik 43:

44: Loop

45: '---46: End

47:

Okey, kalau begitu mana rutin GetDateTime-nya? Ini dia...

48: Getdatetime: 49: I2cstart 50: I2cwbyte Ds1307w 51: I2cwbyte 0 52: 53: I2cstart 54: I2cwbyte Ds1307r

55: I2crbyte _sec , Ack ' _sec sdh otomatis terdefinisi 56: I2crbyte _min , Ack

57: I2crbyte _hour , Ack 58: I2crbyte Weekday , Ack 59: I2crbyte _day , Ack 60: I2crbyte _month , Ack 61: I2crbyte _year , Nack 62: I2cstop

65: _hour = Makedec(_hour) 66: _day = Makedec(_day) 67: _month = Makedec(_month) 68: _year = Makedec(_year) 69: Return

Ini adalah rutin I2C yang perlu dilakukan agar dapat dibaca data tanggal sekaligus jam-nya RTC DS1307. Ingat setiap piranti I2C memiliki cara akses yang berbeda, cara yang saya jelaskan disini hanya berlaku untuk RTC DS1307.

Rutin diawali dengan instruksi I2CSTART (baris 49) dan dilanjutkan dengan dua kali I2CWBYTE (perintah I2C untuk menuliskan data) yang ditunjukkan pada baris 50 dan 51. I2CWBYTE DS1307W (baris 50) digunakan untuk memberitahukan DS1307 alamat akses untuk penulisan data pada register di alamat &HD0 (lihat penjelasan paling awal di modul ini). Kemudian diakhiri dengan I2CWBYTE 0 (baris 51).

Selanjutnya setelah ketiga instruksi tersebut, DS1307 sudah siap (ready) baik untuk urusan penulisan data maupun pembacaan data. Karena pada aplikasi ini hanya dibaca saja data dari DS1307, maka rangkaian perintah diawali dengan I2CSTART (baris 53), diikuti dengan I2CWBYTE DS1307R (baris 54) untuk akses pembacaan register pada alamat &HD1. Langkah selanjutnya adalah proses pembacaan data itu sendiri, dimulai dengan data detik, menggunakan instruksi I2CRBYTE, sebagaimana ditunjukkan pada baris 53, yang kemudian disimpan dalam variabel _sec. Parameter ACK pada akhir instruksi I2CRBYTE digunakan untuk memberitahukan masih ada data lain yang perlu dibaca, yaitu menit (baris 56), kemudian data jam (baris 57) dan seterusnya (baris 58 sampai dengan 61). Diakhiri dengan menghentikan I2C menggunakan instruksi I2CSTOP.

Langkah berikutnya adalah mengubah data-data yang telah terbaca, karena masih dalam format BCD, menjadi data desimal menggunakan fungsi MAKEDEC(), sebagaimana ditunjukkan pada baris 63 sampai 68. Contoh tampilan hasil ditunjukkan pada Gambar 7.8.

Gambar 7.8 Program selengkapnya sebagai berikut...

'program RTC01.BAS '

$regfile = "m16def.dat" $crystal = 11059200 Dim Weekday As Byte

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

Config Lcd = 16 * 2

Config Date = Dmy , Separator = / ' setup format tgl & otomasi deklarasi var. ybs Config Clock = User ' aktivasi pemanggilan GetDateTime dari user

'---' konfigurasi bus I2C Config Scl = Portc.0 ' jalur untuk clock I2C Config Sda = Portc.1 ' jalur untuk data I2C

'---' perintah penulisan Const Ds1307w = &HD0 ' perintah pembacaan Const Ds1307r = &HD1 '---Cls Cursor Off Locate 1 , 3 Lcd "DS1307 demo!" Wait 1 '---Cls

Do ' jalankan setiap saat 1 detik sekali Locate 1 , 2

Lcd Time$ Locate 2 , 2 Lcd Date$

Wait 1 ' tunggu 1 detik Loop '---End Getdatetime: I2cstart I2cwbyte Ds1307w I2cwbyte 0 I2cstart I2cwbyte Ds1307r

I2crbyte _sec , Ack ' _sec sdh otomatis terdefinisi 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

Dokumen terkait