Meine Nähmaschine (Zeigt her eure geilen Projekte! - #996 by fietsenfahrer) zählt die Stiche, die sie gemacht hat. Nun geht natürlich der Wert bei jedem Ausschalten oder Reset verloren. Ich hätte gern, dass der Wert auch nach dem Neustart erhalten bleibt.
Wenn ich ihn in den EEPROM schreibe, kann ich ihn natürlich beim Start wieder auslesen. Jedoch ist die Anzahl der Schreibzugriffe ja arg begrenzt. Wenn ich jeden Stich speichern würde, käme ich schnell an die Grenze.
Eigentlich reicht es ja, wenn der Wert beim Ausschalten, bzw. vorm Reset noch gesichert werden würde.
Gibt es dafür eine Lösung? Ich versorge den Arduino über VIN mit einem Step Down mit 8V (könnte ich auch höher einstellen, z.B. auf 10 V). Könnte man diese Spannung überwachen und wenn sie unter einen bestimmten Wert fällt (z.B. unter 9 V), gibt man ein Signal an den Arduino, der optimaler Weise einen Interrupt auslöst und den Wert speichert? Ist sowas umsetzbar? Hat das schon mal jemand gemacht?
Das würde natürlich nicht den Reset abfangen. Aber dafür könnte ich auch eine andere Lösung finden.
Leider ganz schön teuer, die Dinger. Mal sehen, vielleicht wenn ich das nächste Mal beim freundlichen Chinesen bestelle. Aber scheint mir eine wirklich einfache Lösung zu sein.
Für's RESET gibt es auch die Möglichkeit, einen RAM-Bereich nicht zu initialisieren, und deine Variable dort anzulegen.
unsigned long counter __attribute ((section (".noinit")));
Und irgendwie kann man den Controller nach dem Grund für den RESET fragen. Falls es RESET ohne Spannungsausfall war, eben nicht den EEPROM Wert holen...
Wie das genau geht, weiß --glaube ich-- @combie, und ist eventuell noch mehr Hardware-abhängig als der Hack mit __attribute ((section (".noinit"))); , der wohl für avr-Controller funktioniert.
Ich habe mir mal so beholfen, indem ich eine zweite Variable dort abgelegt habe.
Wenn die noch das vorgesehene Bitmuster hatte, wird wohl auch der counter noch gültig sein:
unsigned long reset __attribute ((section (".noinit")));
const unsigned long reset_pattern=0xAFFED00F;
void setup() {
Serial.begin(115200);
delay(1000);
if (reset != reset_pattern) {
reset = reset_pattern; counter=0; Serial.println("-----"); // Spannungsausfall: Zähler neustart
}
Serial.println(++counter,HEX); // Zum Test: Jeden Reset zählen
}
void loop() { }
Auch ein DS1307 hat 56 byte RAM und kann unendlich oft beschrieben werden. Eigentlich gibt es auch die DS3232 ( die DS3231 mit RAM) aber die ist kaum auf Modulen zu finden.