Forum: Mikrocontroller und Digitale Elektronik Stromkappung bei Eepromzugriff


von Sam .. (sam1994)


Lesenswert?

Hi

Ich hab mal eine blöde Frage: Was passiert wenn man während dem 
speichern von Daten in den EEprom den Strom kappt. Die Situation ist 
folgende: Ich möchte bei meinem Projekt vor dem auschalten ein paar 
Werte speichern (2 Byte müssten reichen). Die Idee ist folgende: INT0 
Interrupt bei steigender Flanke und mit PullUp. Am Schalter wird der Pin 
nun auf GND gesetzt. Beim auschalten nicht mehr. Nun wird der Interrpt 
ausgelöst und die Stromfressenden Sachen werden sofort ausgeschaltet. 
Dann wird gespeichert und in einer While Schleife gewartet bis der BOD 
reagiert und der µC nicht mehr startet, denn da die Batterie weg ist 
entladen sich die Kondis.

Genutzt wird ein 10µF am µC ein 22µF vorm StepUp und ein 100µF nach dem 
StepUp. Das müsste ja gut reichen, Leds entladen sich ja da auch gut. 
Allerdigns. Es werden 8 8Segment Anzeigen angesteuert. Wenn jetzt was zu 
langsam läuft könnte die Spannung nicht mehr reichen. Die Frage bleibt: 
Was passiert wenn es aus irgendeinem Grund nicht reicht? Dann ist im 
EEprom ja Schrott ( oder kann er ganz geschrottet werden?). Kann man so 
was erkennen? Und dann Standartwerte setzen. Ich kann natürlich für 
unmögliche Werte was einbauen, aber ich möchte nicht das plötzlich die 
Helligkeit von ganz hell auf ganz dunkel wechselt! Lieber auf den 
Standartwert.

PS: Ringpuffer nutze ich nicht und möchte ich auch nicht da nach meinen 
Kalkulationen über 100 Jahre laufen müsste bei 3maliger speicherung 
täglich und gespeichert wird nur wenn der Wert sich geändert hat.

von Falk B. (falk)


Lesenswert?

@  Samuel K. (sam1994)

>Ich hab mal eine blöde Frage: Was passiert wenn man während dem
>speichern von Daten in den EEprom den Strom kappt.

Der Schreizugriff ist undefiniert. Kann gerade noch geklappt haben oder 
auch nicht. Bei einigen (älteren?) uCs werden auch andere EEPROM-Zellen 
mit ungültigen Daten beschrieben, beim AVR war das meist Adresse 0.

>Was passiert wenn es aus irgendeinem Grund nicht reicht? Dann ist im
>EEprom ja Schrott

Zumindest in der einen zelle/Adresse.

> ( oder kann er ganz geschrottet werden?).

Eher nicht.

> Kann man so was erkennen?

Prüfsummen und CRC.


>Helligkeit von ganz hell auf ganz dunkel wechselt! Lieber auf den
>Standartwert.

Standardwert. ;-)

Siehe

http://www.mikrocontroller.net/articles/Speicher#EEPROM_Schreibzugriffe_minimieren

MfG
Falk

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Schreizugriff
Freudsche Fehlleistung. Gratulation... ;-)
So wie "Kussverletzung am Schopf" statt "Schussverletzung am Kopf"...

von Ulrich (Gast)


Lesenswert?

Wenn der Strom beim Schreiben ins EEPROM zu früh wegfällt, kann man eine 
falsch beschriebene Speicherstelle bekommen. Das kann ein gelöschtes 
Byte ( $FF ?) sein, ein nur Teilweise geschriebene Byte oder einfache 
eines das noch nicht ganz so zuverlässig geschrieben ist und ggf. nicht 
so lange hält.
Einen wirklicher Test ist schwierig. Möglich wäre eine Prüfsumme, oder 
das man die Daten 2 mal Schreibt. Man braucht dann aber ein zusätzliches 
Byte.
Wenn im extra Byte schon was drin ist, sollten die anderen Bytes OK 
sein.

