Archive

Posts Tagged ‘baca tulis EEPROM’

Akses Baca-Tulis EEPROM ATtiny2313

March 27, 2009 5 comments

avrmnemonic2AVR ATtiny2313 memiliki EEPROM dengan kapasitas 128 byte dengan alamat akses 0-127 ($00-$7F). Untuk mengakses EEPROM terlebih dahulu harus mengetahui register-register EEPROM, yakni: EEAR – EEPROM Address Register, EEDR – EEPROM Data Register, dan EECR – EEPROM Control Register.

EEAR adalah register yang berfungsi menyimpan alamat EEPROM yang akan diakses. Untuk ATtiny2313, EEAR disebut juga EEARL (EEAR Low). Yup, hanya perlu 7 bit LSB saja (EEAR0..EEAR6) untuk mengakses seluruh alamat EEPROM ATtiny2313. Nilai awal EEAR setelah direset tidak didefinisikan, jadi EEAR perlu diisi dengan alamat EEPROM yang benar sebelum data pada EEPROM diakses (dibaca/ditulis/dihapus).

EEDR adalah register yang berfungsi menyimpan data yang akan ditulis ke EEPROM dan data yang dibaca dari EEPROM.

EECR adalah register yang berfungsi untuk mengontrol sinyal-sinyal kontrol untuk proses akses EEPROM. Pada tulisan ini hanya dibahas tentang bagaimana menulis data ke EEPROM dan bagaimana membaca data dari EEPROM. Oleh karena itu, hanya 3 bit LSB dari EECR saja yang akan dibahas yakni:

  • Bit 2 – EEMPE (EEPROM Master Program Enable)
  • Bit 1 – EEPE (EEPROM Program Enable)
  • Bit 0 – EERE (EEPROM Read Enable)

Proses menulis data ke EEPROM memerlukan langkah-langkah berikut ini:

  1. Letakkan alamat EEPROM yang dituju dalam register EEAR
  2. Letakkan data dalam register EEDR
  3. Cek apakah bit EEPE=0, jika tidak maka tunggu
  4. Set bit EEMPE
  5. Set bit EEPE

Mudah bukan? Demikian juga halnya dengan proses membaca data dari EEPROM, berikut langkah-langkahnya:

  1. Letakkan alamat EEPROM yang akan diakses dalam register EEAR
  2. Cek apakah bit EEPE=0, jika tidak maka tunggu
  3. Set bit EERE
  4. Baca data dari EEDR dan simpan di register

Bit EEPE adalah bit untuk menulis data ke EEPROM. Jika EEPE diset 1 ketika EEMPE=1, maka data pada EEDR akan ditulis ke EEPROM pada alamat yang ditunjukkan oleh register EEAR. Setelah 4 siklus clock, maka CPU akan mereset kembali bit EEPE=0 yang menandakan bahwa proses penulisan telah selesai dilakukan. Oleh karena itu sebelum melakukan proses penulisan, program harus memastikan bahwa kondisi EEPE=0, yang artinya CPU tidak sedang melakukan proses penulisan ke EEPROM. Jika tidak maka proses penulisan akan gagal. Demikian juga halnya ketika membaca data dari EEPROM. Sebelum membaca data, program harus memastikan bahwa CPU tidak sedang dalam proses penulisan data ke EEPROM, jika tidak maka proses pembacaan akan gagal.

Contoh Program

; ***********************************************
; EEPROM.ASM
; Program contoh baca/tulis EEPROM pada ATtiny2313
; ***********************************************

.include “C:\MICROC~1\VMLAB\include\2313def.inc”

;Untuk AVR Studio 4, ganti include-nya dengan yang ini:
;.include “tn2313def.inc”

;Untuk VMLAB, ini diperlukan. Untuk AVR Studio 4 tidak.
.equ eepe = eewe
.equ eempe = eemwe

reset:
rjmp start
reti      ; Addr $01
reti      ; Addr $02
reti      ; Addr $03
reti      ; Addr $04
reti      ; Addr $05
reti      ; Addr $06
reti      ; Addr $07
reti      ; Addr $08
reti      ; Addr $09
reti      ; Addr $0A
reti      ; Addr $0B
reti      ; Addr $0C
reti      ; Addr $0D
reti      ; Addr $0E
reti      ; Addr $0F
reti      ; Addr $10

start:
;selalu diawali dengan pengesetan alamat stack
ldi    r16, low (ramend)
out    spl, r16

ldi    r16, $54    ; data di R16
ldi    r17, 0        ; alamat di R17
rcall    EEPROM_write    ; tulis $54 ke EEPROM alamat 0

ldi    r16, $CA    ; data di R16
ldi    r17, 5        ; alamat di R17
rcall    EEPROM_write    ; tulis $CA ke EEPROM alamat 5

ser    r16        ; R16 = $FF
ldi    r17, 0        ; R17 = 0
rcall    EEPROM_read    ; Baca EEPROM alamat 0 dan simpan di R16

forever:
rjmp forever        ; never ending jump

; Subrutin menulis data ke EEPROM dengan alamat 0-127
EEPROM_write:
sbic    eecr, eepe    ; apakah EEPE=0?
rjmp    EEPROM_write    ; tunggu jika EEPE=1
out    EEAR, r17    ; set alamat EEPROM
out    EEDR, r16    ; letakkan data di EEDR
sbi    EECR, eempe    ; set bit EEMPE
sbi    EECR, eepe    ; set bit EEPE
ret

; Subrutin membaca data dari EEPROM dengan alamat 0-127
EEPROM_read:
sbic    eecr, eepe    ; apakah EEPE=0?
rjmp    EEPROM_read    ; tunggu jika EEPE=1
out    eear, r17    ; set alamat EEPROM
sbi    eecr, eere    ; set bit EERE
in    r16, eedr    ; copy data dari EEDR ke R16
ret

Catatan: Program di atas dibuat dengan asumsi bahwa program sama sekali tidak menggunakan fitur interupsi dalam program. Gunakan instruksi CLI dan SEI sebelum dan sesudah proses baca-tulis EEPROM agar segala sesuatunya berjalan mulus, hehehe…

Berikut adalah cuplikan gambar Window Memori EEPROM dan Window Register dari VMLAB dan AVR Studio 4.

eepromvmlabWindow EEPROM VMLAB

registervmlabWindow Register VMLAB

eepromavrstudio4Window EEPROM AVR Studio 4

registeravrstudio4Window Register AVR Studio 4

Ok. Selamat belajar!

Follow

Get every new post delivered to your Inbox.

Join 169 other followers