Forum: Mikrocontroller und Digitale Elektronik Bit-Speicherung bei Spannungsabfall (AVR)


von Philipp S. (tech-lip)


Lesenswert?

Hallo zusammen,
wie die Überschrift bereits verrät, suche ich nach einer Möglichkeit, 
dass mein AVR den Zustand eines Bits selbst bei Spannungsabfall 
speichert.

Der Grund warum ich das brauche ist, dass ich als Märklin-Eisenbahner 
momentan am Bau eines Digital-Decoders bin, wobei der digitale Teil nun 
weitgehend funktionsfähig ist. Somit will ich mich nun dem analog fahren 
widmen. Da Märklin damals das analog fahren (AC) so realisiert hat, dass 
die Fahrspannung circa bei 7-16 Volt und um die Fahrtrichtung zu ändern 
ein Spannungsimpuls mit circa 24 Volt ein bistabiles Relais in der Lok 
umschält, wodurch dann Fahrtrichtung geändert wird.

Um eine möglichst kleine Lösung (Bauteilemäßig, da das ganze ja noch ein 
eine Lok passen muss) zu realisieren, hab ich mir drei Lösungsansätze 
überlegt:
1. Der Fahrrichtungszustand wird im EEPROM gespeichert, was allerdings 
die Anzahl des Schreibens auf "nur" 100.000 mal limitiert.

2. Der AVR gibt dem Bit ganz normal den neuen Wert und geht sofort in 
den Deep-Sleep-Mode wodurch der AVR dann von einem Kondensator versorgt 
wird. Geweckt wird dieser dann wieder über den Interrupt, der schon 
wegen des digital fahrens benötigt wird. Der Nachteil von dieser Lösung 
ist, dass der Zustand nicht dauerhaft gespeichert werden kann, da sich 
der Kondensator mit der Zeit entleert.

3. Diese Möglichkeit ist von der Speicherung die zuverlässigste und 
Ressource-sparenste. Hierbei wird ähnlich dem alten Fahrrichtungsrelais 
bzw. dem späteren elektronischen Fahrrichtungsumschalter (auch mit 
bistabilem Relais) der Zustand mittels bistabilen Relais gespeichert. 
Dabei wechselt der Kontakt zwischen VCC und GND was dem AVR dann die 
Richtung verrät. Bei diesem Lösungsansatz ist der Nachteil der, dass 
dieser am meisten (zwar noch vertretbaren) Platz verbraucht.


Welche Lösung würdet ihr bevorzugen bzw. wisst ihr noch was Besseres? 
Vielen dank schon einmal für eure Antworten.

MfG Philipp

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Philipp S. schrieb:
> 1. Der Fahrrichtungszustand wird im EEPROM gespeichert, was allerdings
> die Anzahl des Schreibens auf "nur" 100.000 mal limitiert.

Wer zwingt dich denn, immer die gleiche EEPROM Zelle zu nutzen?. Ein 
eingermassen intelligenter Algorhitmus kann, wenn bei einem Byte alle 8 
bits aufgebraucht sind, zum nächsten Byte wechseln.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Philipp S. schrieb:
> 1. Der Fahrrichtungszustand wird im EEPROM gespeichert, was allerdings
> die Anzahl des Schreibens auf "nur" 100.000 mal limitiert.

Damit dürftest du geschätzt um eine Größenordnung besser sein, als der 
Originalfahrtrichtungsumschalter. Außerdem gibt es genug EEPROMs mit 1 
Mio Schreibzyklen, z.B. AT24C64D

Und wer sagt denn, dass du immer die selbe Speicherstelle beschreiben 
musst?

von Fritz (Gast)


Lesenswert?

Großes Array und dann hoffen, dass mindestens noch zwei Drittel der Bits 
identisch sind? Noinit natürlich.

von H.Joachim S. (crazyhorse)


Lesenswert?

100.000 sind für ne Modellbahn genug. In der Praxis sind es eher 
200.000+.

von Kaj (Gast)


Lesenswert?