Wenn die Daten normalerweise im Betrieb gespeichert werden, könnte man 
das Extra Byte nutzen um einen kompletten Datensatz zu kennzeichnen. Ein 
kuzer Ringpuffer mit 2 Einträgen wäre eventuell gut, damit man als 
Default wert dann den vorherigen hätte.

von Sam .. (sam1994)


Lesenswert?

Na bei mir müsste es ja reichen wenn ich einfach den einen Wert der 
gespeichert wird doppelt speichere und dann abfrage ob sie 
übereinstimmen.

EEProm

Wert a
Wert b

Bei Wert a Änderung
+ Wert a
Bei Wert b Änderung
+ Wert b

Sollte der EEProm nicht mehr funktionieren erhält einfach die 
Leseroutine undefiniertes zurück also wird die Prüfung fehlschlagen und 
jedes mal der Standartwert gesetzt werden, oder?

Ulrich schrieb:
> Wenn die Daten normalerweise im Betrieb gespeichert werden, könnte man
> das Extra Byte nutzen um einen kompletten Datensatz zu kennzeichnen. Ein
> kuzer Ringpuffer mit 2 Einträgen wäre eventuell gut, damit man als
> Default wert dann den vorherigen hätte.

Wie meinst du das?
Gespeichert wird nur wenn man die Stromzufuhr kappt.


Lothar Miller schrieb:
> Freudsche Fehlleistung. Gratulation... ;-)
Beschwer dich bei meiner Tastatur, die sich leichter drücken lassen 
müsste xD

von Alexander S. (esko) Benutzerseite


Lesenswert?

Samuel K. schrieb:
> Genutzt wird ein 10µF am µC ein 22µF vorm StepUp und ein 100µF nach dem
> StepUp. Das müsste ja gut reichen, Leds entladen sich ja da auch gut.
> Allerdigns. Es werden 8 8Segment Anzeigen angesteuert.

Du kannst ja eine Stromausfallerkennung einbauen und dann die Leds und 
alles andere abschalten, das spart Strom.

von Sam .. (sam1994)


Lesenswert?

Alexander Schmidt schrieb:
> Du kannst ja eine Stromausfallerkennung einbauen und dann die Leds und
> alles andere abschalten, das spart Strom.

Nicht so gern. Würde lieber meine Schaltung mal so lassen. Die ist schon 
halb im Gehäuse eingebaut und da ich kein professioneller Gehäusebauer 
bin sind da zig Schrauben... Schon allein das herauspfriemeln und 
reinstecken der Platine mag ich nicht.

Dürfte auch nicht zu lang dauern. Interrupt + SPI 2 Bytes senden dann 
schläft der Max7219. Was die Sache schlechter macht: Der Mega läuft mit 
4.5V. Falls das deswegen schlecht klappen sollte nimm ich ein L-Type.

Mal so ne Frage am Rand: Wie wird eigentlich die letzte Pos. beim 
Ringpuffer gespeichert? Die Frage geht mir irgendwie nicht aus dem Kopf.

von Ralph (Gast)


Lesenswert?

Die Frage ist wie oft ändert sich der Wert den du schreiben willst .

Speicher den Wert doch einfach immer wenn er sich ändert.
So ein EEprom hat bei "Raumtemperatur" in der Regel über 100000 
Schreibzugriffe bis da etwas kaputt geht.

Wenn du also  1 mal pro Minute den Wert schreibst, kommst du an nahezu 
70 Tage ununterbrochene Laufzeit.

Ist es zb die Helligkeitseinstellung die du mit Hand machst, wird sich 
der Wert vielleicht 5 mal am Tag ändern. => gibt 20000 Tage bis zum 
EEProm Ende.


