EEPROM Atmega speichert nicht dauerthaft

Gast #2895589
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
Gast #2895599
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
(Firma: matzetronics) #2895650
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.