Forum: Mikrocontroller und Digitale Elektronik Atmega Wert bei ausschalten autom. Speicher


von Ohmchen (Gast)


Lesenswert?

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?

von Werner B. (werner-b)


Lesenswert?

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 ;-)

von Kurt B. (kurt-b)


Lesenswert?

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

von Ohmchen (Gast)


Lesenswert?

Warum nicht an die erste Stelle?

von Thomas Leinert (Gast)


Lesenswert?

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.

von Michael_ (Gast)


Lesenswert?

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 Ingo (Gast)


Lesenswert?

Ohmchen schrieb:
> Warum nicht an die erste Stelle?
Das würde mich auch mal interessieren!

von Stephan B. (matrixstorm)


Lesenswert?

Von Atmel gibt es dafuer ein Appnote:

http://www.atmel.com/images/doc2526.pdf

: Bearbeitet durch User
von Michael_ (Gast)


Lesenswert?

In der AVR100 ist das Ganze anhand des Programmcodes sehr gut 
beschrieben.
Natürlich in Assembler :-) .

von Sascha W. (sascha-w)


Lesenswert?

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

von Thomas E. (thomase)


Lesenswert?

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.

von Ohmchen (Gast)


Lesenswert?

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!

von Cyblord -. (cyblord)


Lesenswert?

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

von Michael_ (Gast)


Lesenswert?

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!

von Cyblord -. (cyblord)


Lesenswert?

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
von Kurt B. (kurt-b)


Lesenswert?

Ohmchen schrieb:
> Warum nicht an die erste Stelle?

Weil die manchmal beim Ausschalten/Einschalten zerstört wird (so 
zumindest meine Erinnerung).


 Kurt

von Max H. (hartl192)


Angehängte Dateien:

Lesenswert?

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.

von Michael_ (Gast)


Lesenswert?

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?

von Michael_ (Gast)


Lesenswert?

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 .

von Cyblord -. (cyblord)


Lesenswert?

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.

von Michael_ (Gast)


Lesenswert?

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.

von Cyblord -. (cyblord)


Lesenswert?

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
von Michael_ (Gast)


Lesenswert?

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?

von Bastler (Gast)


Lesenswert?

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.

von Ohmchen (Gast)


Lesenswert?

@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.

von Ohmchen (Gast)


Lesenswert?

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?

von Georg G. (df2au)


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?

Ohmchen schrieb:
> @M.H.
>
> Keine Zenerdiode, ne einfache 1n400x sollte genügen.
> Oder wozu eine Zenerdiode?
Sry. Das sollte eine Schottky Diode sein.

von weihnachtsmann (Gast)


Lesenswert?

Wie viele Taster verwendest Du? 1x Up (heller) und 1x Down (dunkler)?

von Ohmchen (Gast)


Lesenswert?

1 Taster im "Rundlauf"...

von weihnachtsmann (Gast)


Lesenswert?

Ok, was hälst Du von einem 2. Taster für 'Save-Settings'?

von Amateur (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.