Die andere sicher Lösung ist, das du beim Ausschalten nicht die Batterie 
wegschaltest sondern nur ein Signal zum Ausschalten gibst.
Der µC sichert dann alle Werte.
Wenn alles fertig zum Ausschalten ist, schaltet der µC über einen FET 
oder Relais die Batterie Spannung weg.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Samuel K. schrieb:
> Mal so ne Frage am Rand: Wie wird eigentlich die letzte Pos. beim
> Ringpuffer gespeichert? Die Frage geht mir irgendwie nicht aus dem Kopf.
In einem Pointer.
Aber prinzipiell kommt es darauf an, wie der Ringpuffer aufgebaut ist 
und was der machen soll. Mit entsprechenden Tricks kann die Position 
auch im Puffer selber gespeichert werden...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ralph schrieb:
> Die andere sicher Lösung ist, das du beim Ausschalten nicht die Batterie
> wegschaltest sondern nur ein Signal zum Ausschalten gibst.
Diese Lösung ist implizit unsicher, denn es könnte ja auch jemand 
einfach die Batterie abklemmen oder den Strom abschalten (zur Not an der 
Hauptsicherung oder mit einem Bagger)...  :-o
Diesen Worst-Case sollte man bei einem "Herunterfahren" immer im 
Hinterkopf behalten. Auch dein Windows-Rechner kann Probleme bekommen, 
wenn du einfach den Stecker aus der Dose ziehst.

von Thomas (Gast)


Lesenswert?

Du must Deine Stromversorgung durch z.B. Kondensatoren so auslegen, dass 
Du nach der Power down Erkennung im ungünstigsten Fall die zwei 
Schreibzyclen auf Dein EEPROM noch hin bekommst (siehe Datenblatt). So 
lange muss die Versorgungsspannung am uC und EEPROM innerhalb der 
Spezifikation sein. Ich benutze für das Speichern sensibeler Daten eine 
dreifach Redundanz. So kann ich nach Systemstart eine einfache 
Plausibilitätskontrolle durchführen und habe im Fehlerfall ein Chance, 
den Wert zu restaurieren.
Gruss

von Sam .. (sam1994)


Lesenswert?

Speichern bei Änderung ist schlecht, da wenn man mit der Helligkeit ein 
bisschen rumexperimentiert der EEprom unnötig beschrieben wird. Es wird 
auch kein Logger, sondern die Schachhur in der Codesammlung. Ich werde 
das einfach mal ausprobieren. Den Ringpuffer mach ich vielleicht doch, 
denn ich möchte das der EEProm auch Jahrzehnte hält.

von Sam .. (sam1994)


Lesenswert?

Ich speicher jetzt alles doppelt. allerdings ist im EEprom es nur 
einfach gespeichert. Entweder der Strom reicht genau für die ersten zwei 
oder der Compiliert omptimiert es weg weil es das gleiche ist. Übrigens 
ich hatte noch nie eine kaputte Zahl. Entweder sie war geschrieben oder 
0xFF was alles standardmäßig ist.

EDIT: Jedesmal wird der Standardwert gesetzt, da die Kopie nicht 
geschrieben wird.

Weiß jmd was ich falsch mache?
1
ISR(INT0_vect)
2
{
3
    //Wenn in diese Routine gesprungen wird bleibt wenig Zeit da die Stromzufuhr gekappt worden ist.
4
    //Die Kondesatoren müssten jedoch genügend Strom für liefern um die Helligkeit und den Spielmodi zu speichern
5
    //Erst mal Display ausschalten
6
    SetMode(MAX_MODE_SLEEP);
7
    uint8_t saving_intensity = Intensity / (F_CPU / 800000);
8
    uint8_t ee_saved = 0x00;
9
    if(eeprom_read_byte(&ee_intensity) != saving_intensity)
10
    {
11
        eeprom_write_byte(&ee_intensity,saving_intensity);
12
        ee_saved |= 0x01;
13
    }
14
    if(eeprom_read_byte(&ee_game_mode) != game_mode)
15
    {
16
        eeprom_write_byte(&ee_game_mode, game_mode);
17
        ee_saved |= 0x02;
18
    }
19
    //Zur Sicherheit doppelt schreiben
20
    if(ee_saved & 0x01)
21
        eeprom_write_byte(&ee_save_intensity,saving_intensity);
22
    if(ee_saved & 0x02)
23
        eeprom_write_byte(&ee_save_game_mode, game_mode);
24
    
25
    while(1)
26
         asm volatile("nop");
27
}

