Forum: Mikrocontroller und Digitale Elektronik EEPROM lesen (ASM)


von Nillo (Gast)


Lesenswert?

Hallo erstmal allerseits.

Also gleich zum Problem, ich habe an Adresse 0x00 des EEPROM in meinem 
ein beliebiges Byte gespeichert, dass ich gerne auslesen würde und zu 
Testzwecken (sehen ob es klappt) an den PortB-LEDs meines STK200 
anzuzeigen, nu hab ich alles so programmiert wie es sein sollte (bzw wie 
das Datenblatt es verlangt) aber nach der Programmierung (und dem 
beschreiben der EEPROM-Adresse mit 0xAA) tut sich an dem Board einfach 
nix (zumindest nicht so wie es sein sollte). Vielleicht hat ja jemand 
erfahrung damit und kann mir weiterhelfen.

Danke im Vorraus


PS: es handelt sich um einen AVR 8515

von Nillo (Gast)


Lesenswert?

naja, das mit dem anhang hat genauso geklappt wie ich es mir gedacht 
habe ;-) also hier die .asm:

;*******************************EEPROM.asm******************************
;*** An Adresse 0x00 des EEPROMS ist das Datenbyte 0xAA gespeichert, ***
;*** dieses soll ausgelesen und an den LEDs an PortB angezeigt werden***
;***********************************************************************
.device AT90S8515
.include "8515def.inc"

.def  tmp  =r16    ;Register festlegen
.def  order  =r17
.def  xlow  =r26
.def  xhigh  =r27

.org  0x00      ;Einsprungadresse nach einem RESET
  rjmp  Init

.org  0x10
  nop

;*********************************************************************** 
****
Init:   ldi   tmp,low(RAMEND)  ;Stackpointer auf das
  out  spl,tmp    ;Speicherende setzen (RAMEND equ 0x025F)
  ldi  tmp,high(RAMEND);3-Level-Stack
  out  sph,tmp

  ser  tmp    ;setze tmp auf $FF(255)
  out  DDRB,tmp  ;Port B ist Ausgang
  out  PortB,tmp  ;Alle LEDs aus

  ldi  xlow,0x00  ;EEPROM Adressregister intitialisieren (ardesse)
  ldi  xhigh,0x00

Start:

EEPREAD:


  out  EEARL,xlow  ;Die Adresse ins EEPROM Adressregister
  out  EEARH,xhigh

  ldi  order,0x01  ;Bit0 (EERE) in EECR setzen -> Lesebefehl
  out  EECR,order

loop:  in  tmp,EECR  ;Prüfen ob EERE zurückgesetzt,
  andi  tmp,0x01
  cpi  tmp,0x00  ;wenn ja -> Daten Bereit
  brne  loop    ;wenn nein -> weiterprüfen

read_data:
  in  tmp,EEDR  ;Daten aus dem Datenregeister einlesen
  com  tmp    ;Daten benutzerfreundlich anpassen
  out  PortB,tmp  ;Datenbyte anzeigen

von Nillo (Gast)


Lesenswert?

ok, das problem hat sich erledigt, für diejenigen die vielleicht ein 
ähnliches problem haben hier die funtionierende variante:


EEPREAD:

  out  EEARL,xlow  ;Die Adresse ins EEPROM Adressregister
  out  EEARH,xhigh

  sbi  EECR,EERE  ;Bit0 (EERE) in EECR setzen -> Lesebefehl


read_data:
  in  tmp,EEDR  ;Daten aus dem Datenregeister einlesen
  com  tmp    ;Daten benutzerfreundlich anpassen
  out  PortB,tmp  ;Datenbyte anzeigen

von Henning (Gast)


Lesenswert?

Hi; ich brauch da mal hilfe...

Ich habe das ganze nocheinmal auseinander genommen, weil ich mit den 
EEProm im Atmel auch so meine probleme habe. Vieleicht wisst ihr, woran 
es liegt.

