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
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
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?
Großes Array und dann hoffen, dass mindestens noch zwei Drittel der Bits identisch sind? Noinit natürlich.
100.000 sind für ne Modellbahn genug. In der Praxis sind es eher 200.000+.
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?
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
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. :)
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.
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
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.
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.
Wenn dich die limitierten Schreibzyklen stören, kannst du FRAM nehmen. Die spezifizierten 100 Billionen Zyklen wirst du nicht so schnell aufbrauchen ;)
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
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
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.
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.
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".
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.