Translate

Peraga Jadual Sholat 2



Bagian Kedua

Pada bagian pertama kita sudah melihat jadual waktu Sholat yang merupakan data referensi bagi perangkat yang akan dibuat pada bagian ini. Pada bagian kedua, kita akan melihat rangkaian secara lengkap dari penampil jadual Sholat yang akan dibuat.

Hal pertama yang terpikir oleh penulis adalah konsep yang akan digunakan untuk menampilkan digit waktu. Mengapa ini perlu dipertimbangkan pertama kali? Jelas perlu, karena kita harus menetapkan bagian dari waktu dan jadwal yang akan ditampilkan melalui peraga LED 7 segmen.

Yang jelas jadual waktu Sholat dan terbit akan ditampilkan maka dari itu setidaknya kita membutuhkan 24 digit. Sementara untuk penunjuk waktu dengan format HHMMSS serta tanggal DDMMYY maka diperlukan 12 digit lagi. Total LED 7 segmen yang diperlukan adalah 36 digit.

Seperti pernah aku tulis pada artikel sebelumnya mengenai teknik mengoperasikan LED 7 segmen, di mana ada 2 cara yaitu dengan teknik scanning dan buffering. Masing-masing memiliki kelebihan dan kekurangan.

Dari sisi perangkat keras maka teknik scanning jelas lebih sedikit memerlukan komponen dibanding dengan teknik buffering yang membutuhkan sebuah kemudi latch untuk tiap digit LED 7 segmen.

Dari sisi perangkat lunak, jelas teknik buffering sedikit lebih sederhana ketimbang teknik scanning yang memerlukan waktu ekstra bagi mikrokontroler untuk menampilkan data pada LED 7 segmen.

Dari sisi tampilan maka teknik buffering lebih terlihat stabil tanpa ada kedipan, berbeda dengan teknik scanning yang harus menggilir setiap digit untuk ditampilkan. Berdasarkan pengalaman penulis, maka pada teknik scanning setidaknya membutuhkan kecepatan scanning hingga 100Hz atau lebih untuk menjamin tampilan tidak terlalu tampak berkedip.

Pada teknik scanning, siklus LED tidak 100% tetapi bergantung banyaknya digit yang dirotasikan. Untuk 36 digit maka hasilnya adalah daur aktif LED di bawah 2,7% bahkan mungkin hanya 2,5%. Dengan frekuensi 100Hz, total perioda 1 putaran adalah 10 ms sehingga masing-masing digit hanya aktif dalam 250us.

Lalu teknik penampil LED 7 segmen yang manakah yang akan digunakan?

Tidak usah kuatir, penulis akan menyampaikan kedua teknik tersebut. Namun pada bagian ini yang akan disampaikan adalah penampil jadual Sholat dengan teknik scanning terlebih dahulu.

Komponen utama yang digunakan adalah mikrokontroler jenis AT89C51 atau AT89S51 dari keluarga MCS51. Untuk RTC-RAM dapat menggunakan DS1307 dan untuk memori penyimpanan data waktu Sholat menggunakan AT24C512 di mana keduanya sama-sama memiliki antarmuka I2C.

Mikrokontroler AT89C51 memiliki 4 byte gerbang yakni P0, P1, P2 dan P3. Aku akan melakukan proses scanning ganda dari ke 36 digit menggunakan P0 dan P1 yang dihubungkan ke Anoda LED 7 segmen sehingga masing-masing gerbang mengoperasikan 18 digit. Sementara P2 digunakan untuk scanning alamat digit sebanyak 18 bit. Dengan demikian kita bisa menghemat penggunaan komponen 74LS138 menjadi cukup 3 buah saja.

Sekarang kita bisa mendapatkan daur aktif LED mencapai 5,5% dengan perioda ON masing-masing digit kurang lebih 500us.

Biar gampang sebelum dilanjutkan oborolannya, kita lihat rangkaian utamanya aja yuk!


Anoda dari setiap LED 7 segmen dihubungkan langsung pada CN101 dan CN102 yang masing-masing terhubung ke gerbang P0 dan P1 dan setiap kelompok terhubung secara paralel. Karena secara internal setiap keluaran gerbang memiliki pembatas arus sebesar 20mA maka kita tidak memerlukan tambahan resistor yang dihubungkan seri dengan LED.

Pada gambar di atas, untuk keperluan scanning menggunakan 74LS138 sebuah dekoder/demultiplekser 1 ke 8. Pengalamatan yang dibutuhkan adalah 18 bit saja dari 24 bit yang disediakan. Karena kita akan membagi 36 digit yang ditampilkan menjadi 2 bagian dengan masing-masing 18 digit. Alokasi ke 36 digit sesuai pengalamatan dari 74LS138 menjadi seperti berikut ini:

