Translate

Modul Antarmuka RTC-RAM DS1302 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 dari Dalas Semiconductor bernama DS1302. Pada datasheet, jenis ini disebutkan sebagai “Trickle Charge Timekeeping Chip”.


Serpih DS1302 yang akan kita bahas, di samping memiliki fasilitas informasi waktu yang valid hingga hitungan tahun 2100 juga memiliki RAM dengan kapasitas 31 byte. Sebagai perancang amatiran meski kadang dijadikan sebuah profesi, penulis menggunakan jenis ini dengan kemasan DIP dengan 8 penyemat. Untuk antarmuka dengan mikrokontroler, serpih DS1302 menyediakan 3 saluran komunikasi serial yaitu RST (reset aktif rendah), SCLK dan I/O.

Untuk akurasi waktu, DS1302 menggunakan sebuah kristal bernilai 32,768 kHz yang terhubung pada penyemat 2 dan 3. 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, DS1302 memiliki penyemat yang terhubung pada batere (backup battery) yaitu VCC1. Sobat bisa menggunakan jenis batere NiCD atau Lithium yang umum dan menjadi standar namun penggunaan jenis lain juga tidak menjadi soal selama sesuai dengan rancangan dan spesifikasi dari serpih ini. Sebagai informasi, serpih ini beroperasi dengan baik pada tegangan kerja 2 volt hingga 5,5 volt. Konsumsi arus yang diperlukan bisa Sobat lihat pada tabel berikut:


 Untuk informasi lengkap berkenaan dengan serpih DS1302 ini dapat Sobat lihat pada datasheet. Penulis akan melanjutkan pembahasan dengan bagaimana membuat modul antarmuka pada serpih ini.

Kita sudah mengetahui jika serpih DS1302 memiliki 3 penyemat sebagai antarmuka 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 dapat dilihat berikut ini:


Diagram di atas adalah antarmuka komunikasi standar baca tulis yang dapat dilaksanakan pada serpih. Antarmuka dapat dilaksanakan dengan kondisi RST bernilai tinggi. Data akan ditransfer masuk ke serpih pada tepi naik dan ditransfer keluar pada tepi turun dari sinyal SCLK. Penyemat I/O berisi data atau informasi yang akan ditransfer. Sobat bisa melihat pada bagian bawah komposisi dari bit-bit dalam byte perintah atau alamat yang menunjukkan bahwa transfer data secara serial dimulai dari LSB ke MSB atau Bit0 ke Bit7 begitu pun dengan data yaitu D0 ke Dn.

Formasi perintah atau alamat sendiri terdiri dari Bit7 yang selalu bernilai 1. Bit6 untuk memilih register yang akan dibaca atau ditulis, 0 untuk RTC dan 1 untuk RAM. Kemudian Bit5 sampai Bit1 adalah alamat yang bersesuaian dengan register yang diinginkan. Terakhir Bit0 digunakan untuk menentukan operasi membaca atau menulis, 0 untuk tulis dan 1 untuk baca.

Setelah kita memahami bagaimana cara membaca dan menulis, sekarang adalah register apa saja dalam serpih DS1302 yang disediakan.


Untuk RTC atau CLOCK, kita menjumpai sebanyak 8 alamat register yang dapat dilihat secara berurutan yaitu SEC, MIN, HR, DATE, MONTH, DAY, YEAR, CONTROL dan TRICKLE CHARGER. Sementara untuk RAM terdapat 31 register yang dimulai dari RAM0 hingga RAM30. Semua alamat register ini dibaca atau ditulis secara independen sesuai alamat masing-masing dan menggunakan operasi SINGLE BYTE karena setiap register terdiri dari 8 bit data.

Pada gambar di atas terdapat format pengalamatan CLOCK BURST dan RAM BURST. Pada CLOCK BURST maka setiap operasi baca atau tulis setelah pengiriman perintah atau alamat diikuti oleh sebanyak 8 byte data yang dimulai dari informasi SEC hingga TRICKLE CHARGER. Sementara pada RAM BURST, setelah pengiriman perintah atau alamat diikuti oleh data sebanyak 31 byte. Kegunaan dari operasi baca tulis mode BURST adalah untuk mempercepat prosedur pembacaan register sehingga kita bisa menghemat waktu operasi dari mikrokontroler.

