Forum: Mikrocontroller und Digitale Elektronik EEPROM Atmega speichert nicht dauerthaft


von Nils (Gast)


Lesenswert?

Moin,

ich befürchte die Frage wurde hier schon oft gestellt:
Atmega16, ich schreibe etwas ins EEPROM und lese es direkt danach wieder 
aus, von mehreren Adressen: funktoniert.
Wenn ich dann aber nach einem Neustart nur lesen will bekomm ich lauter 
FF ausgegeben.

Ich habe die gegebenen Funktionen und eigene probiert - bei beiden das 
gleiche Problem.

Der relevante Code sieht so aus (lcd_set_line ist meine eigene Funktion 
zur Ausgabe auf dem LCD Display):
1
unsigned char x;
2
unsigned int addr;
3
4
static inline void write_byte(unsigned int *addr,unsigned char byte){
5
  loop_until_bit_is_clear(EECR,EEWE);
6
  loop_until_bit_is_clear(SPMCR,SPMEN);
7
  EEAR = *addr;
8
  EEDR = byte;
9
  EECR |= (1<<EEMWE);
10
  EECR |= (1<<EEWE);
11
  _delay_ms(1);
12
  EECR |= (1<<EEWE);
13
}
14
15
static inline unsigned char read_byte(unsigned int *addr){
16
  EEAR = *addr;
17
  EECR |= (1<<EERE);
18
  _delay_ms(1);
19
  return EEDR;
20
}
21
22
addr = 0;
23
for(x=0;x<10;x++){
24
  write_byte(&addr, x);
25
  addr++;
26
  _delay_ms(1);
27
}
28
addr = 0;
29
for(x = 0;x<10;x++){
30
  sprintf(lcd,"%d",read_byte(&addr));
31
  lcd_set_line(lcd,1);
32
  addr++;
33
  _delay_ms(500);
34
}

mfg
Nils

von astroscout (Gast)


Lesenswert?

ich verwende bie mir immer die <avr/eeprom.h>

Du kannst dann mit eeprom_read_byte(adresse) den Speicherbereich lesen 
und mit eeprom_write_byte(adresse, wert) schreiben. Das funktioniert bei 
mir ohen Probleme und ist sehr einfach

von Joachim R. (jorath)


Lesenswert?

Moin,

wie ist denn die Fuse "EESAVE" gesetzt? Diese Fuse bestimmt das 
Verhalten des EEPROMs beim flashen des Programms.

MfG

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

astroscout schrieb:
> Du kannst dann mit eeprom_read_byte(adresse) den Speicherbereich lesen
> und mit eeprom_write_byte(adresse, wert) schreiben. Das funktioniert bei
> mir ohen Probleme und ist sehr einfach

Tut es in der Tat. Achte beim Kompilieren allerdings auf die 
Optimierungseinstellungen. Damit der Code aus der Lib funktioniert, 
sollte die Optimierung vorzugsweise auf "-Os" stehen. Niedrigere 
Optimierungen führen durch zusätzlichen Code zu Timingproblemen.

Joachim Rath schrieb:
> wie ist denn die Fuse "EESAVE" gesetzt? Diese Fuse bestimmt das
> Verhalten des EEPROMs beim flashen des Programms.

Eine gesetzte EESAVE Fuse sorgt allerdings nur dafür, das bei einem Chip 
Erase der EEPROM Inhalt nicht auch gelöscht wird und sollte mit dem o.a. 
Problem nicht so viel zu tun haben.

von Bronco (Gast)


Lesenswert?

Brown-Out-Detektor eingeschaltet?
Versorgungsspannungsbereich beachtet und richtig gepuffert?
Das EEPROM ist etwas heikel, wenn beim Schreiben die Spannung wegbricht.

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.