Translate

Peraga Jadual Sholat 3



Bagian Ketiga

Sebagai lanjutan dari serial tulisanku tentang peraga jadual Sholat, tapi jangan dianggap seperti sinetron ya, he...he. Sebelumnya sudah dipaparkan mengenai data informasi jadual sholat pada bagian pertama dan rangkaiannya dengan teknik peragaan LED 7 segmen secara scanning, maka kali ini dibagian ketiga akan dilanjutkan mengenai fasilitas KONTROL yang akan dikembangkan untuk pengaturan waktu.

Tapi sebelumnya aku akan menampilkan contoh tata letak LED 7 segmen dari tampilan peraga, sekedar ide saja karena mungkin Sobat memiliki ide lainnya yang lebih disukai.



Gambar di atas hanya contoh tampilan yang terjadi pada tanggal 14 Agustus 2012, pukul 03:54:27 dini hari. Ada 2 digit permanen yaitu untuk menampilkan bilangan tahun yaitu 20 yang tidak dihasilkan dari keluaran program atau mikrokontroler.

Kita lanjutkan pembahasan tentang penggunaan CN104 yang berfungsi sebagai kendali masukan. Konektor ini dapat dihubungkan dengan rangkaian seperti ditunjukkan di bawah ini:



Gerbang P30 dan P31 dari mikrokontroler dapat dimanfaatkan sebagai sarana komunikasi dengan PC yang dihubungkan pada port serial RS232. Agar fasilitas tersebut berfungsi, nanti akan kita rancang bersama program aplikasinya.

Sementara itu gerbang P32 dan P33 dihubungkan dengan sakelar tekan S101 untuk PRG dan S102 untuk SET yang nanti akan difungsikan sebagai fasilitas pengaturan waktu dari RTC. Karena kita pasti sama-sama memahami bahwa informasi waktu dari RTC sangat perlu diatur jika tidak sesuai dengan waktu sebenarnya.

Kita mulai dari penggunaan sakelar PRG dan SET sebagai fasilitas pengaturan waktu. Sebelum membuat atau merancang aplikasinya, terlebih dahulu kita harus menetapkan apa dan bagaimana fungsi dari kedua sakelar tersebut. Sakelar PRG akan ditetapkan untuk memilih informasi data waktu yang akan diatur yaitu jam, menit, tanggal, bulan atau tahun. Sementara sakelar SET untuk mengubah nilai dari informasi data tersebut.

Cara kerjanya adalah sebagai berikut:

Pada keadaan normal, seluruh digit penunjuk waktu baik jam, menit, detik, tanggal, bulan dan tahun akan ditampilkan seperti gambar di atas. Menekan sakelar PRG akan diproses oleh mikrokontroler dengan hanya menampilkan menit saja untuk memasuki mode pengaturan menit. Penekanan sakelar PRG pada kali kedua akan menampilkan hanya jam saja, penekanan ketiga untuk tanggal, keempat untuk bulan, kelima untuk tahun dan penekanan keenam akan mengembalikan peraga pada kondisi semula atau normal.

Pada keadaan normal, menekan sakelar SET tidak akan diproses dan tidak berpengaruh. Namun pada mode pengaturan jam, menit, tanggal, bulan atau tahun maka menekan sakelar SET akan mengusah nilai informasi sesuai posisi mode. Jika pada mode pengaturan jam maka nilai jam akan dinaikkan. Contoh ketika posisi menit menunjuk 03 seperti di atas, maka menekan SET akan mengubah nilai jam menjadi 04, penekanan berikutnya menjadi 05 dan seterusnya sampai ditemui waktu jam yang sesuai.

Jika sakelar SET ditekan dan ditahan maka data akan berotasi ke arah naik dengan kecepatan kurang lebih setengah detik.

Pengaturan akan mengubah nilai waktu dengan rentang berdasarkan dengan format yang sesuai, yaitu:

§  Jam berisi nilai antara 00 sampai 23.
§  Menit berisi nilai antara 00 sampai 59.
§  Pengaturan Tanggal agak kompleks di mana bisa berisi nilai antara 01 sampai 31 (Januari, Maret, Mei, Juli, Agustus, Oktober dan Desember), berisi nilai 01 sampai 30 (April, Juni, September dan November). Sementara untuk Februari maka tanggal bisa berisi 01 sampai 29 untuk tahun kabisat dan 01 sampai 28 untuk selain tahun kabisat.
§  Bulan berisi nilai antara 01 sampai 12.
§  Tahun berisi nilai antara 00 sampai 99, namun aku batasi antara 12 sampai 25 saja.