Alokasi Pengalamatan Dari Gerbang P2 Terhadap P0
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
10
11
Detik
Menit
J a m
Tanggal
Bulan
Tahun
J a m
Menit
J a m
Penunjuk Waktu
Penunjuk Penanggalan
S h u b u h
Terbit

Alokasi Pengalamatan Dari Gerbang P2 Terhadap P1
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
10
11
Menit
J a m
Menit
J a m
Menit
J a m
Menit
J a m
Menit
Terbit
D z u h u r
A s h a r
M a g h r i b
I  s  y  a

Untuk dapat menggerakkan LED maka keluaran dari 74LS138 masih memerlukan tambahan rangkaian berupa penggerak menggunakan transistor. Rangkaian penggerak tersebut dapat dilihat di bawah ini:


Keluaran dari 74LS138 menurut datasheet mampu mendayai hingga 8mA. Setiap transistor pada keadaan maksimal harus mampu memberikan arus sebesar 280mA dengan kondisi di mana setiap LED 7 segmen yang didayainya menunjukkan angka 8 atau seluruh LED menyala. Jika hFE dari transistor adalah 100 maka nilai resistor 1k5 adalah cukup untuk arus kemudi basis sebesar 2mA. Namun nilai tersebut bisa diturunkan sampai dengan 1k.

Berikut adalah aplikasi dasar yang minimal harus diisikan ke mikrokontroler. Aplikasi yang ditulis di bawah belum dilengkapi dengan rutin yang berhubungan dengan CN104 atau KONTROL yaitu fasilitas komunikasi serial dan pengaturan waktu secara manual.

Seperti biasa, penulisan program diawali dengan konfigurasi baik saluran gerbang maupun register atau RAM dari AT89C51 yang digunakan.

$mod51

PortDsp1    data  p0
PortDsp2    data  p1
PortDigit   data  p2

SCL         bit   p3.6
SDA         bit   p3.7

RegDetik    data  08h
RegDigit    data  09h
RegDsp1     data  0ah
RegDsp2     data  0bh
BufWaktu    data  0ch
BufJadwal   data  14h

RegBit      data  20h
      FSRDY       bit   RegBit.0
      FACK        bit   RegBit.1
      FLB         bit   RegBit.2

BufDisplay  data  27h
RegStack    data  50h

org   0h
      mov   sp, #RegStack-1
      mov   r4, #1
      mov   r5, #1
      ajmp  Periksa_Waktu

Setelah menuliskan beberapa perintah persiapan berupa penetapan register yang diperlukan dan melompat ke rutin Periksa_Waktu, maka disisipkan program berikut pada alamat 000BH yang merupakan alamat interupsi timer. Program ini digunakan untuk menampilkan peragaan pada LED 7 segmen secara scanning.

Jika dicermati, program berikut terbagi dalam 2 bagian yang ditentukan oleh nilai register R4. Saat R4 bernilai 1 maka program akan menjalankan perintah menampilkan data pada peraga. Program menjalankan perintah yang berkaitan dengan keluaran pada gerbang-gerbang seperti PortDigit, PortDsp1 dan PortDsp2. Perintah pada bagian ini membutuhkan waktu proses sekitar 25 siklus.

Kenapa aku tuliskan mengenai siklus mesin di atas? Nanti akan dijelaskan setelah beberapa paragraf di bawah ini.

org   0bh
      push  00h
      push  01h
      push  acc
      mov   r5, #5
      djnz  r4, Scan_Display
      mov   r4, #2
      mov   PortDigit, #255
      mov   PortDsp1, RegDsp1
      mov   PortDsp2, RegDsp2
      mov   PortDigit, RegDigit
      pop   acc
      pop   01h
      pop   00h
      reti

Sementara jika register R4 bernilai 2, maka program akan menjalankan perintah yang berhubungan dengan proses scanning pada register-register seperti RegDigit, RegDsp1 dan RegDsp2. Untuk perintah pada bagian ini masing-masing membutuhkan waktu proses sekitar 26 siklus.

      Scan_Display:
            mov   a, #17
            cjne  a, RegDigit, Scan_Berikut
            mov   RegDigit, #0
            mov   RegDsp1, #BufJadwal
            mov   RegDsp2, #BufJadwal+18
            pop   acc
            pop   01h
            pop   00h
            reti

            Scan_Berikut:
                  inc   RegDigit
                  inc   RegDsp1
                  inc   RegDsp2
                  pop   acc
                  pop   01h
                  pop   00h
                  reti

