Translate

Pewaktu 8 Saluran Dengan AT89C51, Bagian Ke-empat: Subrutin Antarmuka AT93C46 Dan Konversi Heksadesimal, Desimal dan ASCII



Kita awali pembahasan subrutin dari perangkat pewaktu 8 saluran dengan antarmuka pada AT93C46. Subrutin ini akan mengoperasikan EEPROM dalam format 8 bit sesuai dengan rangkaian yang memperlihatkan bahwa pena ORG terhubung ke tanah.

Berikut adalah subrutin antarmuka AT93C46 yang dibagi menjadi beberapa subrutin utama yaitu Reset untuk mengkalibrasi pena memori, RDByte untuk membaca isi memori, WRByte untuk menulis ke dalam memori, EWEN untuk mengijinkan serpih pada mode tulis, EWDS untuk memblokir serpih dari proses menulis isi memori dan ERALL untuk menghapus seluruh isi memori. Di samping subrutin utama juga disediakan subrutin pendukung yaitu CekEE untuk memeriksa status Busy, RDBit untuk mengambil data dari serpih secara serial dan WRBit untuk mengirim data ke serpih secara serial. Subrutin utama adalah subrutin yang berhubungan dan digunakan pada rutin atau subrutin lainnya sementara subrutin pendukung hanya digunakan pada subrutin EEPROM ini secara internal.

;     Rutin EEPROM AT93C46

Reset:
      clr   CLK
      setb  CSel
      clr   CSel
      ret

RDByte:
      push  07h
      push  06h
      mov   r6, #2
      mov   r7, #255
      clr   Fail
      setb  CSel
      mov   a, dph
      anl   a, #0
      orl   a, #00000011b
      acall WRBit
      mov   a, dpl
      anl   a, #01111111b
      acall WRBit
      setb  DiDo

Dummy:
      jb    DiDo, BcTmr3
      ajmp  Dsiap

BcTmr3:
      djnz  r7, Dummy
      mov   r7, #255
      djnz  r6, Dummy
      setb  Fail
      clr   a
      ajmp  BcEnd

DSiap:
      acall RDBit

BcEnd:
      clr   CSel
      pop   06h
      pop   07h
      ret

WRByte:
      push  acc
      setb  CSel
      mov   a, dph
      anl   a, #0
      orl   a, #00000010b
      acall WRBit
      mov   a, dpl
      anl   a, #01111111b
      orl   a, #10000000b
      acall WRBit
      pop   acc
      acall WRBit
      acall CekEE
      clr   CSel
      ret

EWEN: push  acc
      setb  CSel
      mov   a, #00000010b
      acall WRBit
      mov   a, #01100000b
      acall WRBit
      clr   CSel
      pop   acc
      ret

EWDS: push  acc
      setb  CSel
      mov   a, #00000010b
      acall WRBit
      mov   a, #00000000b
      acall WRBit
      clr   CSel
      pop   acc
      ret

ERALL:
      push acc
      setb  CSel
      mov   a, #00000010b
      acall WRBit
      mov   a, #01000000b
      acall WRBit
      acall CekEE
      clr   CSel
      pop   acc
      ret

Berikut adalah subrutin pendukung yang dibutuhkan oleh subrutin utama.

CekEE:
      push  07h
      push  06h
      push  05h
      mov   r5, #2
      mov   r6, #255
      mov   r7, #255
      clr   Fail
      setb  DiDo
      clr   CSel
      setb  Csel

TmrEE:
      clr   CLK
      setb  CLK
      jb    DiDo, TmrE1
      mov   r5, #2
      ajmp  Sibuk

TmrE1:
      djnz  r7, TmrEE
      mov   r7, #255
      djnz  r5, TmrEE
      setb  Fail
      ajmp  Siap

Sibuk:
      clr   CLK
      setb  CLK
      jnb   DiDo, TmrE2
      ajmp  Siap

TmrE2:
      djnz  r6, Sibuk
      mov   r6, #255
      djnz  r5, Sibuk
      setb  Fail

Siap: pop   05h
      pop   06h
      pop   07h
      ret

RDBit:
      push  07h
      clr   a
      mov   r7, #8
      setb  DiDo

RDClk:
      clr   CLK
      setb  CLK
      jb    DiDo, Baca1

Baca0:
      clr   c
      ajmp  GsrBit

Baca1:
      setb  c

GsrBit:
      rlc   a
      djnz  r7, RDClk
      pop   07h
      ret

WRBit:
      push  acc
      push  07h
      mov   r7, #8

TlsBit:
      rlc   a
      jc    Tls1

Tls0: clr   DiDo
      ajmp  WRClk

Tls1: setb  DiDo

