Hallo, gegeben ist eine Dimmer PWM mit Atmega8, welche per Tastendruck LED Kette am Weihnachtsbaum dimmt. Ich möchte nun beim Ausschalten den letzten PWM Zustand ins Eeprom schreiben, um bei erneutem Einschalten den letzten Wert wieder als Startwert zu haben. Wenn ich das dauern schreiben würde , wäre ja schnell die Speicherzelle defekt. Wie kann ich das bewerkstelligen?
Das EEPROM ist mit mindestens 100000 Löschzyklen angegeben. Um das zu erreichen müsstest du ca. ein Jahr lang fast 300 mal am Tag (ca. alle 5 Minuten), oder die nächsten 10 Jahre 30 mal am Tag (ca. alle 50 Minuten) den Wert ändern... Langweiliger Job ;-)
Ohmchen schrieb: > > Wie kann ich das bewerkstelligen? Erkenen ob Änderung gemacht wird, warten bis wieder -Ruhe- herrscht, dann ins EEprom schreiben (nicht an die erste Stelle). Kurt
Du kannst auch die Update-Funktion nutzen, die erst prüft, ob der vorhandene Wert gleich dem bestehenden ist. Wenn ja, wird nichts geschrieben. Wenn nein, wird das EEPROM beschrieben.
Wie schaltest du um? Kontinuierlich oder in Stufen bei jeden Tastendruck? Eigentlich egal, beim loslassen der Taste speicherst du den Wert im EEPROM. Und den fragst du am Programmanfang bei der Initialisierung ab. Fertig.
Von Atmel gibt es dafuer ein Appnote: http://www.atmel.com/images/doc2526.pdf
:
Bearbeitet durch User
In der AVR100 ist das Ganze anhand des Programmcodes sehr gut beschrieben. Natürlich in Assembler :-) .
Michael_ schrieb: > Wie schaltest du um? > Kontinuierlich oder in Stufen bei jeden Tastendruck? > Eigentlich egal, beim loslassen der Taste speicherst du den Wert im > EEPROM. genau, und nach dem letzten Tastendruck noch 10s warten und dann wie weiter oben beschrieben erst mal den Wert der schon im EEProm steht mit dem neuen Wert vergleichen und nur bei Änderung schreiben. Sascha
Ingo schrieb: > Ohmchen schrieb: >> Warum nicht an die erste Stelle? > Das würde mich auch mal interessieren! Beim Abschalten der Spannung kann das erste Byte überschrieben werden. Ist ein bekannter Fehler bei irgendwelchen Uraltgurken und wird nach wie vor als Dogma für alle AVRs verbreitet. mfg.
Ich könnte noch nen Write an eine random Adresse machen und davor eine Art Marker schreiben.... Nach dem Reset danach suchen und fertig, die Verzögerung wäre tolerierbar. Das wird ewig halten!
Prüfen ob sich der PWM-Wert für Y Sekunden NICHT ändert. Dann prüfen ob der PWM-Wert sich vom Wert im EEPROM unterscheidet. Wenn ja, dann schreiben. Damit sollte man eine Weile hinkommmen. gruß cyblord
Sascha Weber schrieb: > genau, und nach dem letzten Tastendruck noch 10s warten und dann wie > weiter oben beschrieben erst mal den Wert der schon im EEProm steht mit > dem neuen Wert vergleichen und nur bei Änderung schreiben. Warum denn 10s warten? Wenn die Taste betätigt wird, dann muß logisch ein neuer Wert eingetragen werden. Bitte kein Mitleid mit dem Chip. Selbst wenn der Junior jedes Weihnacht daran herumspielt, funktioniert das >10000 Jahre. Es wird doch nicht dauernd der PWM-Wert abgefragt und gespeichert. Sondern nur wenn der Finger krumm gemacht wird um die Taste zu betätigen!
Michael_ schrieb: > Sascha Weber schrieb: >> genau, und nach dem letzten Tastendruck noch 10s warten und dann wie >> weiter oben beschrieben erst mal den Wert der schon im EEProm steht mit >> dem neuen Wert vergleichen und nur bei Änderung schreiben. > > Warum denn 10s warten? Wenn die Taste betätigt wird, dann muß logisch > ein neuer Wert eingetragen werden. Muss nicht. Denn wenn man 3 mal hoch und 3 mal runter direkt hintereinander macht muss gar nichts getan werden Und selbst wenns nur 3 mal in eine Richtung geht, warum sollen alle Zwischenschritte gespeichert werden? DAS wäre unlogisch. Und völlig unnütze Verschwendung von EEPROM Lebenszeit. Ein paar Sekunden warten schadet nicht, hilft aber viel. Dabei spielt es keine Rolle ob die Zyklenzahl ausreicht oder nicht. Sondern es wäre einfach pfuschig implementiert. gruß cyblord
:
Bearbeitet durch User
Ohmchen schrieb: > Warum nicht an die erste Stelle? Weil die manchmal beim Ausschalten/Einschalten zerstört wird (so zumindest meine Erinnerung). Kurt
Du könntest die Spannungsversorgung des µCs auch mit einem großen Elko puffern und mit einem IO die Spannung von der Diode Messen. ICh würde einen Interrupt Pin verwenden und sofort bei einer fallenden Flanke den PWM wert aus dem RAM ins EEPROM kopieren.
cyblord ---- schrieb: > Und selbst wenns nur 3 mal in eine Richtung geht, warum sollen alle > Zwischenschritte gespeichert werden? DAS wäre unlogisch. Und völlig > unnütze Verschwendung von EEPROM Lebenszeit. Das geht aber nur, wenn man eine zusätzliche Anzeige hat, wo der Endzustand dann extra gespeichert und angezeigt wird. Und man muß die Verzögerungszeit abwarten, bis man wieder etwas ändern kann. Rechne mal, pro Weihnacht 100x Klick und speichern. Wieviel Jahre kann das dann benutzt werden?
Kurt Bindl schrieb: > Weil die manchmal beim Ausschalten/Einschalten zerstört wird (so > zumindest meine Erinnerung). Ich glaub, das war abgestellt. Da belegt man eben eine höhere Zelle, z.Bsp. 10H .
Michael_ schrieb: > cyblord ---- schrieb: >> Und selbst wenns nur 3 mal in eine Richtung geht, warum sollen alle >> Zwischenschritte gespeichert werden? DAS wäre unlogisch. Und völlig >> unnütze Verschwendung von EEPROM Lebenszeit. > > Das geht aber nur, wenn man eine zusätzliche Anzeige hat, wo der > Endzustand dann extra gespeichert und angezeigt wird. Versteh ich jetzt gar nicht. Was für eine Anzeige? Welcher Endzustand? > Und man muß die Verzögerungszeit abwarten, bis man wieder etwas ändern > kann. Nichts muss man abwarten. Natürlich kann man sofort was ändern. In dem Moment wird die Uhr wieder auf 0 gestellt und die 10 Sekunden laufen erneut. Erst wenn die Uhr 10 Sek. erreicht, wird ins EEProm gespeichert (nur wenn dieser Wert nicht schon drinsteht natürlich). > Rechne mal, pro Weihnacht 100x Klick und speichern. > Wieviel Jahre kann das dann benutzt werden? Trotzdem würde ich es richtig machen und so selten wie möglich in den EEProm schreiben.
cyblord ---- schrieb: >> Und man muß die Verzögerungszeit abwarten, bis man wieder etwas ändern >> kann. > Nichts muss man abwarten. Natürlich kann man sofort was ändern. In dem > Moment wird die Uhr wieder auf 0 gestellt und die 10 Sekunden laufen > erneut. Erst wenn die Uhr 10 Sek. erreicht, wird ins EEProm gespeichert > (nur wenn dieser Wert nicht schon drinsteht natürlich). Na überleg mal. Ich drücke auf den Knopf, und der Baum wird 20% heller. Warum soll man da 10s warten? Wenn ich jetzt den Stecker nach 5s ziehe, ist der Wert nicht gespeichert. cyblord ---- schrieb: > Versteh ich jetzt gar nicht. Was für eine Anzeige? Welcher Endzustand? Also, du hast LED von 1-10. Du drückst auf den Knopf und es springt von 5 auf 6, aber die Helligkeit des Baumes hat sich noch nicht geändert. Erst mit einer zusätzlichen Bestätigung, das die 6 richtig ist, wird die Helligkeit geändert.
Michael_ schrieb: > cyblord ---- schrieb: >>> Und man muß die Verzögerungszeit abwarten, bis man wieder etwas ändern >>> kann. >> Nichts muss man abwarten. Natürlich kann man sofort was ändern. In dem >> Moment wird die Uhr wieder auf 0 gestellt und die 10 Sekunden laufen >> erneut. Erst wenn die Uhr 10 Sek. erreicht, wird ins EEProm gespeichert >> (nur wenn dieser Wert nicht schon drinsteht natürlich). > > Na überleg mal. Ich drücke auf den Knopf, und der Baum wird 20% heller. > Warum soll man da 10s warten? Weil eine weitere Änderung kommen könnte und es deshalb keinen Sinn macht den aktuellen Wert sofort ins EEPROM zu schreiben. Der Baum wird natürlich sofort heller. Meist klickt man direkt mehrere Stellen hoch und dann wieder welche runter bis man zufrieden ist. > Wenn ich jetzt den Stecker nach 5s ziehe, > ist der Wert nicht gespeichert. Richtig. Aber wahrscheinlich ist das? Setz die Zeit auf 5 Sek. Oder auf 3 Sek. Die 10 Sek. waren nur ein Beispiel. Wer ändert die Helligkeit und zieht sofort den Stecker? Und selbst wenn? Geht ja nichts kaputt, wird halt nicht gespeichert. > Also, du hast LED von 1-10. Du drückst auf den Knopf und es springt von > 5 auf 6, aber die Helligkeit des Baumes hat sich noch nicht geändert. > Erst mit einer zusätzlichen Bestätigung, das die 6 richtig ist, wird die > Helligkeit geändert. Warum sollte man das so machen? Die Helligkeit der LEDs (also auch der PWM Wert im RAM) ändert sich sofort mit jeder Betätigung. Nur das speichern ins EEPROM wird verzögert.
:
Bearbeitet durch User
cyblord ---- schrieb: > Warum sollte man das so machen? Wie es heute üblich, das Ganze noch auf einem LCD/LED anzeigt. Die Luxusvariante. cyblord ---- schrieb: > Meist klickt man direkt mehrere Stellen hoch und dann wieder welche > runter bis man zufrieden ist. Bei Handbetrieb ist das kein Problem. Das geht zig-tausend Jahre. Oft ist es heute so, das, wenn man die Taste gedrückt hält, im Kreislauf gedimmt wird. Bei der richtigen Helligkeit lässt man los und der Wert wird gespeichert. Wo ist das Problem und warum sollte ich das verzögern?
Heizungsthermostate machen es a la M.H. PinChangeInt bei "gleich ist der Saft weg". Der verbaute AtMega169 läuft mit 100μF als Puffer lange genug, um einige Bytes "aktueller Zustand" zu sichern.
@M.H. Keine Zenerdiode, ne einfache 1n400x sollte genügen. Oder wozu eine Zenerdiode? Wie groß sollte der Elko sein, in etwa? Hab nicht Mehl viel Platz im Gehäuse.
M. H. schrieb: > Du könntest die Spannungsversorgung des µCs auch mit einem großen > Elko > puffern und mit einem IO die Spannung von der Diode Messen. ICh würde > einen Interrupt Pin verwenden und sofort bei einer fallenden Flanke den > PWM wert aus dem RAM ins EEPROM kopieren. Die Lichterkette wird aus 24 V AC mit folgendem Brückengleichrichter versorgt. Daraus versorge ich via 7505 in der Standardbeschaltung den Atmega8 (88). Vor dem 7505 hängt ein 470uf. Vielleicht reicht der schon, um einen Interrupt noch hinzubekommen und ins EEprom zu Speichern?
Ohmchen schrieb: > Vor dem 7505 hängt ein 470uf. > Vielleicht reicht der schon, um einen Interrupt noch hinzubekommen und > ins EEprom zu Speichern? Überschlagsrechnung: Das Speichern dauert 5ms, der AVR braucht 5mA, wir erlauben uns 0.5V Spannungseinbruch. Q = C * U = I * t oder C = (I * t) / U Macht 50uF. Du musst nur den Spannungseinbruch rechtzeitig und zuverlässig entdecken.
Ohmchen schrieb: > @M.H. > > Keine Zenerdiode, ne einfache 1n400x sollte genügen. > Oder wozu eine Zenerdiode? Sry. Das sollte eine Schottky Diode sein.
Wie viele Taster verwendest Du? 1x Up (heller) und 1x Down (dunkler)?
Ok, was hälst Du von einem 2. Taster für 'Save-Settings'?
Ich würde die Lösung von der Art der Eingabe abhängig machen. Kommt eine "fertige" Zahl von irgendwo her, so brauchst Du nur zu testen, ob sie sich vom Vorhänger unterscheidet. Hiervon machst Du es abhängig, ob gespeichert wird oder nicht. Arbeitest Du mit einem Step-Up/-Down System, so böte sich eine Hintergrundroutine an, die bei jedem tasten angestoßen wird und mit einer sinnvollen Verzögerung (etwas länger als der übliche Tastrhythmus) schaut ob das Endresultat unterschiedlich ist.
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.