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.
@ 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
> Schreizugriff
Freudsche Fehlleistung. Gratulation... ;-)
So wie "Kussverletzung am Schopf" statt "Schussverletzung am Kopf"...
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.
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
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.
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.
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.
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...
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.
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
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.
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 | }
|
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.
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)
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.