Translate

Modul Antarmuka RTC-RAM DS1307 Pada MCS51



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....


6 komentar:

  1. trimakasih banyak itu sangar berguna

    BalasHapus
  2. Sama-sama Mas Bro, aku juga masih belajar koq....

    BalasHapus
    Balasan
    1. mas 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


      DS1307_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

      Hapus
    2. Wah ide menarik...

      Untuk 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

      Hapus
  3. permisi mas saya mau tanya...
    ini 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

    BalasHapus
  4. Ada beberapa kemungkinan penyebab rangkaian RTC tidak berjalan. Berdasarkan pengalaman saya pribadi

    1. 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

    BalasHapus