Forum: Compiler & IDEs Variable in nicht-flüchtigem Speicher


von Dingens K. (niun)


Lesenswert?

Hallo, ich bin neu was Mikrocontroller angeht und habe folgendes 
Problem:
Ich brauche für ein Programm mehrere uint16_t[11] arrays, die sich lesen 
sowie beschreiben lassen und nach einem Stromverlust ihre Werte nicht 
verlieren.

Ich habe bisher einen Artikel über PROGMEM gelesen, leider kann ich mit 
meinem bisherigem Wissensstand nicht sehr viel damit anfangen.

Ich hoffe auf eine möglichst einfache Erklärung, wie ich eine Variable, 
die sich während des laufenden Programmes verändert, auch nach einem 
Power-off wieder verfügbar habe.

Grüße
Niun

avr-gcc, ATMega16

von Martin L. (martin_l795)


Lesenswert?

In welchen Zeitabständen bzw. wie oft verändert die sich denn zwischen 
dem An-/Abschalten?

Wenn die Werte jederzeit gesichert werden müssen und sich in schneller 
Folge ändern, dann kannst Du bei der Verwendung des internen 
EEPROM/FLASH u.U. auch schnell die Anzahl der garantierten Schreibzyklen 
erreichen.
Vielleicht wäre dann der einfachste Weg die Batteriepufferung des uC als 
Absicherung gegen Ausfall und ein wegsichern der Inhalte in größeren 
Zeitabständen.

von Ingo L. (corrtexx)


Lesenswert?

Das stichwort lautet EEPROM. Dein AVR hat 512 Byte davon. Da kannst du 
deine Werte reinschreiben und die sind dann auch noch nach dem 
Reset/Stromunterbrechung verfügbar. Allerdings kannst du nicht beliebig 
oft ins EEPROM schreiben.

von Ingo L. (corrtexx)


Lesenswert?

Martin Luerssen schrieb:
> FLASH
Soweit ich weiss kann man hier aber nur Konstanten speichern, diese aber 
nicht ändern!

von Little B. (lil-b)


Lesenswert?

Ingo Less schrieb:
> Martin Luerssen schrieb:
>> FLASH
> Soweit ich weiss kann man hier aber nur Konstanten speichern, diese aber
> nicht ändern!

Jeder halbwegs moderne Mikrocontroller kann sein eigenes Flash 
manipulieren. Natürlich muss das mit vorsicht verwendet werden, da man 
sonst ruck zuck seine Applikation löscht. Auch die Schreibzyklen sind 
stark begrenzt, aber es ist sehr wohl möglich, Flash als Speichermedium 
für Varibalen zu nutzen (wenn auch mit Software Overhead)

von Martin L. (martin_l795)


Lesenswert?

Yep. Ist möglich, die sowohl ins Flash, als auch im EEPROM sicher zu 
lagern. Die Hauptfrage ist aber wirklich, wie oft das geschehen muss.
Wenn er seine Meßwerte(?) jede Sekunde ausfallsicher absichern würde, 
dann hätte er schon nach nicht mal 3 Stunden die angegebene Mindestzahl 
an Flash-Schreibzyklen erreicht, nach bischen über nem Tag die des 
EEPROM.
Wenn er alle Stunde mal sichert, spielt das keine soo große Rolle.

von Jan H. (jan_m_h)


Lesenswert?

Auch möglich wäre es, den µC über einen großen Kondensator zu puffern 
und beim wegfall der Eingangsspannung alle Variablen vom RAM in den 
EEPROM zu kopieren. Spart Schreibzyklen, ist dafür aber zusätzlicher 
Hardware Aufwand für Kondensator und Diode in der Versorgungsleitung, 
sowie ein Pin zum prüfen der Spannung. Funktioniert auch nicht mit jeder 
Spannungsversorgung einfach so.

von Dingens K. (niun)


Lesenswert?

Hallo,
danke für die schnellen Antworten.
Die Werte müssen nicht häufig geändert werden, höchsten ein Mal am Tag.
Es handelt sich nur um Umgebungsvariablen die ab und zu über ein Menü 
angepasst werden.

Eine Puffer-Batterie fällt leider raus, das Gerät ist u.U mehrere Wochen 
ohne externe Spannungsversorgung.

Das Speichern im Flash klingt schon einmal gut, wie funktioniert das 
Ganze konkret? (Bitte in möglichst einfachen Worten)

von Martin L. (martin_l795)


Lesenswert?


von Dingens K. (niun)


Lesenswert?

Danke für den Link.
Soweit ich das herausgelesen habe, werden die variablen einmal im Flash 
initialisiert und dann mittels "pgm_read_byte" wieder in den RAM 
geschrieben.

Das ist soweit klar, aber wie bekomme ich das ganze dazu, die !const! 
flash variablen zu ändern, also vom ram wieder zurück in den flash zu 
schreiben?

von Klaus (Gast)


Lesenswert?

Ja. Da schalten wir mal den Fernseher ab und das Gehirn ein:

Wenn es denn eine "read"-Operation gibt, was wird wohl unter den dazu 
komplementären Operationen die für Deine Zwecke passende sein?

von Karl H. (kbuchegg)


Lesenswert?

Meik W. schrieb:
> Danke für den Link.
> Soweit ich das herausgelesen habe, werden die variablen einmal im Flash
> initialisiert und dann mittels "pgm_read_byte" wieder in den RAM
> geschrieben.

EEPROM nicht Flash.
Sollte eigentlich nach Studium des Links klar sein

von Dingens K. (niun)


Lesenswert?

@ Klaus:
Erfrischend freundlich.
Da es KEINE pgm_write Funktion zu geben scheint, worauf willst du 
hinaus?
Im Flash scheinen nur konstanten zu stehen, also danke für gar nichts.

@Karl Heinz:
Danke fürs Verdeutlichen, habe es jetzt kapiert.

eeprom_write_byte/eeprom_read_byte


Grüße
Niun

von Klaus (Gast)


Lesenswert?

Meik W. schrieb:
> @ Klaus:
> Erfrischend freundlich.

Mist. Das wollte ich gar nicht.
Da muss ich wohl noch sarkastischer formulieren.

> Da es KEINE pgm_write Funktion zu geben scheint, worauf willst du
hinaus? Im Flash scheinen nur konstanten zu stehen, ...

Da schalten wir nochmal das Gehirn ein und überlegen was es denn sonst 
noch so für Speicher in Deinem uC gibt.

Aber das hat Karl Heinz ja schon für Dich getan.

>  ... also danke für gar nichts.
Also hast Du gar nichts selbst gedacht, erfahren oder versucht. Das hat 
Karl Heinz getan. Und gelesen hat er auch noch für Dich.

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.