Forum: Mikrocontroller und Digitale Elektronik Atmega8 Variablen bei power down in EEPROM speichern


von Daniel (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von DC (Gast)


Lesenswert?

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.

von Reinhard Kern (Gast)


Lesenswert?

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

von Daniel (Gast)


Lesenswert?

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

von avr (Gast)


Lesenswert?

Kennst du die Suchfunktion?

Dann versuch es mal mit: +eeprom +stromausfall

=> 99 Treffer

Viel Spass beim lesen ;)

avr

von Daniel (Gast)


Angehängte Dateien:

Lesenswert?

OK,

müsste das dann in etwa so aussehen?
Wenn der Pin dann auf Low geht muss eine ISR aufgerufen werde.

von Daniel P. (polzi)


Lesenswert?

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

von Daniel (Gast)


Lesenswert?

Im yC Forum habe ich nur 2 Threads gefunden (-;

von Daniel (Gast)


Lesenswert?

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.

von Sebastian R. (sebr)


Lesenswert?


von Daniel (Gast)


Lesenswert?

Werde in Zukunft dieses Hardware technisch berücksichtigen.

Danke für die Hilfe.

von avr (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?


von Ulf R. (roolf)


Lesenswert?

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.

von Ben _. (burning_silicon)


Lesenswert?

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.

von X- R. (x-rocka)


Lesenswert?

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

von Stefan V. (vollmars)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Ben _. (burning_silicon)


Lesenswert?

die dinger gehen ja auch nicht kaputt wie eine glühlampe. das kommt mehr 
einem altern gleich und äußert sich dahingehend, daß die zum 
programmieren nötige zeit ansteigt oder der inhalt früher verloren geht 
als spezifiziert.

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.