Pada rutin berikut yang merupakan rutin utama, program memeriksa nilai register R5 yang kegunaannya mirip “watchdog” atau berkaitan dengan timer peraga. Nilai register ini tidak boleh habis dicacah turun dan pada keadaan normal selalu diset pada program interupsi timer. Saat boot awal tentu subrutin interupsi belum aktif dan program akan menjalankan perintah inisialisasi timer karena nilai register R5 pastinya akan habis dicacah.

Pada inisialisasi, kita menggunakan timer 0 yang disetel auto-reload dengan nilai TH0 adalah 1 untuk menjalankan interupsi timer setiap 255 siklus termasuk siklus dalam subrutin interupsi itu sendiri. Maka jika subrutin interupsi timer sebelumnya membutuhkan 25 dan 26 siklus maka rutin hanya memiliki sisa sekitar 199 dan 250 siklus dalam menjalankan perintah. Maka sudah dapat dipastikan proses perintah pada rutin dan subrutin berikut akan mengalami interupsi.

Periksa_Waktu:
      djnz  r5, Periksa_Detik
      mov   r5, #5     
      mov   tmod, #02h
      mov   th0, #1
      mov   tl0, #1
      mov   ie, #8ah
      setb  tr0

Rutin berikut adalah untuk mengambil informasi register “detik” yang berasal dari RTS-RAM DS1307. Perintah yang dijalankan juga memeriksa status bit CH (clock halt) untuk memastikan RTC selalu berosilasi.

      Periksa_Detik:
            mov   a, #1
            mov   b, #0
            mov   r0, #BufWaktu
            acall DS1307_Read
            mov   a, BufWaktu
            jnb   acc.7, Ambil_Detik
            acall DS1307_ClockRUN

Data informasi detik dibandingkan dengan nilai register RegDetik pada rutin Ambil_Detik untuk memeriksa adanya peruban waktu dalam detik. Kemudian pada rutin Ambil_Waktu, informasi detik juga diperiksa, jika bernilai 00 yang berarti data menit pastinya juga berubah, maka program membaca waktu secara keseluruhan akan dijalankan untuk mendapatkan informasi menit, jam, tanggal, bulan dan tahun.

Setelah diperoleh informasi terkini dari waktu, maka selanjutnya kita akan menjalankan subrutin yang berkaitan dengan jadual Sholat pada subrutin Periksa_Bulan dan subrutin berkaitan dengan data register untuk peraga LED 7 segmen pada subrutin Set_Display.

            Ambil_Detik:
                  cjne  a, RegDetik, Ambil_Waktu
                  ajmp  Periksa_Waktu
     
                  Ambil_Waktu:
                        mov   RegDetik, a
                        jnz   Periksa_Waktu
                        mov   a, #6
                        mov   b, #1
                        mov   r0, #BufWaktu+1
                        acall DS1307_Read
                        acall Periksa_Bulan
                        acall Set_Display
                        ajmp  Periksa_Waktu

Hal pertama yang dijalankan pada subrutin Periksa_Bulan adalah menentukan lokasi memori dari jadwal yang sesuai dengan informasi waktu yang ada. Awalnya register DPTR berisi alamat awal dari data alamat yang dikurangkan sebanyak 2 byte karena seperti diketahui bahwa bulan dimulai dari nilai 1 bukan 0. Karena alamat memori dari jadwal membutuhkan data sebanyak 2 byte maka nilai bulan dikalikan dengan 2.

;I/P: BufWaktu+4 => data Bulan
;     BufWaktu+3 => data Tanggal
;O/P: Alamat Jadwal => DPTR

Periksa_Bulan:
      mov   dptr, #AlamatBulan-2
      mov   a, BufWaktu+5
      mov   b, #2
      mul   ab
      mov   b, a
      movc  a, @a+dptr
      xch   a, b
      inc   a
      movc  a, @a+dptr
      mov   dph, b
      mov   dpl, a
      mov   r1, BufWaktu+4
      ajmp  Ambil_Jadwal

Setelah program di atas dijalankan, kita akan mendapatkan data alamat yang sesuai dengan informasi bulan. Sebagai contoh, jika data bulan adalah 07H maka nilai DPTR seharusnya 0888H seperti ditunjukkan pada daftar alamat memori dari jadual di bawah ini.

AlamatBulan:
      db 00h, 00h, 01h,  74h, 02h, 0d0h, 04h,  44h, 05h, 0ach, 07h,  20h
      db 08h, 88h, 09h, 0fch, 0bh,  70h, 0ch, 0d8h, 0eh,  4ch, 0fh, 0b4h