Dari register-register di atas terutama pada grup CLOCK ada beberapa hal yang perlu diketahui berkenaan dengan pengoperasian dan format yang disediakan oleh serpih ini. Untuk register yang berkaitan dengan informasi waktu 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 SEC untuk informasi detik memiliki format BCD menggunakan Bit6 – Bit0 untuk data 00H sampai 59H. Bit7 atau CH dari register ini berfungsi sebagai “Clock Halt Flag” di mana jika bernilai 0 maka osilator akan START sementara jika bernilai 1 maka osilator menjadi STOP.

Register MIN untuk informasi menit juga menggunakan Bit6 – Bit0 untuk data 00H sampai 59H. Bit7 selalu dibernilai 0.

Register HR untuk informasi jam memiliki 2 mode untuk format jam yang digunakan yaitu mode 12 dan 24 jam. Jika Bit7 dibernilai 1 maka serpih beroperasi pada mode 12 jam. Bit6 selalu diberi nilai 0. 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 Bit7 bernilai 0 maka serpih beroperasi pada mode 24 jam. Bit6 selalu dibernilai 0. Pada mode 24 jam informasi waktu diberikan oleh Bit5 – Bit0 untuk data 00H sampai 23H.

Register DATE untuk informasi tanggal menggunakan Bit5 – Bit0 dengan data 01H sampai 28/29/30/31H sesuai dengan jumlah hari pada masing-masing bulan yang bersesuaian. Register MONTH untuk informasi bulan menggunakan Bit4 – Bit0 dengan data 01H sampai 12H. Register DAY untuk informasi hari dalam seminggu menggunakan Bit2 – Bit0 dengan data 1H sampai 7H. Bit-bit yang tidak digunakan pada masing-masing register ini selalu bernilai 0.

Register YEAR menggunakan seluruh bit untuk informasi tahun antara 00H hingga 99H.

Register CONTROL menggunakan Bit7 sebagai proteksi data atau WP (write protect). Operasi tulis hanya dapat dilakukan bilamana nilai Bit7 adalah 0. Jika Bit7 bernilai 1 maka operasi menulis tidak dapat dilaksanakan. Bit6 – Bit0 pada register ini selalu bernilai 0.

Register terakhir dari grup CLOCK adalah TRICKLE CHARGER untuk keperluan seting yang berkaitan dengan batere pada VCC1. Ada 3 kelompok seting yang dapat dikelola melalui register ini yaitu Bit7 – Bit4 untuk seting TCS (trickle charge select), Bit3 – Bit2 untuk seting DS (diode select) dan Bit1 – Bit0 untuk seting RS (resistor select). Bit-bit TCS digunakan untuk mengaktifkan atau menon-aktifkan pengisian dan hanya menyediakan format 1010 saja untuk membolehkan pengisian. Bit-bit DS digunakan untuk memilih diode, DS dapat berisi 01 untuk 1 dioda atau 10 untuk penggunaan 2 dioda sementara nilai 00 atau 11 akan menon-aktifkan TCS secara independen. Bit-bit RS untuk memilih nilai resistansi pada pengisian batere.


Nah, sepertinya perkenalan dengan serpih DS1302 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 dengan mikrokontroler AT89.

Berikut hanyalah contoh penentuan konfigurasi penyemat untuk antarmuka. Sobat bisa menggunakan penyemat lainnya sesuai dengan rancangan rangkaian yang dibuat. Tapi pada modul ini dicontohkan menggunakan P1.2 untuk RST, P1.3 untuk SCLK dan P1.4 untuk I/O.

RST_RTC     bit   p1.2
CLK_RTC     bit   p1.3
DIO_RTC     bit   p1.4

Pada modul berikut ada beberapa register yang mungkin digunakan antara lain Register R0 yang berisi alamat register untuk menampung data pada mode BURST. Sementara untuk lokasi register DS1302 menggunakan DPL dari DPTR, isi dari DPH diabaikan meskipun nanti akan ikut terpengaruh pada operasi INC DPTR yang mungkin saja digunakan. Bit0 dari DPL juga diabaikan karena akan dimanipulasi pada subrutin baca atau tulis yang dipanggil maka jika menggunakan perintah INC DPTR setidaknya perlu diulang sebanyak 2 kali.

