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
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.
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.
Martin Luerssen schrieb: > FLASH Soweit ich weiss kann man hier aber nur Konstanten speichern, diese aber nicht ändern!
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)
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.
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.
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)
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?
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?
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
@ 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.