Mode pengaturan juga akan kita otomatisasi dengan timer di mana jika pada mode tertentu yang terpilih dan kita tidak melanjutkan penekanan salah satu sakelar baik PRG maupun SET maka dalam 10 detik mikrokontroler akan mengembalikan posisi program pada keadaan normal.

Nah, berikut akan kita buat aplikasinya sebagai tambahan dari aplikasi program yang sudah dibuat sebelumnya. Pada area konfigurasi kita perlu menambahkan parameter berikut ini:

PB_PRG      bit   p3.2
PB_SET      bit   p3.3

BitMenu     bit   RegBit.3

Kemudian pada rutin Periksa_Waktu baris perintah “JNB PB_PRG, Menu_PRG” akan disisipkan seperti diperlihatkan berikut ini:

Periksa_Waktu:
      jnb   PB_PRG, Menu_Waktu
      djnz  r5, Periksa_Detik
      mov   r5, #255   
      --- dst ---

Baris perintah pertama di atas untuk memeriksa status masukan dari sakelar S101 PRG. Jika ditekan maka logika masukan gerbang akan menjadi rendah dan program akan menjalankan rutin berikut:

Menu_Waktu:
      mov   r2, #0

Untuk program pengaturan, kita akan menggunakan register R2 untuk status menu yang dipilih. Register lainnya yang digunakan adalah Register B, R0 dan R1. Setiap kali rutin Menu_Jam dijalankan maka nilai register R2 akan bertambah untuk menentukan menu yang akan dikerjakan. Isi register R0, R1 dan register B akan digunakan pada program menu.

      Menu_Jam:
            inc   r2
            cjne  r2, #1, Menu_Menit
            mov   r1, #BufDisplay
            mov   r0, #BufWaktu+2
            mov   b, #23h
            ajmp  Prog_Menu

      Menu_Menit:
            cjne  r2, #2, Menu_Tanggal
            mov   r1, #BufDisplay+2
            mov   r0, #BufWaktu+1
            mov   b, #59h
            ajmp  Prog_Menu

Khusus untuk Menu_Tanggal, maka nilai register B perlu dilakukan verifikasi karena perbedaan jumlah hari dalam setiap bulan termasuk adanya tahun kabisat. BitMenu juga akan diset menjadi tinggi untuk keperluan penetapan nilai tersendah saat rotasi data.

      Menu_Tanggal:
            cjne  r2, #3, Menu_Bulan
            setb  BitMenu
            mov   r1, #BufDisplay+6
            mov   r0, #BufWaktu+4
            acall Bulan_01
            ajmp  Prog_Menu

      Menu_Bulan:
            cjne  r2, #4, Menu_Tahun
            mov   r1, #BufDisplay+8
            mov   r0, #BufWaktu+5
            mov   b, #12h
            ajmp  Prog_Menu

      Menu_Tahun:
            cjne  r2, #5, Menu_Selesai
            mov   r1, #BufDisplay+10
            mov   r0, #BufWaktu+6
            mov   b, #25h

Setelah penetapan salah satu dari 5 mode pengaturan di atas, selanjutnya aplikasi menu akan diproses. Hal pertama yang akan diproses adalah memanggil subrutin Display_Menu. Kemudian menyiapkan register R3, R6 dan R7 untuk penundaan kira-kira selama 10 detik melalui rutin Reset_Mnu2. Status PB_PRG dan PB_SET diperiksa pada rutin Prog_Mnu1, jika keduanya bernilai tinggi yang berarti baik sakelar PRG maupun SET tidak ditekan maka delay akan berjalan.

            Prog_Menu:
                  acall Display_Menu
                  jnb   PB_PRG, $

            Reset_Mnu1:
                  mov   r3, #36
                  mov   r6, #255
                  mov   r7, #255

            Reset_Mnu2:
                  djnz  r7, Prog_Mnu1
                  mov   r7, #255
                  djnz  r6, Prog_Mnu1
                  mov   r6, #255
                  djnz  r3, Prog_Mnu1
                  ajmp  Periksa_Waktu

            Prog_Mnu1:
                  jnb   PB_PRG, Menu_Jam
                  jb    PB_SET, Reset_Mnu2
                  mov   r3, #14
                  mov   r6, #255
                  mov   r7, #255

