Array einzeln ins EEprom schreiben

Gast #3773721
Lesenswert?

Schwimmbadpinkler schrieb:
> aber immer
> nur einzelne Werte schreiben.

Zunächst einmal sollte man dich fragen, ob du dir im klaren darüber bist 
dass ein EEPROM eine begrenzte Anzahl von Schreibzyklen hat, bis es den 
Geist aufgibt..?

Sicher, dass du da immer nur einzelne Werte schreiben willst? Je nachdem 
wie oft du das machst, sagt das Teil schneller Tschüss als dir lieb ist.
#3773802
Lesenswert?

Schwimmbadpinkler schrieb:
> Wie kann man das machen?

Woran genau scheitert es denn? Von welcher Plattform bzw. Toolchain 
sprechen wir überhaupt? Im Falle von AVR und der avr-libc z.B. werden 
für genau diesen Zweck Methoden bereit gestellt, siehe [1]. Nutzt man 
die entsprechenden "update" Methoden, dann wird nur etwas geschrieben, 
wenn sich der Inhalt im EEPROM vom übergebenen Inhalt unterscheidet.

Im einfachsten Falle kannst du also einfach über dein Array iterieren 
und für jedes Element ein die update Methode aufrufen.

Schöner/Komplizierter geht es immer: Beim Wordclock Projekt [2] z.B. 
machen wir es so, dass eine Kopie des EEPROMs im SRAM vorliegt auf 
welche man über Variablen auf gewöhnlichem Wege zugreifen kann. Möchte 
man Änderungen am SRAM Inhalt persistent im EEPROM ablegen, so muss man 
einen "writeback" initiieren. Rein architektonisch gesehen dürfte das in 
vielen Fällen wohl der elegantere Ansatz sein.

Mit freundlichen Grüßen,
Karol Babioch

[1]: http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html
[2]: https://www.mikrocontroller.net/articles/Word_Clock_Variante_1
#3773917
Lesenswert?

@ Karol Babioch (johnpatcher)

>die entsprechenden "update" Methoden, dann wird nur etwas geschrieben,
>wenn sich der Inhalt im EEPROM vom übergebenen Inhalt unterscheidet.

Ja!

>Im einfachsten Falle kannst du also einfach über dein Array iterieren
>und für jedes Element ein die update Methode aufrufen.

NEIN! Das machen die schon selber!

void eeprom_update_block (const void __src, void __dst, size_t __n)

Die Details findet man in der Doku der libc vom win avr.
Gast #3774068
Lesenswert?

1
int32_t Zahl[40];        //Array anlegen
2
int32_t EEprom_Zahl[40] EEMEM;  //Spiegelbild vom Array im EEprom anlegen
3

4
eeprom_read_block(&Zahl[0],&EEprom_Zahl[0],sizeof(Zahl));      //Ganzes Array aus dem EEprom lesen
5

6
eeprom_write_block(&Zahl[Nr],&EEprom_Zahl[Nr],sizeof(Zahl[Nr]));  //Einen einzigen Wert aus dem Array ins EEprom schreiben
YO

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren