Atmega8 Variablen bei power down in EEPROM speichern

Gast #1515265
Hi,

ich habe einen ATmega8 mit Codevision programmiert. Mit ein paar Tastern 
verstelle ich irgendwelche Werte. Um diese ab zu speichern hatte ich 
schon einmal bei einer anderen Schaltung zusätzliche Taster zum 
abspeichern verbaut. Ist mir aber zu lästig auf speichern zu drücken.

Jetzt kommt mir die Idee ob ich nicht über Registerabfrage die Werte 
automatisch in das EEPROM abspeichern kann, wenn die Spannung 
abgeschaltet wird. Ist das evtl. über MCUCSR (BORF) möglich?

Würd mich freuen wenn jemand da ne Idee hat oder mir einen 
Programmausschnitt zeigen kann.


Danke schon einmal im vorraus
Daniel
Gast #1515281
Hi

>Ist das evtl. über MCUCSR (BORF) möglich?

Nein. Du musst deine Versorgungsspannung überwachen und rechtzeitig 
abspeichern. Wie das am besten geht, hängt von deiner Stromversorgung 
ab.

MfG Spess
Gast #1515289
Ich habe das mal so gelöst: ein Elko versorgt den AVR noch einige 
Sekunden mit Strom. Zusätzlich geht die Betriebsspannung vor dem Elko in 
einen Port. Sobald der auf low ist speichert das Programm die Werte ab.
Gast #1515291
Daniel schrieb:
> Jetzt kommt mir die Idee ob ich nicht über Registerabfrage die Werte
> automatisch in das EEPROM abspeichern kann, wenn die Spannung
> abgeschaltet wird. Ist das evtl. über MCUCSR (BORF) möglich?

Hallo Daniel,

so nicht - üblicherweise überwacht man schon die Eingangsspannung des 
Netzteils, um früh genug gewarnt zu werden. Die Warnung löst einen 
Interrupt aus, vorzugsweise nicht maskierbar, und die ISR speichert den 
Zustand ab. Das Netzteil muss dafür lang genug die Spannung halten, das 
ist aber i.d.R. kein Problem, notfalls nimmt man ein paar grössere 
Elkos.

Gruss Reinhard
Gast #1515295
Schade,

dann muss ich also eine externe Beschaltung da dran bauen?

Dann kann ich vermutlich genau so gut einen Taster zum abspeichern 
verbauen.
Bei den letzten Schaltungen hing die yC Schaltung an 12V Auto Akkus. Die 
5V für den Controller habe ich dann über nen 78L05 und einigen 
Kondensatoren, vdr und dioden gemacht.

Gibt es zufällig irgendwo ein Tutorial oder vorhandenen Thread, wo man 
das nachlesen kann?

Daniel
Gast #1515325
Hatte gedacht, dass man das evtl. einfach software technisch hinbekommen 
könnte. Naja anscheinend doch nicht.
Die Werte verstelle ich durch mehrfaches drücken des jeweiligen Tasters. 
Dann müsste ich nach jedem Tastendruck abspeichern. Hatte mir das 
softwaremässig einfach vorgestellt und schonend für das EEPROM.
Gast #1515341
Hallo Daniel,

wieso jedesmal speichern?

z.B. dimmst du eine LED (Tasten + -).

7 x + -> es wird zu hell -> 2 x - -> wieder zu dunkel -> 1 x + -> OK

bei jedem Tastendruck wird ein Zähler auf z.B. 5 Sekunden
gesetzt/zurückgesetzt und erst wenn dieser abgelaufen ist
wird gespeichert.

Einstellung geht nur verloren wenn in diesen 5 Sekunden Nachlaufzeit
die Spannung weggeht.

avr
Gast #1515342
Hi

>Warum speicherst du nicht einfach direkt nach der Eingabe in den EEPROM?

Ist zwar in den letzten Jahren besser geworden, aber EEPROM-Zellen haben 
nur eine begrenzte Anzahl von Schreibzyklen.