Philipp S. schrieb:
> 1. Der Fahrrichtungszustand wird im EEPROM gespeichert, was allerdings
> die Anzahl des Schreibens auf "nur" 100.000 mal limitiert.
Woher kommt eigentlich dieser Irrglaube, dass es direkt beim 100.001 mal 
schrott ist?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Matthias S. schrieb:
> Wer zwingt dich denn, immer die gleiche EEPROM Zelle zu nutzen?. Ein
> eingermassen intelligenter Algorhitmus kann, wenn bei einem Byte alle 8
> bits aufgebraucht sind, zum nächsten Byte wechseln.
Es hilft bei einem EEPROM nichts, die Zelle zu löschen und dann die 8 
Bits einzeln nacheinander auf '0' zu schreiben, weil sowieseo bei jedem 
einzelnen Schreiben die EEPROM-Zelle auf 0xFF gelöscht wird...
Nur beim Flash sind Löschen und Schreiben tatsächlich getrennt und somit 
diese "Einmal-Löschen-und-acht-mal-Schreiben-pro-Byte" Strategie 
anwendbar.

Philipp S. schrieb:
> Der Nachteil von dieser Lösung ist, dass der Zustand nicht dauerhaft
> gespeichert werden kann, da sich der Kondensator mit der Zeit entleert.
Definiere "dauerhaft". Muss das "dauerhaft für mehr als 1 Jahr" oder 
"dauerhaft für höchstens 1 Tag" gespeichert werden?

Kaj schrieb:
> Woher kommt eigentlich dieser Irrglaube, dass es direkt beim 100.001 mal
> schrott ist?
Es hält tatsächlich nicht arg viel länger. Probiers aus: schreibe einen 
Wert ins EEPROM und schalte danach die Spannung weg(*). Dann lege die 
Spannung wieder an und kontrolliere den Zustand der Zelle. Nach 150k 
Lösch-/Schreibzyklen ist die Speicherzelle üblicherweise platt.
Irgendwie sind diese EEPROMs im µC deutlich lausiger als die 
"Stand-Alone"-Lösungen, die 1 Mio Zyklen aushalten...

(*) wenn die Spannung anliegen bleibt, dann kan mann "scheinbar" das 
EEPROM  deutlich öfter Löschen/Schreiben. "Scheinbar" deshalb, weil die 
Zelle nach 150k Zyklen trotzdem kaputt ist, das aber erst nach dem 
nächtsen Powerfail bemerkt wird. Man kann also, ohne dass man die 
Spannung wegnimmt, die Zelle eine halbe Million mal Löschen und 
Schreiben und bekommt immer noch den richtigen Wert zurück. Wenn man 
dann aber mal die Spannung wegnimmt und sich den gespeicherten Wert 
ansieht, das ist der korumpiert und unbrauchbar.

: Bearbeitet durch Moderator
von Simpel (Gast)


Lesenswert?

Du wirst ja noch andere Hobbies und Tagewerke haben, als deine 
Modellbahn. Also werden aufs Jahr gemittelt (grob geschätzt) max. 10 
Richtungswechsel pro Tag und Lok anfallen, wenn überhaupt...
Das ergibt eine Standzeit des EPROMs von ca. 27 Jahren. Schön, dass in 
dieser Zeit sonst nix kaputt geht. :)

von sigma9 (Gast)


Lesenswert?

Oder eine Hybrid-Lösung:

Du versorgst den AVR aus einen Kondensator. Jede Minute (oder so...) 
weckst du den AVR und  misst du die restliche Spannung - ADC/AnComp hast 
du im AVR sowieso. Wenn diese einen bestimmten Wert (musst du halt 
ausprobieren) unterschreitet, nur dann schreibst du ins EEPROM.

Habe damit gute Erfahrungen gemacht. Braucht keine Extra-HW und wenig 
SW.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Lothar M. schrieb:
> Es hilft bei einem EEPROM nichts, die Zelle zu löschen und dann die 8
> Bits einzeln nacheinander auf '0' zu schreiben, weil sowieseo bei jedem
> einzelnen Schreiben die EEPROM-Zelle auf 0xFF gelöscht wird...
> Nur beim Flash sind Löschen und Schreiben tatsächlich getrennt und somit
> diese "Einmal-Löschen-und-acht-mal-Schreiben-pro-Byte" Strategie
> anwendbar.

