Forum: Mikrocontroller und Digitale Elektronik Array einzeln ins EEprom schreiben


von Schwimmbadpinkler (Gast)


Lesenswert?

Hi, ich hab ein Array:
1
int32_t bla[40];
ich möchte das Array in einem Rutsch aus dem EEprom lesen, aber immer 
nur einzelne Werte schreiben. Wie kann man das machen?

von hm (Gast)


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.

von Schwimmbadpinkler (Gast)


Lesenswert?

Ja, gerade weil ich weiß das dass EEprom eine begrenzte Lebensdauer hat, 
will ich nur den einen Wert der sich gerade geändert hat schreiben!

von Karol B. (johnpatcher)


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

von Falk B. (falk)


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.

von Peter Z. (Gast)


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

von Bastler (Gast)


Lesenswert?

Nicht eeprom_write_block, sondern

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

benutzen, dann werde nur die Bytes geschrieben, die im RAM wirklich 
geändert wurden.

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.