Das ist der gesammte quelltext für mein kleines testproggie, funktoniert 
auch mittlerweile, aber (und es musste ja ein aber kommen) es dauert 
entschieden zulange.
Wenn ich den code simuliere wir am Bit EEWE erst wieder ein Low pegel 
angezeigt (was heißt das schreiben ist fertig) wenn der Programmzähler 
das nop mit meinem komentar erreicht hat. Das würde heißen es werden 22 
Takte benötigt um das Speichern zu vollenden. compiliere ich das ganze 
und schreib es in meinen avr läuft die sache auch (ich kann PinA messen)
In der doku steht aber es würden 4 takte verstreichen, weil der avr für 
2 takte angehalten würde. was ist jetzt realität?

bin froh jetzt endlich auch mal was messen zu können!
mache ich einen generellen fehler, läuf bei euch der eeprom ohne 
probleme?
könnt ihr mir helfen?
Danke in voraus.

Henning

Der code:

;*******************************EEPROM.asm******************************
;*** An Adresse 0x00 des EEPROMS ist das Datenbyte 0xAA gespeichert, ***
;*** dieses soll ausgelesen und an den LEDs an PortB angezeigt werden***
;***********************************************************************
.device AT90S8515
.include "8515def.inc"

.def tmp =r16 ;Register festlegen
.def order =r17
.def xlow =r26
.def xhigh =r27

.org 0x00 ;Einsprungadresse nach einem RESET
  rjmp Init

.org 0x10
  nop

;***********************************************************************
Init:
  ldi tmp,low(RAMEND) ;Stackpointer auf das
  out spl,tmp ;Speicherende setzen (RAMEND equ 0x025F)
  ldi tmp,high(RAMEND);3-Level-Stack
  out sph,tmp
;***********************************************************************
;Port B Definieren
  ser tmp ;setze tmp auf $FF(255)
  out DDRA,tmp ;Port B ist Ausgang
  out PortA,tmp ;Alle LEDs aus

;***********************************************************************
EEWrite:
  sbic EECR,EEWE  ; skip, wenn EECR = 0
  rjmp EEWrite    ; nochmal!
;***********************************************************************
; Adresse setzen
  ldi xlow,0x00 ;EEPROM Adressregister intitialisieren (ardesse)
  ldi xhigh,0x00
;***********************************************************************
; datenbyte setzen
  ldi tmp, 0xAA
  out EEDR, tmp
;***********************************************************************
  sbi EECR, EEMWE ; Programierung freigeben
  sbi EECR, EEWE  ; Programmierung starten

  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop ;hier ist das schreiben fertig!

;***********************************************************************
; datenbyte setzen
  ldi tmp, 0x00
  out EEDR, tmp


;***********************************************************************
; Adresse setzen
  ldi xlow,0x00 ;EEPROM Adressregister intitialisieren (ardesse)
  ldi xhigh,0x00
;***********************************************************************
;Lesebefehl
  sbi EECR,EERE ; ergebnis steht in eedr
  in tmp, EEDR ; ergebis steht in r16

  out PortA, tmp
loop:
  rjmp loop

von Uwe (Gast)


Lesenswert?

Hi Henning !

Wer lesen kann ist klar im Vorteil!
Datasheet AT90S8515 Seite 31:

EEPROM Read/Write Access

The write access time is in the range of 2,5 - 4ms,depending
on the Vcc voltage.

Das sagt doch wohl alles, oder?

Gruss Uwe

von Henning (Gast)


Lesenswert?

okok, ich hab´s gefunden :)

wenn man einfach mittels
EEready:
  sbic EECR,EEWE  ; skip, wenn EECR = 0
  rjmp EEready ; wert ist noch nicht gespeichert!
den avr dazu bringt sicher zu warten, bis der wert abgespeichert ist 
bevor man nochmal auf´s eeprom zugreift geht alles klar

allerdings hab ich noch nen fehler gefunden im geposteteten quellcode: 
die lese UND schreib adresse wird garnicht gesetzt; nur in die register 
geschrieben. nach dem
  ldi xlow,0x00
  ldi xhigh,0x00
fehlt noch
  out EEARL, xlow
  out EEARH, xhigh

thx nochmal!

henning

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.