Jika alokasi alamat memori untuk jadwal bulan sudah didapat, maka selanjutnya kita akan mencari alokasi yang lebih akurat sesuai dengan tanggal dari bulan tersebut. Setiap tanggal yang dilewati akan membuat nilai register DPTR bertambah 12 sampai tanggal yang sesuai.

Begitu tanggal yang dituju ditemukan maka selanjutnya program akan membaca informasi jadual Sholat yang disimpan pada memori AT24C512 yang kemudian dipindahkan ke BufJadwal.

Periksa_Tanggal:
      mov   r2, #12

      Cari_Tanggal:
            inc   dptr
            djnz  r2, Cari_Tanggal

      Ambil_Jadwal:
            djnz  r1, Periksa_Tanggal
            mov   r7, #12
            mov   r0, #BufJadwal
            acall AT24C512_Read
            ret

Sampai dengan subrutin di atas, kita sudah mendapatkan informasi baik waktu pada BufWaktu dan jadual Sholat pada BufJadwal. Selanjutnya kita akan memproses informasi tersebut untuk kebutuhan tampilan yang menggunakan BufDisplay.

Pertama adalah memproses informasi waktu. Karena ada sedikit perbedaan urutan maka proses dibagi menjadi 2 bagian. Proses dimulai dari urutan informasi jam (BufWaktu+2), menit (BufWaktu+1) kemudian detik (BufWaktu). Proses akan mengubah 3 byte data BCD menjadi 6 digit melalui subrutin Display_BCD.

Set_Display:
      mov   r6, #3
      mov   r0, #BufWaktu+2
      mov   r1, #BufDisplay

      Dsp_Jam:
            mov   a, @r0
            dec   r0
            acall Display_BCD
            djnz  r6, Dsp_Jam
            mov   r6, #3
            mov   r0, #BufWaktu+4

Proses pada bagian kedua untuk informasi tanggal (BufWaktu+4), bulan (BufWaktu+5) dan tahun (BufWaktu+6). Dari informasi waktu yang berjumlah 6 byte akan kita dapati jumlah digit untuk tampilan LED 7 segmen sebanyak 12 byte.

      Dsp_Tanggal:
            mov   a, @r0
            inc   r0
            acall Display_BCD
            djnz  r6, Dsp_Tanggal
            mov   r6, #12
            mov   r0, #BufJadwal

Untuk informasi jadwal yang disimpan pada BufJadwal akan diubah pula dari 12 byte BCD menjadi 24 digit informasi LED 7 segmen yang disimpan pada BufDisplay.

      Dsp_Jadwal:
            mov   a, @r0
            inc   r0
            acall Display_BCD
            djnz  r6, Dsp_Jadwal
            ret

Subrutin di bawah ini dijalankan untuk mengubah byte data ke dalam digit dari nibel yang dimulai dari MSB kemudian LSB.

      Display_BCD:
            mov   b, a
            swap  a
            acall DataLED
            xch   a, b
            acall DataLED
            djnz  r6, Display_BCD        
            ret

Data digit yang berasal dari nibel MSB dan LSB selanjutnya akan dikonversikan menjadi digit LED 7 segmen sesuai dengan data dari tabel alokasi pada Kode7Segmen.

DataLED:
      mov   dptr, #Kode7Segmen
      anl   a, #0fh
      movc  a, @a+dptr
      mov   @r1, a
      inc   r1
      ret

Kode7Segmen:
      db 11000000b, 11111001b, 10100100b, 10110000b, 10011001b
      db 10010010b, 10000010b, 11111000b, 10000000b, 10010000b

Untuk melaksanakan perintah di atas kita membutuhkan 3 modul tambahan yaitu DS1307.TXT, AT24C512.TXT dan I2C.TXT seperti dituliskan pada bagian di bawah ini.

$include (c:\tesasm\ds1307.txt)
$include (c:\tesasm\at24c512.txt)
$include (c:\tesasm\i2c.txt)

end

Sampai di sini aplikasi jadual Sholat sudah bisa berjalan namun belum sempurna. Untuk aplikasi kendali pengaturan manual waktu atau lainnya akan dibahas pada kesempatan berikut dari seri tulisan ini. Termasuk aplikasi komunikasi serial yang bisa diterapkan pada rangkaian di atas sebagai salah satu fasilitas.