Register R3, R6 dan R7 juga digunakan untuk pengaturan secara otomatis nilai informasi waktu jika PB_SET rendah secara terus menerus atau ditahan. Kecepatan rotas kurang lebih per-setengah detik. Contoh untuk menu Jam maka nilai akan berubah dari 0 sampai 23 kemudian kembali lagi ke 0 dan seterusnya. Proses rotasi data dilakukan pada subrutin Ubah_Waktu.

            Prog_Mnu2:
                  acall Ubah_Waktu

            Prog_Mnu3:
                  jb    PB_SET, Reset_Mnu1
                  djnz  r7, Prog_Mnu3
                  mov   r7, #255
                  djnz  r6, Prog_Mnu3
                  mov   r6, #255
                  djnz  r3, Prog_Mnu3
                  mov   r3, #3
                  ajmp  Prog_Mnu2

      Menu_Selesai:
            cjne  r2, #6, Menu_Kembali
            clr   BitMenu
            ajmp  Periksa_Waktu

      Menu_Kembali:
            ajmp  Menu_Jam

Seperti kita ketahui bahwa jumlah hari dalam 1 bulan tidak sama ada yang berjumlah 31 dan 30, sementara bulan februari bahkan 28 hari dan pada tahun kabisat menjadi 29. Subrutin berikut menetapkan nilai tanggal sesuai dengan bulan dan tahun yang bersesuaian.

Mula-mula nilai akumulator digunakan untuk menyimpan informasi bulan. Kecuali bulan Februari maka setiap bulan akan dibandingkan untuk menentukan jumlah hari 30 dan 31.

Bulan_01:
      mov   a, BufWaktu+5
      cjne  a, #1, Bln03
      ajmp  Hari31

      Bln03:
            cjne  a, #3, Bln04
            ajmp  Hari31

      Bln04:
            cjne  a, #4, Bln05
            ajmp  Hari30

      Bln05:
            cjne  a, #5, Bln06
            ajmp  Hari31

      Bln06:
            cjne  a, #6, Bln07
            ajmp  Hari30

      Bln07:
            cjne  a, #7, Bln08
            ajmp  Hari31

      Bln08:
            cjne  a, #8, Bln09
            ajmp  Hari31

      Bln09:
            cjne  a, #9, Bln10
            ajmp  Hari30

      Bln10:
            cjne  a, #10h, Bln11
            ajmp  Hari31

      Bln11:
            cjne  a, #11h, Bln12

      Hari30:
            mov   b, #30h
            ret

      Bln11:
            cjne  a, #12h, Bln02

      Hari31:
            mov   b, #31h
            ret

Untuk bulan Februari, giliran register B yang digunakan untuk menyimpan informasi tahun. Register R3 dan akumulator digunakan untuk melacak tahun. Sepintas register R3 dan akumulator sepertinya mirip namun informasi yang disimpan sesungguhnya berbeda dimana register R3 untuk nilai dalam bilangan biner sementara akumulator dalam format BCD sesuai dengan format yang disimpan pada register B.

      Bln02:
            mov   b, BufWaktu+6
            clr   a
            mov   r3, #0

Tahun kabisat adalah jumlah tahun yang habis jika dibagi dengan 4. Untuk menghindari pembagian bilangan 0 maka jumlah tahun dalam biner yang disimpan oleh register R3 akan ditambahkan dengan 4. Setelah nilai minimal dari akumulator adalah 4 kemudian dilakukan pembagian dengan 4. Jika sisa pembagian pada register B bernilai 0 berarti merupakan tahun kabisat.

            Thn1: cjne  a, b, Thn2
                  mov   a, r3
                  mov   b, #4
                  add   a, b
                  div   ab
                  xch   a, b
                  jz    Kabisat
                  mov   b, #28h
                  ret

            Kabisat:
                  mov   b, #29h
                  ret

            Thn2: inc   r3
                  mov   a, r3
                  clr   ac
                  clr   c
                  da    a
                  ajmp  Thn1