Der Algorithmus würde etwa folgendermassen aussehen:

Beim einschalten wird das EEPROM ab Adresse 0 aufwärts abgesucht nach 
dem ersten Byte mit 0xFF Inhalt. Das Byte davor muss der letzte 
gespeicherte Wert sein. Nun kann man z.B. die Parität auswerten und 
daraus schliessen, ob Bit an oder aus. Wenn kein Byte mit 0xFF gefunden 
wird, bedeutet das mindestens Runde 2 und wird begonnen, indem man 
Adresse 0 beschreibt und das Byte mit Adresse 1 mit 0xFF vorbesetzt.

Wenn der zu merkende Zustand im Betrieb geändert wird, zählt man das 
Byte eines hoch und speichert es wieder, bis Wert 0xFE erreicht wird, 
dann muss die EEPROM Adresse um eins erhöht werden und mit 0x00 
vorbesetzt werden, bzw. 0x01, wenn das Bit gesetzt werden soll.
Auf diese Art wird nach und nach der gesamte EEPROM Speicher ausgenutzt 
und jedes Byte kann 255 mal ausgenutzt werden, bevor es wieder von vorne 
losgeht.

Allerdings sind 100.000 Schreibzyklen pro Zelle so viel, das man solche 
Tricks gar nicht braucht. Jedes Relais hätte vermutlich schon längst 
schlapp gemacht.

: Bearbeitet durch User
von Peter R. (peterfido)


Lesenswert?

Hallo,

der AVR schreibt nicht nur ein Bit oder Byte im EEPROM. Die Blockgröße 
beim Mega8 z.B. sind 4 Bytes, wenn ich das richtig in Erinnerung habe.

Hast Du Angst, dass der AVR vorzeitig die Segel streicht, kannst Du auch 
Werte in einem batteriegepufferten Speicher ablegen. Z.B. DS1307 hat 
neben der Uhr noch ein paar frei verwendbare Bytes übrig. Diese habe ich 
'früher' immer genutzt, um die Zeit des letzten DCF-Syncs zu speichern.

Für die Fahrtrichtung sollte die Lebensdauer des AVR-EEPROM aber auch so 
ausreichen.

von Amateur (Gast)


Lesenswert?

Die Lösung Deines Problems ist so einfach, dass es schon beschämend ist.

Isoliere (elektrisch) Deinen µP so vom Rest der Schaltung, dass ein 
ordentlicher Puffer (Kondensator) für den µP entsteht. In den meisten 
Fällen reichen dafür eine Schottky-Diode in der Zuleitung des µP und ein 
kräftiger Kondensator. Dann überwache einfach die Spannung. Praktisch 
alle µP haben analog Eingänge oder einen Komparator. Ist diese aus, so 
bleiben dem µP noch ein paar Millisekunden oder gar Sekunden um in Ruhe 
ein Bit zu schreiben.
Wenn Du nun von 100000 Schreibzyklen ausgehst, so werden daraus 100000 
Mal an und aus. Das wiederum sollte für viele, viele Jahre (div 365 = 
Ururenkel) ausreichen.

Muss aber nicht sein.

von Ferroelektrikum (Gast)


Lesenswert?

Wenn dich die limitierten Schreibzyklen stören, kannst du FRAM nehmen. 
Die spezifizierten 100 Billionen Zyklen wirst du nicht so schnell 
aufbrauchen ;)

von Jobst M. (jobstens-de)


Lesenswert?

Amateur schrieb:
> Dann überwache einfach die Spannung.

Überflüssig. Dem TO geht es um den Analogbetrieb. Hier wird nahezu bei 
jeder Richtungsumschaltung anschließend keine Spannung sein und so kann 
er auch sofort ins EEprom schreiben.

