Hallo allerseits, warum sollte gemäß GCC-Tutorial die erste Adresse des EEPROMS nicht verwendet werden? (DUMMY-Byte) Welcher Grund steckt dahinter? mfg
Weil es laut AVR Datenblatt gelegentlich vorkommen kann, dass das erste Byte beim ein-/auschalten der Spannungversorgung überschrieben wird.
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 };
Hab ich auch schon mal gelesen ist irgendein Bug. Ich weiß nicht mehr genbau warum, könnte aber was mit OSCAL gewesen sein.
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.
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
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
Ε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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.