von Sam .. (sam1994)


Lesenswert?

Mein Code stimmt. Die 100µF haben nicht gereicht. Der EEprom ist 
verdammt langsam!!!!! Ich denke man kann von 500µF pro Byte zum 
speichern ausgehen. Ich habe jetzt 600µf und es speichert immer ein 
byte. Das andere wird nicht mal verschossen. Den EEprom kann man echt 
vergessen!

PS: Weiß jemand wie man ausrechnet wie lange die Spannung auf 4V 
gehalten wird wenn sie auf 4.5V war mit 500µF? Wie man mit Farad erchnet 
ist mir nicht bekannt.

von U.R. Schmitt (Gast)


Lesenswert?

Samuel K. schrieb:
> PS: Weiß jemand wie man ausrechnet wie lange die Spannung auf 4V
> gehalten wird wenn sie auf 4.5V war mit 500µF? Wie man mit Farad erchnet
> ist mir nicht bekannt.
>
An einer Kapazität von einem Farad sinkt die Spannung um ein Volt wenn 1 
Sekunde 1A gezogen wird.
oder deltaU = (I*t)/C  (für konstantes I was nur annäherungsweise für 
kleine deltaU stimmt)

von Sam .. (sam1994)


Lesenswert?

Das heißt .5 = .02 * t /  C
.5  C  5 = t
2.5C = t
0.0005 = t also .5tausendstel sekunden bei 20mA Verbrauch. Der Avr 
braucht aber doch deutlich weniger. Bei 1mA wären es schon 1/100 
Sekunde.

Ich habe jetzt einen 1.5mF vor die BAtterie geschalten und jetzt klappt 
es gut.

von Sascha W. (sascha_w)


Lesenswert?

Samuel K. schrieb:
> Speichern bei Änderung ist schlecht, da wenn man mit der Helligkeit ein
> bisschen rumexperimentiert der EEprom unnötig beschrieben wird.

Dann warte nach der letzten Änderung sagen wir mal eine Minute und 
speicher den Wert erst dann. Damit kannst du an der Helligkeit 
rumspielen und hast trotzdem nicht dauernd Schreibzugriffe.

Sascha

von Simon K. (simon) Benutzerseite


Lesenswert?

Sascha Weber schrieb:
> Samuel K. schrieb:
>> Speichern bei Änderung ist schlecht, da wenn man mit der Helligkeit ein
>> bisschen rumexperimentiert der EEprom unnötig beschrieben wird.
>
> Dann warte nach der letzten Änderung sagen wir mal eine Minute und
> speicher den Wert erst dann. Damit kannst du an der Helligkeit
> rumspielen und hast trotzdem nicht dauernd Schreibzugriffe.

Und das wäre dann die "professionelle" Methode.

@Samuel: Oder meinst du in jedem iPod oder Handy steckt ein 1.5mF 
Kondensator drin? ;-)
Rechne einfach mal aus, wie lange der EEPROM hält, wenn du worst case 
jede Minute den Wert änderst... So ein EEPROM hält schon verdammt lange. 
Ich weiß nicht, warum man das "EEPROM vergessen kann". Das ist ne 
geniale Sache.

von Sam .. (sam1994)


Lesenswert?

Simon K. schrieb:
> @Samuel: Oder meinst du in jedem iPod oder Handy steckt ein 1.5mF
> Kondensator drin? ;-)

Ne aber nen Speicher der deutlich schneller ist.
Und 2. ist ein iPod oder Handy nie aus, sondern nur im Sleep Mode. ODer 
läuft auf Stromsparmodus. Außerdem ist der nicht groß, da er nur für 10V 
gedacht ist.

Das mit der Minute ist eine tolle idee - Aber was ist wenn man plötzlich 
aufhört und die Minute ist noch nicht rum. Ich lasse jetzt die Schaltung 
so. Aber in V2 des Projekt werde ich nochmals darüber nachdenken.

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.