Wenn man das EEProm nicht benutzen möchte, wäre evtl. ein Ringkern eine 
Alternative!? ;-) (https://de.wikipedia.org/wiki/Kernspeicher)


Gruß

Jobst

von Philipp S. (tech-lip)


Lesenswert?

Hallo,

erst einmal vielen Dank für die schnellen Antworten und Ideen (ich 
konnte mich leider erst jetzt wieder melden...).

sigma9 schrieb:
> Du versorgst den AVR aus einen Kondensator. Jede Minute (oder so...)
> weckst du den AVR und  misst du die restliche Spannung

Die Idee es als Hybriden zu realisieren, finde ich gar nicht mal so 
schlecht, da die dafür benötigten Bauteile sowieso schon gebraucht 
werden (lediglich den Kondensator muss man etwas größer dimensionieren). 
Aber aus einem älteren Projekt meine ich noch zu wissen, dass im 
Deep-Sleep-Mode die maximal zählbare Zeit (über den Watchdog war es 
glaube ich) auf 8 Sekunden begrenzt ist oder liege ich da falsch?

Die Idee von Matthias mit dem Algorithmus finde ich gut, das muss ich 
mal ausprobieren, auch in Kombination als Hybrid.

Die anderen Möglichkeiten scheiden vorerst mal aus, da ich auf dem 
Digitaldecoder nur sehr begrenzt viel Platz habe, vielleicht kommen 
diese als Ersatzlösung in Betrieb.

Jobst M. schrieb:
> Wenn man das EEProm nicht benutzen möchte, wäre evtl. ein Ringkern eine
> Alternative!? ;-)

Das mit dem Ringkern interessiert mich trotzdem. Ich habe gelesen, dass 
dies eine recht alte Speicherart ist und deshalb frage ich mich ob die 
heute noch erhältlich sind, wenn nicht sogar als SMD.

MfG Philipp

von n0a (Gast)


Lesenswert?

Philipp S. schrieb:
> Das mit dem Ringkern interessiert mich trotzdem. Ich habe gelesen, dass
> dies eine recht alte Speicherart ist und deshalb frage ich mich ob die
> heute noch erhältlich sind, wenn nicht sogar als SMD.

Also theoretisch solltest du sowas auch selbst aufbauen können. Zum 
Kaufen dürfte es das wohl nicht geben.

Die Idee dahinter klingt für mich sehr interessant, ich werde das am WE 
sicher mal ausprobieren und versuchen, sowas aufzubauen. Einen Eisenkern 
bekommt man aus einem kleinen Transformator und der Draht wird kein 
Problem sein.

von H.Joachim S. (crazyhorse)


Lesenswert?

n0a schrieb:
> Einen Eisenkern
> bekommt man aus einem kleinen Transformator

Hm, naja. Beim Trafo will man eine möglichst flache 
Magnetisierungskurve, beim Speicherkern eher eine möglichst breite 
(Rechteckferrit).
Bei ebay gibts manchmal alte Ringkernspeichermatritzen für kleines Geld. 
Aber ganz so einfach ist die Ansteuerung auch nicht. Ich würde da lieber 
einen FRAM benutzen, bei dem dann 99,x% der Kapazität frei bleiben wenn 
ich nur ein einziges Bit brauche.

von Peter D. (peda)


Lesenswert?

Lothar M. schrieb:
> Es hilft bei einem EEPROM nichts, die Zelle zu löschen und dann die 8
> Bits einzeln nacheinander auf '0' zu schreiben, weil sowieseo bei jedem
> einzelnen Schreiben die EEPROM-Zelle auf 0xFF gelöscht wird...

Das war früher mal.
Schau z.B. ins Datenblatt des Attiny13 unter "Split Byte Programming".

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Philipp S. schrieb:
> Ich habe gelesen, dass
> dies eine recht alte Speicherart ist und deshalb frage ich mich ob die
> heute noch erhältlich sind, wenn nicht sogar als SMD.

M.W. war die kleinste Bauform dieser Speicherart der 'Bubble':
https://de.wikipedia.org/wiki/Magnetblasenspeicher

Das Schreiben beim Ringkern ist nicht so schwierig, allerdings ist das 
Lesen trickig, denn du möchtest den Speicherinhalt ja nicht ändern.

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.