Kebutuhan ruang penyimpanan informasi jadwal adalah 4.392 byte sementara kapasitas AT24C512 adalah 65.526 byte. Sobat bisa menggantinya dengan memori berkapasitas lebih kecil seperti AT24C256 yang memiliki kapasitas 32.768 byte, AT24C128 berkapasitas 16.384 byte dan minimal adalah AT24C64 yang berkapasitas 8.192 byte tanpa memerlukan perubahan program.

Jika Sobat tertarik untuk membuatnya, saran penulis sebaiknya menggunakan setidaknya AT24C128 untuk pengembangan program di mana diperlukan penyesuaian waktu menurut lokasi tempat tinggal.



Sudah ya, terima kasih sudah membaca artikel aku. Semoga bermanfaat dan bisa diterapkan oleh sobat semua.

Salam....

12 komentar:

  1. saya tertarik untuk membuatnya, namun jika berkenan saya minta scodenya yg lengkap trimakasih ini email saya : luthfan_55091@yahoo.co.id

    BalasHapus
  2. Hai Bro Luthfan,
    Soal kode lengkapnya nanti saya siapkan dan kirim via email.

    Terima kasih atas komentarnya.

    BalasHapus
  3. mantap mas bro.... tapi lebih mantapp klu di update juga tuk listing program lengkapnya atau klu gak keberatan kirim lewat email aja mas bro arifstyber@gmail.com

    BalasHapus
  4. Artikel menarik.....saya belum pernah membuatnya dan ingin mencobanya....
    mohon kirim via email pak....sekalian no.rek. ) saya akan donasi...meski gak banyak
    mudah-mudahan bisa saya buat,
    oh ya saya pernah membuat program Counter Up seven segment - simpan ke EEPROm At24C16, penampil LCD 2x16, namun nilai maksimal hanya 255, pengen saya bisa mencapai 999999, gimana trik pak...? mhn pencerahannya,
    klo ada tutorial pake seven segment...eeprom + counter up 99999 boleh pak...saya siap donasi

    BalasHapus
  5. Ass Pak Sigit,
    Saya tertarik dengan artikel bapak meskipun kurang begiru paham ;D, Apakah bapak dapat meneyediakan kit untuk jam digital waktu sholat tersebut. Sehingga bisa untuk berlatih membuatnya dengan kit yang Bapak siapkan. Sekira ada nomer kontak bapak saya ingin menelpon Bapak. Mhn sms kontak bapak ke 0817201714

    Terima kasih.
    Hendro - Lembang

    BalasHapus
  6. Alhamdulillah

    Terima kasih atas perhatian Pak Hendro. Untuk KIT dari rangkaian elektronik yang ada pada setiap artikel akan segera dibuat. Saat ini memang kami sedang menyiapkan segala sesuatunya untuk tujuan tersebut. Dari artikel yang ditulis memang ada beberapa yang dapat dibuat ulang karena sudah ada dan ada beberapa yang harus dibuatkan karena masih ide termasuk Jadual Sholat. Tetapi tidak usah kuatir karena sudah diuji cobakan menggunakan modul yang kami miliki untuk hasilnya.

    Semoga tidak sampai akhir bulan Januari 2013 ini beberapa KIT dapat diselesaikan dan dapat dipesan.

    BalasHapus
  7. terimakasih tulisannya menarik, klo bisa tolong dong kirim scodenya yg lengkap, berikut panduannya ke jaringansantri@gmail.com terima kasih

    BalasHapus
  8. pak sigit tolong dong saya di kasihi source kodenya yang lengkap, kalau bisa tidak terputus putus seperti di atas maklum baru belajar, juga skemanya Pak sigit dapat dikirim ke digispn@gmail.com atas perhatianya makasih pak sigit

    BalasHapus
  9. good idea...
    penasaran nih bang... piingin nyoba buat....walau masih awal belajar mikrokontroller.
    boleh minta source codenya bang?
    kalau boleh mohon kirim ke email saya emzeetronic@gmail.com

    BalasHapus
  10. Wah maaf nih Sobat semua baru sempat balas dan periksa blogernya.

    Soal source code nanti saya cek lagi dan dikirim via email. Atau nanti saya masukkan khusus pada posting yang isinya source code. Jadi tinggal di copy-paste aja. Kalau perlu lengkap dengan file LST dan HEX

    BalasHapus
  11. saya tunggu mas, jika berkenan saya minta scodenya yg lengkap trimakasih ini email saya : luthfan_55091@yahoo.co.id

    BalasHapus
  12. Pak Sigit, mengenai source code lengkap kalau berkenan saya tunggu di email saya, luthfan_55091@yahoo.co.id terimakasih

    BalasHapus