Masih ingat dengan
seri E2PROM AT93C46/56/66? Memori kapasitas kecil nan murah meriah
tapi sangat berguna untuk aplikasi-aplikasi sederhana yang sering aku buat.
Tulisan ini adalah lanjutan dari tulisan sebelumnya tentang “Masih Seputar
Modul E2PROM AT93C46/56/66”
Memori yang dikemas
dengan 8 penyemat dengan mengusung antarmuka serial 3 kabel yaitu CS, SK dan
DI/DO, ditambah catu daya menjadi 5 penyemat. Serpih memori ini dapat
diorganisasikan dalam format data 8 bit atau 16 bit dengan menetapkan penyemat
nomor 6 (ORG) ke GND untuk format 8 bit dan ke VCC untuk format 16 bit.
Kali ini kita akan
membuatkan modul yang dapat digunakan untuk antarmuka memori ini yaitu jenis
AT93C46 dengan format 16 bit. AT93C46 adalah serpih memori dengan kapasitas
1024 bit. Dengan organisasi memori 16 bit maka dapat menampung data sebanyak 64
word.
Pada modul yang
akan dibuat terdiri dari 7 perintah dalam bentuk subrutin yang berkaitan dengan
pengoperasian AT93C46.
Berikut adalah
modul berisi subrutin yang digunakan untuk antarmuka dengan AT93C46 dengan mode
data dalam organisasi 16 bit.
;Subrutin Membaca Data AT93C46
; Input : DPTR = Address
; Output : B = Data MSB
; A = Data LSB
AT93C46_READ:
push 07h
push 06h
mov r6, #2
mov r7, #255
clr Fail
setb RST
mov a, #00000001b
acall WriteSerialBit
mov a, dpl
anl a, #00111111b
orl a, #10000000b
acall WriteSerialBit
setb DIO
Dummy:
jb DIO, WaitTimer3
ajmp DataReady
WaitTimer3:
djnz r7, Dummy
mov r7, #255
djnz r6, Dummy
setb Fail
ajmp EndReadEEPROM
DataReady:
acall ReadSerialBit
xch a, b
acall ReadSerialBit
EndReadEEPROM:
clr RST
pop 06h
pop 07h
ret
;Subrutin Mengijinkan Perintah Hapus/Tulis Pada AT93C46
AT93C46_EWEN:
push acc
setb RST
mov a, #00000001b
acall WriteSerialBit
mov a, #00110000b
acall WriteSerialBit
clr RST
pop acc
ret
;Subrutin Menghapus Data Di Lokasi Memori AT93C46
;Input : DPTR = Address
AT93C46_ERASE:
push acc
setb RST
mov a, #00000001b
acall WriteSerialBit
mov a, dpl
orl a, #11000000b
acall WriteSerialBit
acall CheckEEPROM
clr RST
pop acc
ret
;Subrutin Menghapus Seluruh Memori Data AT93C46
AT93C46_ERAL:
push acc
setb RST
mov a, #00000001b
acall WriteSerialBit
mov a, #00100000b
acall WriteSerialBit
acall CheckEEPROM
clr RST
pop acc
ret
;Subrutin Menulis Data AT93C46
;Input : DPTR = Address
; A = Data
AT93C46_WRITE:
push acc
push b
setb RST
mov a, #00000001b
acall WriteSerialBit
mov a, dpl
anl a, #00111111b
orl a, #01000000b
acall WriteSerialBit
pop acc
acall WriteSerialBit
pop acc
acall WriteSerialBit
acall CheckEEPROM
clr RST
ret
;Subrutin Menulis Data Ke Seluruh Lokasi Memori AT93C46
;Input : B = Data MSB
; A = Data LSB
AT93C46_WRAL:
push acc
push b
setb RST
mov a, #00000001b
acall WriteSerialBit
mov a, #00010000b
acall WriteSerialBit
pop acc
acall WriteSerialBit
pop acc
acall WriteSerialBit
acall CheckEEPROM
clr RST
ret
;Subrutin Memproteksi Dari Perintah Hapus/Tulis Pada AT93C46
AT93C46_EWDS:
push acc
setb RST
mov a, #00000001b
acall WriteSerialBit
mov a, #0
acall WriteSerialBit
clr RST
pop acc
ret
ResetChip:
clr CLK
setb RST
clr RST
ret
WriteSerialBit:
push acc
push 07h
mov r7, #8
NxtWRBit:
rlc a
jc WRBitH
clr DIO
ajmp WRClk
WRBitH:
setb DIO
WRClk:
clr CLK
setb CLK
djnz r7, NxtWRBit
pop 07h
pop acc
ret
ReadSerialBit:
push 07h
push 06h
clr a
mov r7, #8
setb DIO
RDClk:
clr CLK
setb CLK
jb DIO, RDBitH
clr c
ajmp ShiftInBit
RDBitH:
setb C
ShiftInBit:
rlc a
djnz r7, RDClk
pop 06h
pop 07h
ret
CheckEEPROM:
push 07h
push 06h
push 05h
mov r5, #2
mov r7, #255
mov r6, #255
clr Fail
setb DIO
clr RST
setb RST
WaitBusy:
clr CLK
setb CLK
jb DIO, WaitTimer1
mov r5, #2
ajmp WaitReady
WaitTimer1:
djnz r7, WaitBusy
mov r7, #255
djnz r5, WaitBusy
setb Fail
ajmp Ready
WaitReady:
clr CLK
setb CLK
jnb DIO, WaitTimer2
ajmp Ready
WaitTimer2:
djnz r6, WaitReady
mov r6, #255
djnz r5, WaitReady
setb Fail
Ready:
pop 05h
pop 06h
pop 07h
ret
Modul ini aku
namai: 93C46_16.TXT
Udah ya, makasih udah baca postingan aku. Semoga bisa bermanfaat dan jika
mungkin bisa diterapkan oleh sobat semua.
Salam....
Tidak ada komentar:
Posting Komentar