Wert beim Reset/Ausschalten speichern

Hallo!

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.

Danke!

Befasse Dich mal mit FRAM und deren Eigenschaften. Da kannst Du dann jeden Stich speichern.

Gruß Tommy

1 Like

Ja, das macht jede unterbrechungsfreie Stromversorgung.

Bei Dir fehlt noch eine Stromversorgung für die Zeit des Speicherns, also ein großer Kondensator oder Akku.

Aber FRAM ist vermutlich einfacher :slightly_smiling_face:

1 Like

Klar!
Versorgungspannung überwachen.
Wenn diese abfällt, schnell speichern.
Und µC anhalten.

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.

ja und wird auch alle 6 Monate danach gefragt.

Nimm einen Elko, eine Diode und einen freien Pin.
Du überwachst die Eingangsspannung, wenn sie wegfällt speicherst du ins EEPROM.

1 Like

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() { }

Ja!
Steht aber auch im Datenblatt des AVR recht klar beschrieben.
Auch: 8-bit AVR® Device Reset Sources - Developer Help

Nur wird das Register (leider?) vom Bootloader überschrieben, wenn ein solcher vorhanden.

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.

Auch z.B. 23LCV1024 wäre möglich.
Immerhin ist SPI deutlich schneller, als I2C

SRAM ist deutlich schneller als EEPROM löschen/schreiben
Eine AVR EEPROM Zelle braucht ca. 3,4ms zum löschen+schreiben

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.