Forum: Mikrocontroller und Digitale Elektronik ATMEGA8 schreibt nicht auf EEPROM


von Lobo (Gast)


Lesenswert?

Hallo!

Ich möchte Messdaten im EEPROM des ATMEGA8 ablegen. Wenn ich diese 
allerdings nach dem Schreibvorgang zurücklese und vergleiche stimmen, 
dann stimmen die Werte nicht überein. Wenn ich den EEPROM über PonyProg 
zurücklese ist er jungfreulich (0xFF). Die verwendeten Routinen habe ich 
direkt aus dem Datenblatt entnommen und lediglich durch die Abschaltung 
der Interrupts erweitert:

;+---------------------------------------------+
;|                 EEPROM_read                 |
;+---------------------------------------------+

; Input:  XH, XL (AdrH, AdrL)
; Output:  Tmp1 (data)
EEPROM_read:
  sbic  EECR,EEWE    ; Wait for completion of prev. write
  rjmp  EEPROM_read
  out  EEARH, XH    ; Set address
  out  EEARL, XL
  sbi  EECR, EERE  ; Start eeprom read
  in  Tmp1, EEDR  ; Read data from data register
  ret

;+---------------------------------------------+
;|                 EEPROM_write                |
;+---------------------------------------------+

; Input:  XH, XL (AdrH, AdrL), Tmp1 (data)
; Output:  none
EEPROM_write:
  sbic  EECR,EEWE    ; Wait for completion of prev. write
  rjmp  EEPROM_write
  out  EEARH, XH    ; Set address
  out  EEARL, XL
  out  EEDR, Tmp1  ; Write data (Tmp1) to data register
  cli      ; disable IR
  sbi  EECR,EEMWE  ; enable eeprom read
  sbi  EECR, EEWE  ; Start eeprom read
  sei
  ret

Bei der Simulation im AVR-Studio (V4.13) läuft alles wunderbar. Bei der 
Initialisierung wird der erste freie Platz im EEPROM (0xFF) gefunden und 
ab dieser Adresse das EEPROM Byte für Byte gefüllt! Nur auf dem realen 
Käfer scheint der EEPROM absolut unberührt zu bleiben.

Habe auch bereits alle Foren hier, welche irgendetwas mit EEPROM zu tun 
haben, durchfortet, aber nichts gefunden was mir weiterhilft:

- Stack Pointer ist korrekt initialisiert
- BODEN fuse habe ich ausprobiert (obwohl Versorgung stabil)
- EESAVE fuse habe ich ausprobiert

Zuletzt habe ich noch eine zweite Warteschleife bzgl. SPMEN in SPMCR 
eingefügt, da dies im Datenblatt erwähnt wird. Auch wenn dies nur 
notwendig ist wenn Self-Programing verwendet wird, was bei meiner 
Anwendung onehin nicht der Fall ist:

;+---------------------------------------------+
;|                 EEPROM_write                |
;+---------------------------------------------+

; Input:  XH, XL (AdrH, AdrL), Tmp1 (data)
; Output:  none
EEPROM_write:
  sbic  EECR,EEWE    ; Wait for completion of prev. write
  rjmp  EEPROM_write
EEPROM_write2:
  in  Tmp3, SPMCR
  sbrc  Tmp3, SPMEN
  rjmp  EEPROM_write2
  out  EEARH, XH    ; Set address
  out  EEARL, XL
  out  EEDR, Tmp1  ; Write data (Tmp1) to data register
  cli      ; disable IR
  sbi  EECR,EEMWE  ; enable eeprom read
  sbi  EECR, EEWE  ; Start eeprom read
  sei
  ret

Nun weiß ich mir keinen Rat mehr. Hat sonst noch irgend jemand eine Idee 
an was es liegen könnte?

von Lobo (Gast)


Lesenswert?

Also, es hat sich erst mal erledigt:

Habe gerade festgestellt, dass die EEPROM-Daten im PonyProg-Dump erst 
weiter unten aufgelistet sind (Flash in grün, EEPROM blau). Im blauen 
Bereich habe ich die Daten gefunden.

Stimmt nur noch etwas mit meinem Write/Read-Vergleich nicht. Aber das 
bekomme ich schon hin!

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.