Pada artikel
sebelumnya, penulis sudah pernah membahas mengenai memori AT24C512. Maka kali
ini akan penulis bahas mengenai memori sejenis yang memiliki kapasitas lebih
kecil yaitu AT24C32 dan AT24C64. Sebenarnya secara pemrograman, kedua IC memori
ini hampir sama persis dengan AT24C512 hanya ada beberapa perbedaan terutama
pada kapasitas; besarnya byte pada prosedur PageWrite yaitu hanya 32 saja;
waktu proses penulisan tWC yang hanya 10/5 ms; dan tentunya pin
alamatnya yaitu A2, A1 dan A0.
Ini adalah 2 dari
produk memori keluaran dari Atmel yaitu AT24C32 yang memiliki kapasitas sebesar
32.768 bit atau 4.096 byte dalam setiap kemasannya dan AT24C64 dengan kapasitas
65.536 bit atau 8.192 byte. Memori yang dikemas cukup efisien dalam penggunaan
pin dalam antarmuka dengan mikrokontroler. Dikenal dengan nama 2-wire Serial
EEPROM menggunakan teknologi I2C.
Untuk antarmuka
dengan mikrokontroler, AT24C32/64 memiliki 2 pin SCL (serial clock) dan SDA
(serial data). Operasi antarmuka yang dijalankan menurut kaidah I2C.
Memori ini juga memiliki pin untuk tujuan pengalamatan yaitu A2, A1
dan A0 sehingga memungkinkan untuk penggunaan secara paralel hingga 8
unit sekaligus. Kita dapat merakit secara paralel memori ini dengan antarmuka I2C
untuk mendapatkan maksimal sebesar 32 kByte untuk AT24C32 dan 64 kByte untuk
AT24C64. Memori ini juga dilengkapi dengan pengaman terjadi kesalahan prosedur
yang dapat menghilangkan isinya yaitu memiliki pin WP (write protect) di mana
jika pin ini dihubungkan ke catu (Vcc) maka operasi tulis akan
diabaikan.
Secara internal
memori AT24C32/64 memiliki alamat 1010H pada MSB yang harus ditambahkan pada
saat melakukan operasi pengalamatan diikuti oleh alamat sesuai dengan pin A2,
A1 dan A0. Format pengalamatan unit memori ini dapat
dilihat di bawah ini.
AT24C32/64 memiliki
prosedur yang dapat dijalankan untuk operasi baca maupun tulis. Pada operasi
menulis sendiri disediakan 2 mode yaitu Byte Write atau penulisan isi memori
per-byte dan Page Write yaitu penulisan memori secara perhalaman dengan jumlah
data perhalaman adalah 32 byte. Pada penulisan WordAddress yang terdiri dari 2
byte maka pada AT24C64, bit yang bertanda (*) adalah diabaikan karena memori
jenis ini hanya memiliki alamat memori dari 0000H sampai 1FFFH. Sementara untuk
AT24C32, bit yang bertanda (#) juga diabaikan karena memori jenis ini hanya
memiliki alamat memori dari 0000H sampai 0FFFH saja.
Untuk melakukan
prosedur baca tulis pada memori AT24C32/64 maka diperlukan program seperti di
bawah ini. Isi dari program sama persis dengan AT24C512 yang sudah dibahas pada
artikel sebelumnya. Karena sebab tersebut maka penulis melakukan sedikit perubahan
pada beberapa bagian yaitu angka 512 untuk AT24C512 diganti 32 untuk AT24C32
dan 64 untuk AT24C64 dan beberapa catatan tentang apa saja yang perlu diubah
dari list program di bawah ini.
Kita mulai
pembahasan dengan subrutin AT24C32_Write yang dijalankan untuk menulis dalam
mode single byte maupun page write. Untuk itu ada beberapa register yang harus
ditetapkan. Register B diperlukan untuk menentukan alamat unit, karena AT24C32/64
memiliki alamat unit 2 bit (A2, A1 dan A0)
maka nilai B bisa berisi antara 00H sampai 07H. Register akumulator (ACC)
digunakan untuk menentukan banyaknya byte yang akan ditulis. Register R0
digunakan untuk menunjukkan data yang akan disimpan. Dan register DPTR untuk
menentukan alamat memori dari AT24C32/64.
AT24C32_Write:
; Input :
B > Unit Address
;
ACC > Length Data, max 32 byte
;
R0 > Buffer Data
;
DPTR > Memory Address
Catatan:
Untuk memori AT24C64 subrutin AT24C32_Write
di atas bisa diganti dengan AT24C64_Write.
Rutin AT24C32_Write selanjutnya akan
menjalankan program dengan menyimpan banyaknya data yang akan ditulis dari
akumulator ke register R7. Kemudian register B akan dimanipulasi ke
akumulator dengan menambahkan nibel MSB dari AT24C32/64 yaitu 1010H. Karena
proses menulis maka bit 0 akan dinolkan. Proses selanjutnya adalah mengirim
Device Address dan Word Address di mana panjang word address adalah 2 byte.
Setiap pengiriman byte data maka nilai bit FACK akan senantiasa diperiksa untuk
memeriksa kesalahan unit memori.
push 07h
push 06h
push 05h
mov r7,
a
acall I2C_Start_Con
mov a,
b
orl a,
#10100000b
acall Master_Tx
jnb FACK,
EndC32Write
mov a,
dph
acall Master_Tx
jnb FACK,
EndC32Write
mov a,
dpl
acall Master_Tx
jnb FACK,
EndC32Write
Sekarang memori AT24C32/64 siap untuk menerima data
yang berasal dari register R0. Banyaknya data yang ditulis
ditentukan oleh nilai register R7. Pada setiap byte yang ditulis,
unit memori membutuhkan waktu (tWR) untuk proses penyimpanan selama
kurang lebih 5 ms. Setelah seluruh data selesai ditulis maka akan diakhiri
dengan memanggil subrutin I2C_Stop_Con.
PageWrite:
mov a,
@r0
inc r0
acall Master_Tx
jnb FACK,
EndPageWrite
acall AT24C32_WriteDelay
djnz r7,
PageWrite
EndC32Write:
acall I2C_Stop_Con
pop 05h
pop 06h
pop 07h
ret
Untuk memberikan waktu bagi AT24C32/64 memproses penyimpana data
maka diperlukan penundaan tWR selama kurang lebih 5 ms dengan
subrutin penunda AT24C32_WriteDelay berikut.
AT24C32_WriteDelay:
mov r6, #10
WriteDelay:
mov r5, #250
djnz r5,
$
djnz r6,
WriteDelay
ret
Catatan:
Untuk penggunaan catu daya bagi memori dengan tegangan 1,8 volt
maka sesuai referensi dari datasheet maka waktu tWR setidaknya 10
ms. Untuk itu nilai register R6 harus 20.
Nah, selanjutnya kita akan membahas mengenai pembacaan isi
memori AT24C32/64. Register yang digunakan masih sama hanya saja fungsi register
R0 di sini digunakan untuk menyimpan data dari memori. Prosedur
berikutnya masih sama dengan proses menulis untuk pengiriman Device Address dan
2 byte WordAddress.
AT24C32_Read:
; Input :
B > Unit Address
;
ACC > Length Data, max buffer
size
;
DPTR > Memory Address
; Output :
R0 < Buffer Data
push 07h
mov r7,
a
acall I2C_Start_Con
mov a,
b
orl a,
#10100000b
acall Master_Tx
jnb FACK,
EndC32Read
mov a,
dph
acall Master_Tx
jnb FACK,
EndC32Read
mov a,
dpl
acall Master_Tx
jnb FACK,
EndC32Read
Untuk proses membaca, kita perlu mengirimkan kembali perintah I2C_Start_Con
dilanjutkan dengan mengirin DeviceAddress. Pada prosedur pembacaan maka nilai
bit FLB (flag last bit) digunakan untuk menentukan proses karena pada setelah pembacaan
byte terakhir, tidak akan mengirimkan sinyak Acknowledge.
acall I2C_Start_Con
mov a,
b
orl a,
#10100001b
acall Master_Tx
jnb FACK,
EndC32Read
clr FLB
SequentialRead:
djnz r7,
SeqRead
setb FLB
SeqRead:
acall Master_Rx
mov @r0, a
inc r0
jb FLB, EndC32Read
ajmp SequentialRead
EndC32Read:
acall I2C_Stop_Con
pop 07h
ret
Berikut adalah subrutin yang digunakan untuk me-reset memori
pada beberapa kondisi seperti setelah protokol interupsi, power loss atau reset
sistem. Prosedur reset hanyalah memberikan pulsa clock SCL sebanyak 9 kali
dengan kondisi SDA tinggi. Dalam beberapa penerapan, penulis jarang menggunakan
subrutin ini tapi untuk mengikuti prosedur sebaiknya digunakan.
AT24C32_Reset:
push 07h
push 06h
setb SDA
mov r7,
#9
Reset512:
clr SCL
mov r6,
#2
djnz r6,
$
setb SCL
mov r6,
#2
djnz r6,
$
djnz r7,
Reset32
jb SDA,
End512Reset
; setb Fail
End32Reset:
pop 06h
pop 07h
ret
Program di atas
penulis masukkan dalam file bernama AT24C32.TXT untuk modul subrutin AT24C32
dan AT24C64.TXT untuk AT24C64 dengan atau tanpa perubahan agar dapat digunakan
pada aplikasi lainnya.
Agar Sobat tidak
bingung, aku lampirkan list program untuk I2C.TXT yang sudah pernah kutulis
pada artikel “Antarmuka Dengan Protokol I2C” sebelumnya dapat dilihat berikut
ini:
I2C_Check_Con:
jb SCL,
SlaveReady
clr FSRDY
ret
SlaveReady:
setb FSRDY
ret
I2C_Start_Con:
clr SCL
setb SDA
setb SCL
clr SDA
acall Delay5us
ret
I2C_Stop_Con:
clr SCL
CLR SDA
acall Delay3us
setb SCL
setb SDA
nop
Delay5us:
nop
Delay3us:
ret
Master_Tx:
; Input : ACC > Data
push 07h
push acc
mov r7,
#8
TxD_High:
clr SCL
rlc a
jnc TxD_Low
setb SDA
ajmp TxD_Pulse
TxD_Low:
clr SDA
TxD_Pulse:
setb SCL
acall Delay3us
djnz r7, TxD_High
clr SCL
setb SDA
acall Delay3us
setb SCL
jnb SDA, TxD_Ack
clr FACK
ajmp MTx_End
TxD_Ack:
setb FACK
MTx_End:
pop acc
pop 07h
ret
Master_Rx:
; Input
: FLB > 1/0
; Output : ACC < Data
push 07h
mov r7,
#8
clr c
Next_RxD:
clr SCL
setb SDA
acall Delay3us
setb SCL
jnb SDA,
Rxd_Low
setb c
ajmp Save_RxD
RxD_Low:
clr c
Save_RxD:
rlc a
djnz r7, Next_Rxd
clr SCL
jb FLB, No_Ack
clr SDA
ajmp Ack_Pulse
No_Ack:
setb SDA
Ack_Pulse:
setb SCL
pop 07h
ret
Sudah ya, terima
kasih sudah membaca artikel ini. Semoga apa yang penulis sampaikan bermanfaat
dan bisa diterapkan oleh sobat semua.
Salam....
maksih udah menyempatkan menulis artikel ini...saya blm pernah menemukan halaman yag FULL dan gratis ....seperti halaman blog ini...
BalasHapusmudah-mudahan yg NULIS artikel ini ( pak sigit widodo) diberikan kesehatan dan rizqi yg melimpah....supaya bisa nulis artikel yg lebih banyak lagi.....maju terus pak