>Wenn der Pin dann auf Low geht muss eine ISR aufgerufen werde.

Besser vor IC2 abgreifen. Eine Diode vor die Kondensatoren. Mit einem 
Spannungsteiler die Rohspannung auf den Analogkomperator geben. Der löst 
unterhalb einer bestimmten Spannung den Interrupt zum Speichern aus.

MfG Spess
#1515364
Daniel schrieb:
> Die Werte verstelle ich durch mehrfaches drücken des jeweiligen Tasters.
> Dann müsste ich nach jedem Tastendruck abspeichern. Hatte mir das
> softwaremässig einfach vorgestellt und schonend für das EEPROM.

1. Man könnte zur Schonung des EEPROMs auch N Sekunden nach dem letzten 
Tastendruck schreiben.

2. Manche Taster garantieren weniger Schaltzyklen als ein EEPROM.
#1515492
battery powered cmos ram... ;)

du kannst aber z.b. eine wear leveling funktion bauen, etwa daß du jedem 
datenblock eine nummer zuweist und diese beim speichern (an die nächste 
adresse) immer um eins erhöhst. der µC kann dann beim start das gesamte 
eeprom nach der höchsten nummer absuchen (oder nach dem "bruch" in der 
stetigkeit schauen wenn dieser zähler übergelaufen ist) und den 
zugehörigen datenblock übernehmen. beim speichern wird dann hinter 
diesen aktuellen block geschrieben und wenn man hinten beim eeprom 
angekommen ist fängt man von vorne wieder an.

eine weitere möglichkeit wäre einen externes eeprom z.b. via I2C. wenn 
man dieses irgendwann "geschafft" hat fliegts raus, neues rein und 
weiter gehts.
#1515533
Die Spannungsüberwachung mit dem internen ADC macht Sinn.
Einfach ständig 12V und 5V messen, und ab gewisser Schwelle einmal 
speichern.

Ansonsten: bei Interrupt beachten, dass der ATmega8 nur 2 ext Interrupt 
Eingänge hat! (oder? mir war so...)

X
#1515668
Hi,

also wenn ich mal nachrechne:

100000 Programmierungen nach ATmega8 Datenblatt,
10 Programmierungen je Tag gibt 10000 Tage, das sollte genug sein.
Die Werte werden ja Händisch eingegeben, nicht irgendwie zyklisch.
Wer jetzt sagt: Ich ändere doch öfter als 10 mal am Tag Wert xyz.
Der kann sich ja mal folgendes überlegen:
5 sec pro Wertänderung macht 500000 Sekunden, also fast 6 Tage 
ununterbrochen Tastentippen, das ist echte Fleißarbeit.

Ich denke in den meisten Anwendungen wird die begrenzte Lebensdauer
des EEPROMs keine Rolle spielen. Einfache Maßnahmen, wie verzögertes 
abspeichern, reichen da völlig aus.

BTW: Ich hab mal versucht das Flash eines älteren AVR zu zerschießen, 
der war mit 1000 Prog.Zyklen spezifiziert - ist mir auch nach über 5000 
Zyklen nicht gelungen.

Gruß Stefan
#1515679
Daniel schrieb:

> softwaremässig einfach vorgestellt und schonend für das EEPROM.

Schon mal nachgerechnet, wie lang du ununterbrochen Tasten drücken 
musst, bis du an der garantierten Lebensdauer des EEPROM angelangt bist? 
Und wenn die Garantie abgelaufen ist, bedeutet das noch lange nicht, 
dass das EEPROM sofort ausfällt.

IMHO braucht man sich bei händischen Eingaben in ein Gerät und 
sofortigem Ablegen im EEPROM so gut wie nie Gedanken über die 
Lebensdauer des EEPROM zu machen.

Edit: zu langsam. Stefan hat schon nachgerechnet.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.