Berikut adalah subrutin yang berhubungan dengan rutin di luar dari modul yang dimulai dari subrutin DS1302_ClockRun yang berguna untuk mengaktifkan osilator serpih DS1302. Disini register DPL harus bernilai 00H sebagai alamat dari register SEC. Setelah pemanggilan operasi subrutin DS1302_Read maka selanjutnya memanipulasi data akumulator agar nilai ACC.7 bernilai 0 untuk kemudian ditulis kembali dengan subrutin DS1302_Write.

DS1302_ClockRun:
      mov   dpl, #0
      acall DS1302_Read
      anl   a, #01111111b
      acall DS1302_Write
      ret

Subrutin di atas tidak berdiri sendiri karena mengandung operasi subrutin DS1302_Write yang mana hanya dapat dilakukan dengan menon-aktifkan bit WP dari serpih terlebih dahulu menggunakan operasi subrutin DS1302_Enable. Untuk mencegah terjadinya penulisan ke dalam register maka rutin harus memanggil DS1302_Disable sebagai penutupnya.

Operasi subrutin DS1302_Enable dan DS1302_Disable dapat dilihat di bawah ini. Kedua subrutin sama-sama menggunakan DPL dengan nilai 10001110 yaitu alamat register CONTROL. Pada subrutin DS1302_Enable register akumulator berisi 0 untuk ACC.7 bernilai 0 dan subrutin DS1302_Disable ACC.7 harus bernilai 1.

DS1302_Enable:
      mov   a, #0
      mov   dpl, #10001110b
      acall DS1302_RTC_Write
      ret

DS1302_Disable:
      mov   a, #10000000b
      mov   dpl, #10001110b
      acall DS1302_RTC_Write
      ret

Pada operasi subrutin menulis berikut, informasi data ditempatkan pada akumulator dan alamat register yang akan diproses ditempatkan pada DPL. Pada subrutin DS1302_Write nilai DPL dimanipulasi agar Bit7 berharga 1 dan Bit0 berharga 0. Sementara pada DS1302_Read nilai DPL juga dimanipulasi agar Bit7 berharga 1 tetapi Bit0 menjadi 1.

Yang harus diperhatikan pada kedua operasi subrutin baik DS1302_Write maupun DS1302_Read adalah keduanya dapat digunakan untuk operasi pada kelompok register CLOCK atau RAM. Untuk operasi pada kelompok register RTC atau CLOCK maka pastikan bahwa nilai DPL pada Bit6 harus bernilai 0 sementara untuk operasi RAM Bit6 dari DPL harus bernilai 1.

DS1302_Write:
      push  acc
      setb  RST_RTC
      mov   a, dpl
      orl   a, #10000000b
      anl   a, #11111110b
      acall DS1302_WriteSerial
      pop   acc
      acall DS1302_WriteSerial
      clr   RST_RTC
      ret

DS1302_Read:
      setb  RST_RTC
      mov   a, dpl
      orl   a, #10000001b
      acall DS1302_WriteSerial
      acall DS1302_ReadSerial
      clr   RST_RTC
      ret

Berikut ini adalah 2 operasi subrutin yang berkaitan dengan mode BURST baik untuk CLOCK maupun RAM. Sebelum memanggil dan menjalankan subrutin-subrutin ini ada beberapa register yang harus ditentukan agar sesuai pengoperasiannya.

Untuk operasi CLOCK BURST maka nilai register R7 maksimal berisi 8 sesuai jumlah register pada kelompok CLOCK kemudian register DPL bernilai sembarang yang penting bit DPL.6 harus bernilai 0. Untuk mudahnya maka sebaiknya DPL diisi dengan 00H. Karena operasi CLOCK BURST membutuhkan maksimal 8 byte data yang harus ditampung maka register R0 setidaknya harus berisi lokasi RAM yang mampu menerima sebanyak 8 byte data.

