Forum: Mikrocontroller und Digitale Elektronik erste EEPROM-Stelle leer lassen


von EEPROM (Gast)


Lesenswert?

Hallo allerseits,

warum sollte gemäß GCC-Tutorial die erste Adresse des EEPROMS nicht 
verwendet werden? (DUMMY-Byte)

Welcher Grund steckt dahinter?

mfg

von Oliver (Gast)


Lesenswert?

EEPROM schrieb:
> Welcher Grund steckt dahinter?

Gar keiner. Wo steht das denn?

Oliver

von pschober (Gast)


Lesenswert?

Weil es laut AVR Datenblatt gelegentlich vorkommen kann, dass das erste 
Byte beim ein-/auschalten der Spannungversorgung überschrieben wird.

von EEPROM (Gast)


Lesenswert?

Im Kapitel:

"EEPROM-Variable auf feste Adressen legen"

im ersten Beispiel:


uint8_t ee_mem[EESIZE] EEMEM =
{
   [EE_DUMMY]   = 0x00,
   [EE_VALUE1]  = 0x05,
   [EE_WORD1L]  = 0x01,
   [EE_WORD1H]  = 0x00,
   [EE_VALUE2]  = 0xFF
};

von Uwe (Gast)


Lesenswert?

Hab ich auch schon mal gelesen ist irgendein Bug. Ich weiß nicht mehr 
genbau warum, könnte aber was mit OSCAL gewesen sein.

von Εrnst B. (ernst)


Lesenswert?

EEPROM schrieb:
> Welcher Grund steckt dahinter?

Wenn der Strom ausfällt und kein BOR konfiguriert ist, 
kann/konnte/könnte es bei manchen AVRs dazu kommen, dass eine 
EEPROM-Zelle gelöscht oder überschrieben wurde...

Hoffnung der Dummy-Zelle ist nun, dass es eben jene ist, deren Daten 
verloren gehen. Deshalb: erste Zelle verwenden, und nach jeder 
Eeprom-Operation ein Read der Dummy-Zelle, um die EE-Address-Register 
wieder zu nullen.

Muss man selber mit seiner Paranoia ausmachen, ob man das braucht oder 
nicht.

von spess53 (Gast)


Lesenswert?

Hi

Das Ganze war eigentlich nur bei den ersten AVRs (z.B. ATMega103) ein 
Problem. Von daher kenne ich das. Die neueren AVRs sind da 
unproblematisch.

MfG Spess

von Peter D. (peda)


Lesenswert?

Bei älteren AVRs wurde das EEADDR beim Reset auf 0 gesetzt.
Wenn also gerade ein EEPROM beschrieben wurde und z.B. der Watchdog 
zuschlägt, war das Byte auf der aktuellen Adresse und das auf Adresse 0 
zerstört.
Neuere AVRs sollen das nicht mehr machen.


Peter

von Oliver (Gast)


Lesenswert?

Εrnst B✶ schrieb:
> Wenn der Strom ausfällt und kein BOR konfiguriert ist,

dann hat man das Datenblatt nicht vollständig gelesen. Brown-out-Reset 
ist bei EEPROM-Nutzung Pflicht. Dann klappt es auch mit Speicherstelle 
0.

Oliver

von Εrnst B. (ernst)


Lesenswert?

Ah, danke Peter.
Damit wird das klarer...

Das Problem war damals also, dass während des Schreibvorgangs die 
Adresse genullt wurde.
d.H. die von mir angesprochenen regelmäßigen Reads auf die 
Dummy-Eeprom-Zelle um EEADR zu resetten bringen sowieso nix.
Und der BOR hilft auch nicht wirklich, sondern könnte das Problem sogar 
noch verschärfen.

von Thosch (Gast)


Lesenswert?

Oliver schrieb:
> Gar keiner. Wo steht das denn?

hier, im Codebeispiel: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM-Variable_auf_feste_Adressen_legen

Finde ich durchaus sinnvoll, wenn man über Pointer aufs EEPROM zugreift.
Dann kann man vor dem Zugriff den Pointer durch einen Vergleich (ob 
ungleich NULL) auf Gültigkeit testen.
1
if (ptr) { ...

Und Funktionen, die einen Pointer aufs EEPROM liefern sollen, liefern im 
Fehlerfall NULL.

Auf Adresse 0 im EEPROM kann man damit natürlich nicht mehr zugreifen,
und macht daher eine Dummy-Zuweisung.

Der zweite Grund ist, daß wenn irgendwas schiefgeht beim Schreiben ins 
EEPROM oft Adresse 0 betroffen ist.
Bei einigen AtMegas konnte der Speicherinhalt von Adresse 0 zerschossen 
werden, wenn während des Schreibens die RESET-Leitung aktiviert wird.

Gruß,
Thorsten

von Thosch (Gast)


Lesenswert?

upps, zu langsam...

von EEPROM (Gast)


Lesenswert?

danke

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.