Dalam desain
rangkaian elektronika digital, kita kadang membutuhkan sebuah sistem berbasis
waktu yang memiliki akurasi yang tinggi. Tengoklah satu contoh pada sistem
komputer di mana kita menjumpai fungsi tersebut untuk menjaga agar informasi
waktu meliputi jam, menit dan detik senantiasa upto date, begitupun dengan
hari, tanggal, bulan dan tahun. Apalagi jika perangkat memang khusus dirancang
sebagai penunjuk waktu seperti jam tangan atau meja berbasis digital yang
menggunakan tampilan LCD atau LED 7 segmen. Bahkan pada sistem panel kendali
baik itu berfungsi sebagai pintu akses atau panel alarm sudah banyak yang
melengkapi rancangannya dengan sistem waktu. Bagaimana dengan sistem absensi
digital? So pasti mutlak menggunakannya.
Pada sistem digital
untuk keperluan menjaga informasi waktu digunakan sebuah komponen khusus yang
disebut RTC atau real time clock dalam bentuk serpih atau IC. Kebanyakan bahkan
dilengkapi dengan RAM atau random access memory untuk keperluan menyimpan data
yang dibutuhkan oleh sistem utama.
Jika Sobat mencoba
menelusuri melalui internet untuk mencari jenis-jenis RTC khususnya jika Sobat
ingin mengoleksi datasheet, maka dengan kata kunci “RTC” saja akan dijumpai
puluhan bahkan ratusan jenis komponen yang memiliki fungsi tersebut.
Nah, salah satu
jenis yang akan penulis utarakan dalam ulasan topik kali ini adalah sebuah
RTC-RAM masih dari Dalas Semiconductor bernama DS1307. Pada datasheet, jenis
ini disebutkan sebagai “64x8, Serial, I2C Real-Time Clock”.
Seperti saudaranya
yaitu DS1302 yang pernah kita bahas sebelum ini, maka serpih DS1302 memiliki
fasilitas informasi waktu yang valid hingga hitungan tahun 2100 tetapi memiliki
RAM dengan kapasitas yang lebih besar yaitu 56 byte. Sebagai perancang amatiran
meski kadang dijadikan sebuah profesi, penulis menggunakan jenis ini dengan
kemasan DIP dengan 8 penyemat. Untuk antarmuka dengan mikrokontroler, serpih
DS1307 yang memiliki antarmuka I2C menyediakan 2 saluran komunikasi
serial yaitu SCL dan SDA.
Untuk akurasi
waktu, serpih DS1307 menggunakan sebuah kristal bernilai 32,768 kHz yang
terhubung pada penyemat 1 dan 2. Secara internal frekuensi yang dihasilkan akan
dibagi oleh pencacah mundur yang berjumpah 16 bit sehingga memperoleh nilai 1
detik disamping sinyal osilasi juga dimanfaatkan untuk operasi internal dari
serpih itu sendiri.
Sesuai fungsinya
sebagai penjaga waktu, DS1307 memiliki penyemat yang terhubung pada batere
(backup battery) yaitu VBAT. Sobat bisa menggunakan jenis batere Lithium
yang umum dan menjadi standar namun penggunaan jenis lain juga tidak menjadi
soal selama sesuai dengan rancangan dan spesifikasi dari serpih ini. Serpih ini
mengkonsumsi arus maksimal sekitar 500 nA dengan kondisi osilator bekerja.
Sebuah batere lithium dengan kapasitas 48 mAh sudah mampu untuk menjaga serpih
tetap eksis selama kurun waktu hingga 10 tahun, bisa Sobat bayangkan.
Untuk informasi
lengkap berkenaan dengan serpih DS1307 ini dapat Sobat lihat pada datasheet.
Penulis akan melanjutkan pembahasan dengan bagaimana membuat modul antarmuka
pada serpih ini.
Kita sudah
mengetahui jika serpih DS1307 memiliki antarmuka I2C dengan 2
penyemat untuk komunikasi serial dengan mikrokontroler atau perangkat di
luarnya. Antarmuka ini tidak lain diperlukan untuk membaca atau menulis ke
dalam serpih. Adapun diagram pewaktuannya untuk mempermudah pengertian
bagaimana melakukan antarmuka I2C dapat dilihat pada gambar berikut
ini:
Pada protokol
antarmuka I2C, di mana perangkat mengirim data ke bus didefinisikan
sebagai pemancar (transmitter) dan sebaliknya saat menerima data didefinisikan
sebagai penerima (receiver). Perangkat yang mengendalikan pesan disebut Master
dan sebaliknya perangkat yang dikendalikan disebut Slave.
Pada antarmuka I2C
terdapat 2 kondisi untuk memulai dan mengakhiri komunikasi serial. Pertama
adalah kondisi START. Perubahan sinyal jalur data (SDA) dari tinggi ke rendah
pada saat jalur pulsa (SCL) tinggi maka kondisi ini didefinisikan sebagai
START. Kondisi kedua adalah STOP. Perubahan sinyal jalur data (SDA) dari rendah
ke tinggi pada saat jalur pulsa (SCL) tinggi maka kondisi ini didefinisikan
sebagai STOP. Operasi transfer data dilaksanakan pada periode antara kondisi
START dan STOP.
Kondisi lain yang
perlu dicermati pada antarmuka I2C adalah bilamana kedua jalur baik
SDA maupun SCL berkondisi tinggi maka status serpih dalam kondisi tidak sibuk
dan siap diajak berkomunikasi. Kemudian kondisi yang berkaitan dengan Data Sah,
ini terjadi bilamana status SDA setelah kondisi START adalah stabil pada
periode SCL yang tinggi. Kondisi logika SDA berubah selama periode SCL rendah.
Pada setiap akhir
dari penerimaan dari perangkat baik alamat maupun data, perangkat master harus
membangkitkan sinyal ACK (acknowledge) yaitu dengan memberikan pulsa tambahan
pada SCL. SDA harus dikondisikan rendah selama periode pulsa dari SCL. Untuk
mempermudah pemahaman, pada intinya pada setiap akhir penerimaan byte maka
master wajib membangkitkan kondisi ACK yaitu kondisi pemberian sinyal pulsa
tambahan pada SCL pada kondisi di mana SDA harus ditetapkan rendah. Namun
kondisi ACK dapat ditetapkan dengan SDA yang tinggi pada akhir periode transfer
di mana master kemudian membangkitkan kondisi STOP.
Demikian sedikit
gambaran mengenai antarmuka dengan protokol I2C. Selanjutnya kita
akan memasuki pembahasan mengenai formasi data yang diperlukan pada proses
transfer data pada DS1307. Bergantung pada kondisi bit R/W maka ada 2 jenis
transfer data yang memungkinkan yaitu transfer data dari master transmitter ke
slave receiver dan transfer data dari slave receiver ke master transmitter.
Pada transfer data
dari master transmitter ke slave receiver, byte pertama yang ditransmisikan
oleh master adalah alamat (slave address). Selanjutnya diikuti oleh beberapa
byte data. Sinyal ACK diperlukan oleh slave pada setiap akhir transfer setiap
byte. Byte data yang ditransfer dimulai dari MSB.
Pada transfer data
dari slave receiver ke master transmitter, byte pertama yang ditransmisikan
oleh master adalah alamat (slave address). Slave kemudian mengembalikan bit ACK
yang diikuti dengan transfer data. Master harus mengembalikan bit ACK ini
sampai akhir transfer. Akhir dari transfer data sebuah “NO ACK” dikembalikan.
Berikut adalah 2
mode operasi dari DS1307 yaitu Slave Receiver Mode (Write Mode) atau mode
menulis ke serpih dan Slave transmitter Mode (Read Mode) atau mode membaca
serpih. Diagram kedua mode tersebut dapat dilihat berikut ini:
Sebagai catatan
dari diagram di atas bahwa DS1307 memiliki alamat tetap dalam serpihnya yaitu 1101000.
Mode Tulis
Setelah kondisi
START, sebuah alamat harus dikirimkan berupa 7 bit data yaitu 1101000 yang
diikuti oleh bit R/W yang bernilai 0 untuk operasi menulis. Setelah menerima
dan mendekode alamat maka DS1307 akan mengeluarkan sinyal ACK pada SDA. Setelah
operasi ACK maka selanjutnya master mengirimkan alamat (word address) ke DS1307
di mana data ini akan diset pada register penunjuk dari serpih DS1307. Kemudian
setelah proses ACK maka master dapat mengirimkan 0 atau beberapa byte data ke
DS1307 dengan menambahkan proses ACK pada setiap byte data. Isi Register Pointer
secara otomatis akan bertambah setiap proses penulisan data. Untuk mengakhiri
mode menulis, master harus membangkitkan kondisi STOP.
Mode Baca
Pada operasi baca,
setelah kondisi START dan sebuah alamat 7 bit yaitu 1101000 dikirimkan diikuti
oleh bit R/W yang bernilai 1. Setelah menerima dan mendekode alamat maka DS1307
akan mengeluarkan sinyal ACK pada SDA. DS1307 kemudian akan memulai transmisi data diawali oleh data pada alamat
register yang ditunjuk oleh Register Pointer. Jika Register Pointer tidak
ditetapkan pada inisialisasi dari mode baca maka alamat awal yang dibaca adalah
satu data terakhir yang disimpan dalam register pointer. Isi Register Pointer secara otomatis akan bertambah setiap proses penulisan data. DS1307 harus menerima NO ACK pada akhir
proses mode baca.
Setelah kita
memahami bagaimana cara membaca dan menulis, sekarang adalah register apa saja
dalam serpih DS1307 yang disediakan.
Sesuai namanya pada datasheet, serpih DS1307 memiliki 64 byte data pada
registernya yang menempati lokasi 00H sampai 3FH. Alokasi alamat untuk RTC sebanyak 8 byte menempati
ruang dari 00H sampai 07H. Sisanya sebanyak 56 byte dari 08H sampai 3FH
digunakan untuk RAM.
Dari alokasi alamat register
di atas terutama pada area
00H sampai 07H ada beberapa hal yang perlu diketahui
berkenaan dengan pengoperasian dan format yang disediakan oleh serpih ini.
Untuk register yang berkaitan dengan informasi waktu tersebut menggunakan
format data BCD (binary coded decimal). Sementara untuk setingan masing-masing
data waktu juga disisipkan pada bit yang bersesuai dengan isi register
tersebut.
Register pada
alamat 00H berisi informasi detik memiliki format BCD menggunakan Bit6
– Bit0 untuk data 00H sampai 59H. Bit7 atau CH dari
register ini berfungsi sebagai “Clock Halt” di mana jika bernilai 0 maka
osilator akan START sementara jika bernilai 1 maka osilator menjadi STOP.
Register pada
alamat 01H berisi informasi menit juga menggunakan Bit6 – Bit0
untuk data 00H sampai 59H. Bit7 dibernilai 0.
Register dengan
alamat 02H berisi informasi jam memiliki 2 mode untuk format jam yang digunakan
yaitu mode 12 dan 24 jam. Bit7 selalu dibernilai 0. Jika Bit6
bernilai 1 maka serpih beroperasi pada mode 12 jam. Pada mode 12 jam, Bit5
berisi informasi AM/PM di mana nilai 0 adalah AM dan 1 untuk PM. Pada mode 12
jam informasi waktu diberikan oleh Bit4 – Bit0 untuk data
01H sampai 12H. Sebaliknya jika Bit6 bernilai 0 maka serpih
beroperasi pada mode 24 jam. Pada mode 24 jam informasi waktu diberikan oleh
Bit5 – Bit0 untuk data 00H sampai 23H.
Register dengan
alamat 03H berisi informasi hari dalam seminggu menggunakan Bit2 –
Bit0 dengan data 1H sampai 7H. Register dengan alamat 04H berisi
informasi tanggal menggunakan Bit5 – Bit0 dengan data 01H
sampai 28/29/30/31H sesuai dengan jumlah hari pada masing-masing bulan yang
bersesuaian. Register dengan alamat 05H berisi informasi bulan menggunakan Bit4
– Bit0 dengan data 01H sampai 12H. Bit-bit yang tidak digunakan pada
masing-masing register ini selalu bernilai 0.
Register dengan alamat 06H menggunakan
seluruh bit untuk informasi tahun antara 00H hingga 99H.
Register terakhir dari 8 byte pertama adalah 07H yang berisi CONTROL. Bit7 atau OUT berfungsi
mengendalikan keluaran pada penyemat SQW/OUT ketika keluaran gelombang persegi
dinonaktifkan. Jika bit SQWE bernilai 0 maka keluaran pada penyemat SQW/OUT
adalah 1 jika bit OUT 1 dan 0 jika bit OUT 0. Bit4 atau SQWE (square wave enable) jika
bernilai 1 akan mengijinkan keluaran osilator yang besarnya ditentukan oleh
nilai pada bit RS1 dan RS0. Jika keluaran diset pada 1 Hz maka register waktu
akan diperbaharui pada tepi turun dari gelombang kotak keluarannya. Bit1 dan Bit0 atau
RS1 dan RS0 berisi seting untuk frekuensi keluaran SQW/OUT di mana jika 00
frekuensi keluaran adalah 1 Hz, jika 01 maka keluarannya 4,096 kHz, jika 10
keluaran menjadi 8,192 kHz dan jika 11 maka keluaran SQW/OUT adalah 32,768 kHz.
Nah,
sepertinya perkenalan dengan serpih DS1307 sudah cukup. Sekarang saatnya untuk mulai membahas modul antarmuka yang diinginkan termasuk
bagaimana mengelola seting yang diperlukan. Modul yang akan dibahas adalah
antarmuka dengan keluarga MCS51 seperti mikrokontroler AT89.
Untuk menjalankan
modul DS1307, Sobat perlu menuliskan baris berikut untuk memanggil subrutin I2C
yang diperlukan. Lokasi file I2C.TXT sesuai dengan di mana Sobat meletakkannya,
berikut hanyalah sebuah contoh yang aku buat.
$include (c:\tesasm\I2C.txt)
Selanjutnya di
bawah ini adalah subrutin membaca dan menulis pada serpih DS1307 yang dimulai
dengan subrutin aktifasi osilator yaitu DS1307_ClockRun. Pada subrutin-subrutin
berkaitan dengan DS1307, register-register yang berpengaruh adalah DPTR di mana
nilai DPH berisi panjang data yang akan ditulis atau dibaca dan DPL berisi
alamat awal dari register yang dituju. Kemudian register R0 berisi alamat RAM
dari sistem mikrokontroler yaitu lokasi di mana data akan dikirim atau
disimpan.
DS1307_ClockRun:
mov dptr,
#100h
acall DS1307_Read
mov a,
@r0
anl a,
#01111111b
mov @r0,
a
acall DS1307_Write
ret
DS1307_Write:
push 07h
acall I2C_Start_Con
mov a,
#11010000b
acall Master_Tx
jnb FACK,
WriteClkAbort
mov a,
dpl
acall Master_Tx
jnb FACK,
WriteClkAbort
mov r7,
dph
WriteClk:
mov a,
@r0
inc r0
acall Master_Tx
jnb FACK,
WriteClkAbort
djnz r7,
WriteClk
WriteClkAbort:
acall I2C_Stop_Con
pop 07h
ret
DS1307_Read:
push 07h
acall I2C_Start_Con
mov a,
#11010000b
acall Master_Tx
jnb FACK,
ReadClkAbort
mov a,
dpl
acall Master_Tx
jnb FACK,
ReadClkAbort
acall I2C_Stop_Con
acall I2C_Start_Con
mov a,
#11010001b
acall Master_Tx
jnb FACK,
ReadClkAbort
clr FLB
mov r7,
dph
ajmp ReadLastClk
ReadClk:
acall Master_Rx
mov @r0,
a
inc r0
ReadLastClk:
djnz r7,
ReadClk
setb FLB
acall Master_Rx
mov @r0,
a
ReadClkAbort:
acall I2C_Stop_Con
pop 07h
ret
Demikian modul
antarmuka dengan DS1307 pada keluarga MCS51 dan aku menamai modul ini
DS1307.TXT untuk penggunaan pada aplikasi lainnya nanti.
Udah ya, makasih
udah baca postingan aku. Semoga bisa bermanfaat, sukur-sukur bisa diterapkan
oleh sobat semua.
Salam....
trimakasih banyak itu sangar berguna
BalasHapusSama-sama Mas Bro, aku juga masih belajar koq....
BalasHapusmas sigit tolong bisa di lengkapin contoh programnya dengan keterangannya biar lebih jelas soalnya takut salah cara pembacaannya seperti contoh di bawah.. maaf soalnya saya baru belajar
HapusDS1307_Write:
push 07h ;simpan alamat control ds1307 di stack pointer
acall I2C_Start_Con ;mulai start clr sda
mov a, #11010000b ; D0h mode tulis
acall Master_Tx ;clr rw 0 mode write
jnb FACK, WriteClkAbort ;if busy
mov a, dpl
acall Master_Tx ;clr rw 0 mode write
jnb FACK, WriteClkAbort ;if busy
mov r7, dph ; simpan di R7
Wah ide menarik...
HapusUntuk melengkapi setiap baris perintah dengan keterangan seperti itu pastinya sangat membatu pembelajaran pemrograman mikro ya...
Begini saja
Untuk artikel mungkin bisa mengakibatkan tulisan jadi sangat panjang meski bukan tidak memungkinkan. Saya justru berpikir untuk membuatkan Ebook untuk setiap artikel yang sudah ditulis jadi Sobat bisa mendapatkan versi lengkapnya.
Untuk contoh di atas jadi seperti ini:
DS1307_Write:
push 07h ;menyimpan register 07h ke stack pointer
acall I2C_Start_Con :memanggil sub-rutin I2C_Start_Con
mov a, #11010000b ;mengisi akumulator dengan alamat DS1307 (1101000) dan operasi menulis (0)
acall Master_Tx ;memproses akumulator dengan sub-rutin Master_Tx
jnb FACK, WriteClkAbort ;memeriksa bit FACK jika 0 melompat ke WriteClkAbort, jika 1 perintah dilanjutkan
mov a, dpl ;mengisi akumulator dengan DPL yang berisi alamat register DS1307
acall Master_Tx ;mengirim alamat pada akumulator dengan sub-rutin Master_Tx
dan seterusnya
permisi mas saya mau tanya...
BalasHapusini saya sudah buat rangkaian RTC DS1307 interface dengan ATMega32. tapi masalahnya RTCnya tidak bisa jalan. nilai yg ditampilkan selalu 00:00:00. katanya klo jam tidak bergerak biasanya ada masalah dengan crystalnya, tapi ini saya sudah ganti crystal berkali-kali (>10) masih tidak bisa juga. mungkin mas bisa membantu. trimakasih sbelumnya...
NB: saya pake bahasa C
saya kira programx sudah benar karena referensi yg saya baca programnya sama semua. jadi kmungkinan besar ada masalah dengan rangkaiannya
Ada beberapa kemungkinan penyebab rangkaian RTC tidak berjalan. Berdasarkan pengalaman saya pribadi
BalasHapus1. Aplikasi yang dijalankan pada controller ada kesalahan. Tapi jika sesuai referensi dan dijamin berjalan maka...
2. Rangkaian yang kita buat ada kesalahan. Mungkin ada jalur yang putus. Pastikan juga dengan datasheet RTC tersebut. Jika sudah oke maka...
3. IC RTCnya rusak. ini mungkin saja terjadi karena saya sendiri dari 5 IC yang dibeli kemungkinan ada 1 yang rusak. Ini sering saya alami dan pemecahannya cuma 1 yaitu ganti IC nya.
Trims