Pengaturan data waktu terbagi menjadi 2 bagian dalam penentuan nilai terendah saat reset di mana untuk jam dan menit adalah 0. Sementara untuk tanggal dan bulan adalah 1. Pemilihan tersebut ditentukan oleh nilai dari BitMenu. Khusus untuk tahun maka aku sengaja sisipkan pembatasan minimal saat rotasi adalah 12.

Ubah_Waktu:
      jb    BitMenu, Ubah_Wkt1
      mov   a, @r0
      cjne  a, b, Ubah_Wkt2
      mov   a, #0
      ajmp  Ubah_Wkt2

      Ubah_Wkt1:
            mov   a, @r0
            cjne  a, b, Ubah_Wkt2
            mov   a, #1
            cjne  r2, #6, Ubah_Wkt2
            mov   a, #12h

            Ubah_Wkt2:
                  inc   a
                  clr   ac
                  clr   c
                  da    a
                  mov   @r0, a
                  push  b
                  mov   a, r0
                  clr   c
                  subb  a, #BufWaktu
                  xch   a, b
                  mov   a, #1
                  acall DS1307_Write
                  pop   b
                  acall Display_Menu
                  ret

Tampilan menu berbeda dengan saat normal di mana hanya informasi waktu yang akan diatur saja yang akan ditampilkan pada LED 7 segmen. Untuk itu seluruh data digit akan dibersihkan dengan mengisi masing-masing dengan data 255 atau FFH sehingga akan menyebabkan seluruh LED 7 segmen padam. Setelah seluruh LED padam maka hanya informasi waktu yang akan diatur saja yang akan ditampilkan pada subrutin Display_Prog.

Display_Menu:
      push  b
      push  01h
      push  0h
      mov   r7, #18
      mov   r0, #BufDisplay

      Bersihkan_Digit:
            mov   @r0, #255
            inc   r0
            djnz  r7, Bersihkan_Digit
            pop   0h

      Display_Prog:
            mov   a, @r0
            acall Display_BCD
            pop   01h
            pop   b
            ret

Sampai di sini aplikasi program menu pengaturan untuk perangkat Peraga Jadual Sholat sudah selesai. Perangkat sudah dilengkapi dengan mode pengaturan untuk mengubah informasi agar sesuai.



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

Salam....

6 komentar:

  1. salam, pak saya tertarik ingin membuat jadwal waktu sholat sperti yg di share disini. kalau berkenan saya minta list code lengkapnya, trimakasih luthfan_55091@yaho.co.id

    BalasHapus
  2. Terimakasih Mas, artikelnya sangat menarik meski aku bingung karna belum bisa atmel, walau pernah belajar sedikit. Sama mas saya juga lama kerja dibidang security syatem, dulu kantornya di jalan sabang. mas mau tanya untuk jadwal sholat sudah ada lay out pcbnya ga, aku mau coba buat jadwal sholat ini, mudah2an bisa jadi tambahan income. kalau berkenan bisa kirim di emailku. boiminbabeh@yahoo.com Terimakasih banyak yaaa mas, semoga Allah SWT yang membalas amal baiknya...

    BalasHapus
  3. Pak sigit mau minta pencerahanya kalu saya kompile terjadi error di : BitMenu bit RegBit.3, gimana pak saya minta penjelasanya

    BalasHapus
  4. Wah mesti lihat artikel sebelumnya yang berkaitan dengan source code. Kayaknya saya perlu satukan biar tidak membingungkan ya...

    Pada artikel sebelumnya tertulis:

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

    tambahan dari artikel ke-3 adalah

    BitMenu bit RegBit.3

    Nah tulisannya mesti berurut seperti diatas. Lengkapnya:

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

    Semoga bisa diperbaiki

    trims

    BalasHapus
  5. assalamu'alaikum wr.wb
    mas sya mita code lngkap dan scmatic'a donk sya tertarik sekali dngn artikel jadwal shalat ini
    tlng kirim ke ahmadpanogari@rocketmail.com
    mksh mas smga allah mmbri kberkhan..

    wassalamu'alaikim wr.wb

    BalasHapus
  6. Trims atas perhatiannya.

    Berhubung banyaknya permintaan source kode dll maka akan disiapkan lokasi unduhan di ziddu supaya bisa diunduh sobat semua dengan mudah.

    BalasHapus