Untuk operasi RAM BURST maka nilai register R7 maksimal berisi 1FH atau 31 sesuai jumlah register pada kelompok RAM kemudian register DPL bernilai sembarang yang penting bit DPL.6 harus bernilai 1. Untuk mudahnya maka sebaiknya DPL diisi dengan 0FFH atau 255. Karena operasi RAM BURST membutuhkan maksimal 31 byte data yang harus ditampung maka register R0 setidaknya harus berisi lokasi RAM yang mampu menerima sebanyak 31 byte data.

DS1302_WriteBurst:
      push  07h
      setb  RST_RTC
      mov   a, dpl
      orl   a, #10111110b
      anl   a, #11111110b
      acall DS1302_WriteSerial
      pop   07h

      WriteBurst:
            mov   a, @r0
            acall DS1302_WriteSerial
            inc   r0
            djnz  r7, WriteBurst
            clr   RST_RTC
            ret

DS1302_ReadBurst:
      push  07h
      setb  RST_RTC
      mov   a, dpl
      orl   a, #10111111b
      acall DS1302_WriteSerial
      pop   07h

      ReadBurst:
            acall DS1302_ReadSerial
            mov   @r0, a
            inc   r0
            djnz  r7, ReadBurst
            clr   RST_RTC
            ret

Semua operasi subrutin yang tertulis pada modul di atas membutuhkan operasi subrutin internal. Ada 2 buah subrutin yang berkaitan langsung dengan antarmuka antara mikrokontroler dengan serpih DS1302. Kedua subrutin tersebut adalah DS1302_WriteSerial dan DS1302_ReadSerial. Kedua subrutin ini beroperasi dengan menulis atau membaca bit per bit dari data serpih secara serial hingga mencapai 1 byte atau 8 bit.

DS1302_WriteSerial:
      push  07h
      mov   r7, #8

      WriteDataRTC:
            rrc   a
            jnc   WriteDataRTC_0
            setb  DIO_RTC
            ajmp  PulsaWriteRTC

      WriteDataRTC_0:
            clr   DIO_RTC

      PulsaWriteRTC:
            clr   CLK_RTC
            setb  CLK_RTC
            djnz  r7, WriteDataRTC
            rrc   a
            pop   07h
            ret

DS1302_ReadSerial:
      push  07h
      clr   a
      setb  DIO_RTC
      mov   r7, #8

      PeriksaDataRTC:
            setb  CLK_RTC
            clr   CLK_RTC
            jnb   DIO_RTC, BacaDataRTC_0
            setb  c
            ajmp  GeserDataRTC

      BacaDataRTC_0:
            clr   c

      GeserDataRTC:
            rrc   a
            djnz  r7, PeriksaDataRTC
            pop   07h
            ret

Demikian modul antarmuka dengan DS1302 pada keluarga MCS51 dan aku menamai modul ini DS1302.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....


4 komentar:

  1. mas mohon bantuannya, cara membuat modul I2C.txt gmana caranya atau minta file I2C.txt, 24c64.txt trimakasih. kirim ke email : luthfan_5091@yahoo.co.id

    BalasHapus
  2. Soal list program I2C.txt dan AT24C64 sudah saya kirim via email. Artikel tentang AT24C64 juga sudah ada. Silahkan baca :

    http://electronicdesignportal.blogspot.com/2012/09/antarmuka-i2c-untuk-memori-at24c3264.html

    smoga bisa jadi inspirasi. Ditunggu komentar selanjutnya.

    trims

    BalasHapus
  3. Apa bisa mengunakan 2ic DS1302 secara bersamaan sebagai RAM penampung memory 60 bytes? klo bisa bagaimana cara nya mas Sigit ? mohon pencerahan nya.

    BalasHapus
  4. Bisa saja....
    DS1302 memiliki 3 pin antar muka RST, SCLK dan I/O. Masing2 pin SCLK dan I/O bisa diparalel untuk beberapa IC. RST tidak bisa karena berfungsi memilih IC yang akan diproses atau harus dialamati. Bisa pakai dekoder atau paling simpel pakai saja port mikrokontroler yang ada. Satu pin RST dari masing2 DS1302 dihubungkan ke port uC. Jadi kalau 2 IC maka butuh 2 port. Jadi kebutuhan port total adalah 4 untuk 2 IC DS1302 yang dikaskade.
    Smoga cukup jelas ya....

    BalasHapus