WRClk:
      clr   CLK
      setb  CLK
      djnz  r7, TlsBit
      pop   07h
      pop   acc
      ret

Subrutin selanjutnya adalah konversi bilangan dari heksadesimal ke desimal. Subrutin ini menggunakan register R0 sebagai alamat buffer yang berisi bilangan heksa dan register R1 untuk menampung hasil. Jika sobat pernah membaca postinganku sebelumnya tentang modul konversi heksa maka pada program aplikasi konversi kali ini hanya untuk konversi 1 byte saja.

;         Konversi Heksa ke Desimal
;         R0 = Alamat Heksadesimal
;         R1 = Alamat hasil

HexDes:   push     07h
          clr     cy
          clr     ac
          mov     a, @r0
          anl     a, #0fh
          jz      LSB1B
          mov     r7, a

LSB1A:    mov     r1, #TmpSer+2
          mov     a, @r1
          inc     a
          acall   Ubah
          acall   Ubah
          djnz    r7, LSB1A

LSB1B:    mov     a, @r0
          swap    a
          anl     a, #0fh
          jz      MSB1B
          mov     r7, a

MSB1A:    mov     r1, #TmpSer+2
          mov     a, @r1
          add     a, #6
          acall   Ubah
          add     a, #1
          acall   Ubah
          acall   Ubah
          djnz    r7, MSB1A

MSB1B:    pop      07h
          ret

Kebalikan dari subrutin sebelumnya, berikut adalah subrutin untuk mengkonversi bilangan desimal ke heksadesimal. Hasil dari konversi disimpan pada akumulator karena hanya 1 byte saja.

;         Konversi Desimal ke Heksa
;         R0 =  alamat Desimal
;         R1  = alamat konversi
;         Acc = hasil

DesHex: push      07h
          push     06h
          clr      cy
          clr      ac
          mov      r6, #0

LupDH:    mov      r7, #3
          mov      r0, #TmpSer+1
          mov      r1, #TmpSer+4

CekDH:    mov      a, @r0
          mov      b, @r1
          xrl      a, b
          jnz      CekDHx
          inc      r0
          inc      r1
          djnz     r7, CekDH
          mov      a, r6
          pop      06h
          pop      07h
          ret

CekDHx:   mov     r1, #TmpSer+6
          mov     a, @r1
          inc      a
          inc      r6
          acall    Ubah
          acall    Ubah
          acall    Ubah
          ajmp     LupDH

Nah, subrutin berikut adalah subrutin pendukung yang digunakan baik pada konversi heksadesimal ke desimal atau sebaliknya dari desimal ke heksadesimal.

Ubah:     da      a
          push    acc
          anl     a, #0fh
          mov     @r1, a
          pop     acc
          anl     a, #0f0h
          swap    a
          mov     b,a
          dec     r1
          mov     a, @r1
          add     a, b
          da      a
          ret

Nah sekarang aplikasi perangkat lunak untuk perangkat pewaktu 8 saluran yang kita buat sudah lengkap. Program ini jika ditulis dengan aplikasi Notepad membutuhkan 800 baris lebih namun saat dikompilasi akan menempati PROM pada AT89C51 sebanyak 1.410 byte (0582H) hanya 34,42% saja dari 4.096 kapasitas yang disediakan.

Perangkat ini tidak dapat memprogram dirinya sendiri, maka untuk melakukan seting lama pewaktu dari masing-masing saluran memerlukan perangkat lain yang terhubung secara serial. Aku tidak membuat rangkaian lain untuk itu kecuali aplikasi program yang dijalankan melalui PC. Mengenai aplikasi tersebut yang ditulis menggunakan pemrogram Microsoft Visual Basic dan akan kita bahas pada bagian selanjutnya yaitu bagian kelima dari seri postingan ini.



Udah ya, makasih udah baca postingan aku. Semoga bisa bermanfaat, sukur-sukur bisa diterapkan oleh sobat semua.

Salam....

2 komentar:

  1. Alhamdulillah....
    saya menemukan artikel menarik bagus banget... ijin copy ya pak Sigit,
    mudah-mudahan bisa saya manfaatkan, saya juga pengajar di SMK, pengen buat yg beginia....oh ya, klo boleh minta email pak sigit, ada yg perlu saya konsultasikan,...mohon dibales,makasih sebelumya
    ibnubudir[at]gmail dot kom

    BalasHapus
  2. Terima kasih Pak Ibnu. Saya senang atas respon Bapak.
    Email saya ada di profile blogger tapi bisa saya tulis disini: sigit.grr@gmail.com

    Saya siap untuk bertukar pikiran karena bagaimana pun saya juga masih belajar dan banyak kekurangan.

    Sampai ketemu...

    BalasHapus