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....
Alhamdulillah....
BalasHapussaya 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
Terima kasih Pak Ibnu. Saya senang atas respon Bapak.
BalasHapusEmail 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...