Forum: Mikrocontroller und Digitale Elektronik Bei Stromausfall Daten in den EEPROM, um


von Sercan S. (disaster35)


Angehängte Dateien:

Lesenswert?

Hallo an alle :)

nach viele Recherche brauche ich mal euren Rat und freue mich auf jede 
Hilfestellung und Tipps :)

Es geht wie Ihr im Titel sehen könnt darum Daten in den EEPROM zu 
schreiben. Warum es bei Stromausfall passieren sollte, kann man sich ja 
mit den begrenzten Anzahl von Schreibzyklen (in meinem Fall Atmega: 
mind. 100.000 Schreibzyklen) bei den EEPROM Speicher denken. Da ich 
ansonsten pro Wertänderung speichern müsste und es täglich 15-20 * 200 = 
4000 Wertänderungen gibt, wäre mein EEPROM nach c.a. 2 Monaten hinüber.

Ich habe erst folgendes durchgelesen: 
https://www.mikrocontroller.net/articles/Speicher#EEPROM_Schreibzugriffe_minimieren

und dort die Schaltung auch eins zu eins übernommen, nur halt mit einem 
größeren Kondensator.

Auf der Tabelle im folgenden Link kann ich ablesen, dass der ATMega8 2,3 
mA Strom benötigt, bei 1MHz und möglichst alle Komponente sind aktiv: 
https://www.mikrocontroller.net/articles/Leistungsaufnahme_von_Mikrocontrollern

Nun wusste ich nicht wie ich die Leistungsaufnahme bei 8 MHz aus der 
Tabelle errechnen kann obwohl im Link steht, dass es nun leicht zu 
berechnen wäre :D

Daher bin ich nun vom maximal möglicher Stromaufnahme des ATMega8's 
(200mA) ausgegangen. Im Datenblatt wird ersichtlich, dass das schreiben 
auf die EEPROM 8,5ms pro Byte dauert.

Ich muss bei einem Stromausfall 26 Bytes schreiben (Dauer 26 * 9ms = 
234ms)

Nun kann ich ja den Kondensator ausrechnen, der beim Stromausfall die 
Zeit überbrücken soll, wo es am external Interruptpin (PD2) erkannt und 
die Daten ins EEPROM gespeichert werden sollen.

Man solle laut obigem Link bei der Dauer das Vielfache nehmen, daher 
nehme ich 1 Sekunde = 1000ms.:
200mA * 1000ms / 2V (max. erlaubte Spannungsabfall) = 100.000 uF (0,1 F)

Da ich vom sichersten ausgehen wollte :D
Werde ich mir morgen nun eins mit 0.22F kaufen 
(https://www.conrad.de/de/gold-cap-kondensator-022-f-55-v-30-x-h-105-mm-x-5-mm-panasonic-eecs0hd224v-1-st-422085.html).

Nun ist die Frage, sind die 200mA völlig überdimensioniert (mein erster 
Gedanke: Aufjedenfall! da laut Tabelle bei "Volllast" mit 1 MHz nur 
2,3mA Stromverbrauch steht)?
Der ATMega8 kommuniziert über UART, SPI. Hat als Eingang
3 Taster, einen Sensor und 2 Transistoren werden als Schalter verwendet.
Bei den 2 Transistoren kommen am Basis jeweils 4K7 sprich, da würde man 
pro Transistor ≈ 1mA Strom verbrauchen (wobei diese nur sehr selten 
verwendet werden). Zudem wäre noch zu berücksichtigen, dass es mit dem 
internen 8MHz Oszillator betrieben wird. Von wie viel Strom kann ich da 
bei der obigen Kondensatorberechnung ausgehen, wenn ich den uC nach dem 
externen Interrupt bei Stromausfall c.a. 1 Sekunde am Leben erhalten 
möchte?


Zudem wäre ich Froh, wenn jemand mir sagen könnte ob folgender Code mit 
dem obigen Beispiel klappen würde:
1
int main(void)
2
{
3
     GICR |= (1 << INT1);                // INT1 auf PD3 aktivieren
4
5
     // ISC11 = 1, ISC10 = 0, so gibt es doch bei fallender Flanke
6
     // ein Interrupt oder? Ich soll laut Beispiel bei fallender Flanke
7
     // ein externen Interrupt bekommen. Wäre dies also richtig?:
8
     MCUCR &= ~(1 << ISC10);              
9
     MCUCR |= (1 << ISC11)              
10
11
     sei();                             
12
     while(1);                            
13
     return 0;                   
14
}
15
16
 ISR(INT1_vect)                            
17
{
18
     //Hier schreibe ich einfach das in den EEPROM Speicher, was ich              
19
     //nach dem Stromausfall für den weiteren Betrieb benötige.
20
     //Beispiel schreiben:
21
     eeprom_write_byte(&wichtigesByte,90);
22
     
23
     //Lesen
24
     uint8_t meinByte = eeprom_read_byte(&wichtigesByte);
25
     //meinByte wäre dann 90?
26
27
28
}

Ich bedanke mich schon mal im Voraus =)

: Bearbeitet durch User
von Manfred (Gast)


Lesenswert?

Sercan S. schrieb:
> und dort die Schaltung auch eins zu eins übernommen

hast du aber nicht.
R1, R2 und D1 haben so keinen Sinn. Der Goldcap stellt für deinen 
Spannungsregler wegen der großen Kapazität beim Einschalten einen satten 
Kurzschluss dar.
Die folgende Variante finde ich viel besser.
https://www.mikrocontroller.net/wikifiles/0/02/Battery-backup.png

von Horst (Gast)


Lesenswert?

Manfred schrieb:
> Der Goldcap stellt für deinen
> Spannungsregler wegen der großen Kapazität beim Einschalten einen satten
> Kurzschluss dar.

Nein, der sieht keine Spannung.
Der Kurzschluss ist der Draht über R1.

Faszinieren, daß sich jemand Gedanken über Kondensatorentladekurven 
macht und nichtmal in der Lage ist, einen satten Kurzschluß in seinem 
Schaltungsentwurf zu erkennen.

von Michael H. (mueckerich)


Lesenswert?

Horst schrieb:
> Nein, der sieht keine Spannung.
> Der Kurzschluss ist der Draht über R1

Der sieht sehr wohl eine (genau genommen 5V) Spannung, weil D1 sperrt 
und kein Strom (Leckströme ausgenomen) über den "Kurzschluss" und R1 
fließt. Alles in allem ist die Schaltung fehlerhaft.

: Bearbeitet durch User
von Wolfgang A. (Gast)


Lesenswert?

Manfred schrieb:
> Die folgende Variante finde ich viel besser.
> https://www.mikrocontroller.net/wikifiles/0/02/Battery-backup.png

Dann muss man den µC und alles was dran hängt in einen ausreichend 
tiefen Dornröschenschlaf versetzten (können), damit die einem nicht 
innerhalb kurzer Zeit die Batterie leer nuckeln oder man braucht einen 
zusätzlichen Schalter, mit dem der µC die Batterie abtrennt, nachdem die 
Daten gesichert sind.

von 6a66 (Gast)


Lesenswert?

Sercan S. schrieb:
> Daher bin ich nun vom maximal möglicher Stromaufnahme des ATMega8's
> (200mA) ausgegangen. Im Datenblatt wird ersichtlich, dass das schreiben
> auf die EEPROM 8,5ms pro Byte dauert.

Wenn Dein EEPROM einen PageWrite hat kannst Du 16Byte in 5ms (oder so) 
schreiben, dann brauchts Du für Deine 40 Byte (wenn richtig abgelegt, 
siehe Page Boundary) etwa 20ms. Wenn Du annimmst, dass du mit einem Tau 
(siehe RC Glied) von etwa 50ms fertig wirst (Achtung: bis zu welcher 
Spannung geht der Prozessor, hier ist Tau evtl. neu zu berechnen) 
brauchst Du bei 200mA (entspricht bei 5V 25R) etwa 2200uF.
Das kommt Dir entgegen da solche Kondensatoren auch vernünftig in eine 
Stromversorgung intgrierbar sind, der Goldcap wird Dir wahrscheinlich 
niemals 200mA zur Verfügung stellen. Sollte die Stromaufnahme geringer 
sein kommst Du auch mit kleineren Kondensatoren zurecht.
Wichtig dabei ist, den Stromausfall SCHNELL zu detektieren, am besten 
über einen Spannungsüberwachungsbaustein der schon bei z.B. 4,5V 
anspricht. Auch wichtig ist, dass Du die Spannungsversorgung des 
Prozessors vom Rest entkoppelst sonst lutscht Dir das Restsystem den 
Elko genauso leer (also über Diode entkoppeln).

rgds

von Stefan (Gast)


Lesenswert?

Hatte gleiches Problem bei einer Versuchsteuerung von mir:
Gelöst und funktioniert einwandfrei..
+5V über Diode an 560-1000µF, wird nur zur µC Versorgung verwendet.
Die 5V vor der Diode über Spannungsteiler an Analogeingang, so dass im 
Normalfall etwa 4V anliegen. Den Analogpin frage ich zyklisch im Loop 
ab, fällt diese unter 4V, springe ich in eine Funktion in welcher ich 
meine wichtigen Daten (Betriebsstd und geänderte Parameter)  schreibe.

von 6a66 (Gast)


Lesenswert?

Stefan schrieb:
> Den Analogpin frage ich zyklisch im Loop
> ab

Das ist EINE mögliche Variante.
Andere: Timerinterrupt und ADC abfragen
Andere: Spannungsüberwachungsbaustein und Interrupt
...

rgds

von TMK (Gast)


Lesenswert?

Wenn Du beim Stromausfall nur 26 Bytes schreiben musst, was spricht 
eigentlich dagegen, die nicht immer in dieselben Speicherzellen zu 
schreiben?
Einfach die Adresse hochzählen, Lesen nach dem Wiedereinschalten braucht 
dann ein wenig mehr Intelligenz, aber die Werte sollten sich finden 
lassen, wenn "oberhalb" nur Nullen oder 'FF' steht.
Dann kannst Du dir die ganze "Stromerhaltelogik" sparen, du schreibst 
eben 4000 mal pro Tag. Vermutlich hält das EEPROM dann viel länger, als 
das Gerät lebt.

von Pandur S. (jetztnicht)


Lesenswert?

Ein einfacher Ansatz, falls man ein internes Schaltnetzteil, zB von 12 
auf 5V oder 3.3V verwendet, ist den Stuetzkondenser auf der hoeheren 
Spannung laufen zu lassen.
Ich wuerde nicht den ADC mitlaufen lassen, sondern einen einfachen 
lowpower Komparator. Es gibt welche die Laufen mit sub-uA. Damit auf 
einen Interrupt. Und im Interrupt wird alles deaktiviert, dh in einen 
sicheren Zustand geschaltet und gesichert.

von Sercan S. (disaster35)


Angehängte Dateien:

Lesenswert?

Die Schaltung, was ich gezeichnet habe war über Nacht, daher habe ich da 
wahrscheinlich bisschen mistgebaut und ich muss zugeben, dass ich auch 
nicht die besten Kenntnisse besitze.

Sieht die Schaltung nun richtig aus ? =)


TMK schrieb:
> Wenn Du beim Stromausfall nur 26 Bytes schreiben musst, was spricht
> eigentlich dagegen, die nicht immer in dieselben Speicherzellen zu
> schreiben?
> Einfach die Adresse hochzählen, Lesen nach dem Wiedereinschalten braucht
> dann ein wenig mehr Intelligenz, aber die Werte sollten sich finden
> lassen, wenn "oberhalb" nur Nullen oder 'FF' steht.
> Dann kannst Du dir die ganze "Stromerhaltelogik" sparen, du schreibst
> eben 4000 mal pro Tag. Vermutlich hält das EEPROM dann viel länger, als
> das Gerät lebt.

Ja bei 4000 Eintragungen und 100.000 möglichen Schreibvorgängen würde es 
25 Tage (mindestens halten)
Bei 512Bytes / (26 Bytes + 2 Byte für Logik um die Bytes wiederzufinden) 
≈ 18

18 * 25 Tage = 450 Tage (mindestens). Naja 450 Tage sind nicht wenig, 
aber wieso soll ich es auf die o.g. Tage beschränken wenn ich die 
Möglichkeit habe, es wirklich länger erhalten zu lassen als das Gerät 
lebt? Wenn ich von einem Stromausfall pro Woche ausgehe, würde der 
EEPROM mindestens 100.000 Wochen ≈ 1923 Jahre, also sogar länger als ich 
halten :D

@alle anderen: Ich danke euch, dass Ihr die Zeit genommen habt. Aber 
warum wird hier etwas kritisiert, was als "Tutorial" im Forum 
eingetragen wurde und es auch langer Zeit dort drin steht, wieso sollte 
etwas nichtfunktionierendes drinstehen? Ach und ich die Baterrievariante 
möchte ich ungerne verwenden, also bitte diesbezüglich keine Vorschläge.

von Joachim B. (jar)


Lesenswert?

In die AVCC würde ich die gleiche Diode legen, VCC und AVCC dürfen 
vielleicht unterschiedlich sein, sollten es aber nicht um typisch 0,7V 
sein finde ich.

An VCC und auch AVCC gehört mind. ein 100nF, ich nehme nun gerne 220nF 
oder 470nV ker.

In die AVCC Zuleitung gehört optimal noch ein L

https://www.mikrocontroller.net/wikifiles/9/9e/Adc_connection.png

Sollte es beim Goldcap bleiben muss der zur 5V einen Rv bekommen, aber 
ich denke eher nicht an Goldcap -> Uhrbatterie wenig Strom sondern eher 
an Supercap oder normale AL Elkos -> mehr Strom.

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


Lesenswert?

Sercan S. schrieb:
> Aber warum wird hier etwas kritisiert, was als "Tutorial" im Forum
> eingetragen wurde und es auch langer Zeit dort drin steht, wieso sollte
> etwas nichtfunktionierendes drinstehen?
Dein Kondensator ist kein 10µF Kondensator...

Wenn du schon unbedingt so eine Sekunden-USV bauen willst, dann mach es 
so:
1
  +5V ----o------>|----o--- µC
2
          |            |
3
         100R          | 
4
          |            |
5
          o------>|----'
6
          |+     2x Schottky
7
         === Goldcap
8
          |
9
  GND ----o----------------
Damit wird der Pufferkondensator langsam geladen und schließt nicht dein 
Netzteil kurz.

Aber ich würde auch die Variante nehmen, bei der sofort gespeichert und 
der Speicher zyklisch durchlaufen wird. Denn das EEPROM hast du sowieso 
bezahlt, den Kondensator musst du erst noch kaufen. Und zudem verliert 
der im Laufe der Zeit Kapazität...

: Bearbeitet durch Moderator
von Sercan S. (disaster35)


Lesenswert?

Lothar M. schrieb:

> Wenn du schon unbedingt so eine Sekunden-USV bauen willst, dann mach es
> so:
>
1
>   +5V ----o------>|----o--- µC
2
>           |            |
3
>          100R          |
4
>           |            |
5
>           o------>|----'
6
>           |+     2x Schottky
7
>          === Goldcap
8
>           |
9
>   GND ----o----------------
10
>


Danke :)
Wo genau muss ich bei deiner Schaltung dann an den PD3 des ATMega, also 
wegen Interrupt? Sollen es 100R oder 100K sein? Verstehe ich das 
richtig, dass ich 2x 1N4148 hintereinander schalten muss? :hmm:

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Sercan S. schrieb:
> Daher bin ich nun vom maximal möglicher Stromaufnahme des ATMega8's
> (200mA) ausgegangen.

Das ist schon mal Quatsch.

Erstens hast du typische Daten auch im Datenblatt, zweitens kannst
du einigermaßen von einem linearen Zusammenhang mit der Taktfrequenz
ausgehen.  Weiterhing könntest du noch statt eines ATmega8 einen
seiner Nachfolger benutzen, da kannst du für diesen Fall dann die
CPU wieder auf 1 MHz herunter takten (zur Laufzeit umschaltbar,
anders als bei ATmega8.  Schließlich und endlich kannst du auch die
CPU während des Schreibens schlafen legen, denn sie wartet sowieso
nur, bis der EEPROM fertig ist.

von Sercan S. (disaster35)


Lesenswert?

Jörg W. schrieb:
> Sercan S. schrieb:
>> Daher bin ich nun vom maximal möglicher Stromaufnahme des ATMega8's
>> (200mA) ausgegangen.
>
> Das ist schon mal Quatsch.
>
> Erstens hast du typische Daten auch im Datenblatt, zweitens kannst
> du einigermaßen von einem linearen Zusammenhang mit der Taktfrequenz
> ausgehen.  Weiterhing könntest du noch statt eines ATmega8 einen
> seiner Nachfolger benutzen, da kannst du für diesen Fall dann die
> CPU wieder auf 1 MHz herunter takten (zur Laufzeit umschaltbar,
> anders als bei ATmega8.  Schließlich und endlich kannst du auch die
> CPU während des Schreibens schlafen legen, denn sie wartet sowieso
> nur, bis der EEPROM fertig ist.

Super Sache :)
Also ich könnte dann den Power Down mode aktivieren wo nur noch die ext. 
Interrupts, TWI und Watch Dog läuft?
Im Datenblatt des ATMega8 steht, dass es beim Power-down 0,5 uA Strom 
zieht. Ich denke mal es bezieht sich hierbei auf die von 
Werkeingestellten 1 MHz?
Laut deiner Aussage, kann man von einem linearen Zusammenhang des 
Stromverbrauchs mit der Taktfrequenz ausgehen und somit wären das quasi:
8* 0,5uA = 4uA

Somit
0,004 mA * 1000ms / 2V (Abfall) = 2uF

wenn es in den Interrupt geht, muss ich ja nur den ATMega8 in den Power 
Down Modus versetzen und die Daten speichern, und beim RESET kommt es ja 
so oder so davon raus.


Stimmt das alles soweit?

von Falk B. (falk)


Lesenswert?

@ Sercan Savran (disaster35)

>> CPU während des Schreibens schlafen legen, denn sie wartet sowieso
>> nur, bis der EEPROM fertig ist.

>Super Sache :)
>Also ich könnte dann den Power Down mode aktivieren wo nur noch die ext.
>Interrupts, TWI und Watch Dog läuft?

Theoretisch ja, aber man muss es ja nicht übertreiben! Idle reicht, 
siehe [Sleep Mode]]. Außerdem weiß ich nicht, ob der EEPROM 
Schreibvorgang im Power Down Mode funktioniert. Kann sein, muss nicht.

>Im Datenblatt des ATMega8 steht, dass es beim Power-down 0,5 uA Strom
>zieht. Ich denke mal es bezieht sich hierbei auf die von
>Werkeingestellten 1 MHz?

Das ist egal, denn bei Power Down sind alle Takte aus.

>Laut deiner Aussage, kann man von einem linearen Zusammenhang des
>Stromverbrauchs mit der Taktfrequenz ausgehen und somit wären das quasi:
>8* 0,5uA = 4uA

Ohje, du bist ein Künstler. Der lineare Zusammenhang gilt für den 
aktiven Modus ohne Sleep Mode.

>0,004 mA * 1000ms / 2V (Abfall) = 2uF

Falch. Denn der EEPROM Schreibvorgang braucht relativ viel Strom, eher 
1-2mA.

>wenn es in den Interrupt geht, muss ich ja nur den ATMega8 in den Power
>Down Modus versetzen und die Daten speichern, und beim RESET kommt es ja
>so oder so davon raus.

Du musst aber bei mehreren Datenbytes mehrfach wieder aufwachen und den 
Schreibvorgang neu starten. Da darf es zwischendrinn keinen Reset geben.

>Stimmt das alles soweit?

Nein.

von PittyJ (Gast)


Lesenswert?

Mal ein anderer Gedanke:
ein SPI-Flash mit 4 Mbyte kostet 1,60 Euro. Warum nicht einfach 
anschliessen und immer ans Ende Schreiben. Bei 26 Bytes könnte man 
150000 Elemente Speichern.
Speichert man alle 10 Minuten, dann reicht das für 1000 Tage.
Und man hat eine schöne History zum Auswerten.

von Sercan S. (disaster35)


Lesenswert?

Falk B. schrieb:

> Falch. Denn der EEPROM Schreibvorgang braucht relativ viel Strom, eher
> 1-2mA.
Also bei Idle Mode steht bei Stromverbrauch 1mA. Soll ich dann da 
einfach von 3 mA ausgehen?
3 mA * 1000s / 2V = 1500 uF


> Du musst aber bei mehreren Datenbytes mehrfach wieder aufwachen und den
> Schreibvorgang neu starten. Da darf es zwischendrinn keinen Reset geben.
Wie stelle ich mir das vor?
1
set_sleep_mode(SLEEP_MODE_IDLE)
2
sleep_mode();
3
for(int i = 0; i <26; i++){
4
    eeprom_write_byte(&wichtigesByte,90);
5
    sleep_mode();
6
}

Ungefähr so? Verstehe die Aussage nicht so ganz. Ich dachte ich müsste 
eher so vorgehen:
1
set_sleep_mode(SLEEP_MODE_IDLE)
2
sleep_mode();
3
for(int i = 0; i <26; i++){
4
    eeprom_write_byte(&wichtigesByte,90);
5
}


>>Stimmt das alles soweit?
>
> Nein.

Das hättest du dir echt sparen können :D

von Falk B. (falk)


Lesenswert?

@Sercan Savran (disaster35)

>> Falch. Denn der EEPROM Schreibvorgang braucht relativ viel Strom, eher
>> 1-2mA.
>Also bei Idle Mode steht bei Stromverbrauch 1mA. Soll ich dann da
>einfach von 3 mA ausgehen?

Da muss man nochmal ins Datenblatt schauen, ob es eine genauere Zahl 
gibt. Oder messen. Meine 2mA kommen von den normalen EEPROMs, die 
brauchen etwa soviel.

>3 mA * 1000s / 2V = 1500 uF

Sieht schon anders aus ;-)

>set_sleep_mode(SLEEP_MODE_IDLE)
>sleep_mode();

Hier noch nicht! Wer soll denn die CPU wieder wecken? Das kann nur ein 
Interrupt!

>for(int i = 0; i <26; i++){
>    eeprom_write_byte(&wichtigesByte,90);
>    sleep_mode();
>}

Ja, so geht das, WENN man voher noch denn passenden Interrupt freigibt 
und eine ISR definiert.

>Ungefähr so? Verstehe die Aussage nicht so ganz. Ich dachte ich müsste
>eher so vorgehen:

>set_sleep_mode(SLEEP_MODE_IDLE)
>sleep_mode();
>for(int i = 0; i <26; i++){
>    eeprom_write_byte(&wichtigesByte,90);
>}

Nö.

Beim EEPROM muss man noch ein wenig mit der Interruptfreigabe aufpassen, 
denn der Interrupt wird statisch generiert, sobalt der 
EEPROM-Schreibzugriff beendet ist. D.h. man muss den EEPROM Interrupt in 
jedem ISR-Aufruf sperren und nach dem Schreiben des nächsten Bytes 
wieder aktivieren. Etwas so.


[c]
set_sleep_mode(SLEEP_MODE_IDLE);
sei();

for(int i = 0; i <26; i++){
    eeprom_write_byte(&wichtigesByte,90);
    // EEPROM Interrupt freigeben
    sleep_mode();
}

ISR(EE_READY_vect) {
   // EEPROM Interrupt sperren
}
[c]

von ozvald (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Sercan,

hier ist meine Lösung wie ich einen Stromausfall detektiere. Der 
Kollektor vom Optokoppler geht auf den externen Interrupt Pin mit 
aktivierten Pullup. Es wird alle 10ms ein Interrupt generiert. In der 
Interrupt Routine selbst resetiere ich den Watchdog. Bleibt der 
Interrupt aus, dann wird der Watchdog aktiv und speichere ich die Werte 
ins EEPROM.

von Sercan S. (disaster35)


Lesenswert?

Falk B. schrieb:

> wieder aktivieren. Etwas so.
>
>
> [c]
> set_sleep_mode(SLEEP_MODE_IDLE);
> sei();
>
> for(int i = 0; i <26; i++){
>     eeprom_write_byte(&wichtigesByte,90);
>     // EEPROM Interrupt freigeben
>     sleep_mode();
> }
>
> ISR(EE_READY_vect) {
>    // EEPROM Interrupt sperren
> }
> [c]

Also EE_READY_vect ist ein Interrupt, der ständig Auftritt, wenn in den 
EEPROM geschrieben wird (jetzt komme ich gar nicht mehr klar :D)?

Warum genau muss ich diese dort sperren um nach dem Schreiben wieder 
freizugeben?

Ist es nicht so, dass wenn ich mit eeprom_write_byte(&wichtigesByte, 
90); die Bytes nacheinander schreibe, dass es erst geschrieben wird und 
dann die nächste Zeile anfängt oder übernimmt das für mich ein anderer 
Register und ich teile dem mit eeprom_write_byte nur mit, dass er es in 
den eeprom schreiben?
Muss ich es deswegen so aufwendig Sperren und wieder freigeben?

Du meintest noch dass ich aus dem Schlafmodus mit einem Interrupt 
rauskommen muss: Da ich ja nur bei Stromausfall schreibe, ist es dann 
doch egal oder etwa nicht? Ich verstehe das immer noch nicht ganz.

von Falk B. (falk)


Lesenswert?

@ Sercan Savran (disaster35)

>Also EE_READY_vect ist ein Interrupt, der ständig Auftritt, wenn in den
>EEPROM geschrieben wird

Nö, wenn das Bit EEPE im Register EECR wieder aus 0 geht. Also wenn ein 
Schreibzugriff beendet wurde.

>Warum genau muss ich diese dort sperren um nach dem Schreiben wieder
>freizugeben?

Lies das Datenblat und denk drüber nach. Abschnitt AVR Memories.

>Ist es nicht so,

Bist du Anwalt?

> dass wenn ich mit eeprom_write_byte(&wichtigesByte,
>90); die Bytes nacheinander schreibe, dass es erst geschrieben wird und
>dann die nächste Zeile anfängt

Nö, dann wäre ja der Sleep Mode sinnlos.

> oder übernimmt das für mich ein anderer
>Register und ich teile dem mit eeprom_write_byte nur mit, dass er es in
>den eeprom schreiben?

Keine Ahnung, ich kenn DIESE Funktion ja nicht.

>Muss ich es deswegen so aufwendig Sperren und wieder freigeben?

Nein, wegen der Logik hinter diesem Interrupt.

>Du meintest noch dass ich aus dem Schlafmodus mit einem Interrupt
>rauskommen muss:

Ja.

> Da ich ja nur bei Stromausfall schreibe, ist es dann
>doch egal oder etwa nicht? Ich verstehe das immer noch nicht ganz.

Der Ansatz war, mittels Sleep Mode während des EEPROM-Schreibens 
Strom zu sparen. Denn sonst muss die CPU nur sinnlos warten und Strom 
verbrauchen, ohne etwas sinnvolles tun zu können. Erst wenn alle deine 
26 Bytes geschrieben wurden und die CPU 26 mal eingeschlafen und wieder 
aufgewacht ist, geht sie endgültig schlafen, denn die Spannung wird bald 
komplett ausfallen. Danach kommt sie erst wieder per Power ON reset 
hoch.

von michael_ (Gast)


Lesenswert?

Ich verstehe das ganze Konzept nicht.
Der Prozessor hat doch genug RAM.
Also mit einer Li-Zelle puffern und den Prozessor in einen 
Stromsparmodus schicken.

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


Lesenswert?

ozvald schrieb:
> Der Kollektor vom Optokoppler
Der Optokoppler ist hier "Perlen vor die Säue geworfen". Einen OK nimmt 
man nur, wenn man links und rechts unterschiedliche Potentiale hat. 
Diese Schaltung kann man auch ohne Optokoppler mit einer LED und einem 
Transistor bauen.

Oder einfach nur wie gehabt mit einem Spannungsteiler...

: Bearbeitet durch Moderator
von Ozvald (Gast)


Lesenswert?

@ Lothar Miller

...oder wenn man die Schaltung vorher mit Transistor aufbaut und der 
Prozessor extrem anfällig auf externe Störimpulse reagiert --> 
blockiert.
Selbst mit RC-Filter vor dem Trafo konnte ich die Störimpulse nicht 
wegfiltern. Es hat gereicht wenn ich eine Tischlampe daneben 
ein/ausgeschaltet habe. Nachdem der Optokoppler eingesetzt war, hat sich 
der Prozessor nicht mehr aufgehängt, und als angenehmer Nebeneffekt die 
Impulse am Kollektor waren auch eckiger (schöner).

von Joachim B. (jar)


Lesenswert?

Lothar M. schrieb:
> ozvald schrieb:
>> Der Kollektor vom Optokoppler
> Der Optokoppler ist hier "Perlen vor die Säue geworfen". Einen OK nimmt
> man nur, wenn man links und rechts unterschiedliche Potentiale hat.

hat ozwald doch! AC mit Brücke und er dedektiert die AC und sieht eher 
einen Halbwellenausfall als eine abgesunkene DC aus einem Netzteil!

Sercan S. schrieb:
> Ich muss bei einem Stromausfall 26 Bytes schreiben (Dauer 26 * 9ms =
> 234ms)

der TO will die 5V vom AVR überwachen und da ist die Erkennung nicht so 
schnell, erst wenn die Spannung erkennbar absackt kann er reagieren.

Der Opto im AC Beispiel filtert natürlich auch schön Störungen, je nach 
dem wie lahm er ist.

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


Lesenswert?

Joachim B. schrieb:
> Lothar M. schrieb:
>> ozvald schrieb:
>>> Der Kollektor vom Optokoppler
>> Der Optokoppler ist hier "Perlen vor die Säue geworfen". Einen OK nimmt
>> man nur, wenn man links und rechts unterschiedliche Potentiale hat.
> hat ozwald doch!
Wieso sehe ich dann links und rechts vom Optokoppler das selbe 
Massesymbol?

Ozvald schrieb:
> ...oder wenn man die Schaltung vorher mit Transistor aufbaut und der
> Prozessor extrem anfällig auf externe Störimpulse reagiert --> blockiert.
Naja, dann hat das eine andere Fehlerursache. Mit dem Optokoppler wurde 
ein Symptom behandelt.

> Nachdem der Optokoppler eingesetzt war, hat sich der Prozessor nicht
> mehr aufgehängt
Da ist also noch ein Softwarefehler drin... ;-)

Bringt aber alles nichts, weil Sercan Savran (disaster35) kein 
AC-Netzteil mit Brücke hat. Oder?

: Bearbeitet durch Moderator
von Joachim B. (jar)


Lesenswert?

Lothar M. schrieb:
> Wieso sehe ich dann links und rechts vom Optokoppler das selbe
> Massesymbol?

da hast du Recht, entweder kennt der TO keine verschiedenen 
"Massesymbole" oder hier tut das nichts.
Wenn AC irgendwie auf GND bezogen ist würde ich natürlich wegen der 
Brücke links nicht Masse klemmen oder ein anderes Massesymbol verwenden, 
A-GND z.B.

Lothar M. schrieb:
> Mit dem Optokoppler wurde
> ein Symptom behandelt.

-> schnell, einfach & wirkungsvoll, es muss nicht immer perfekt sein, 
manchmal braucht es nur die schnelle Realisierbarkeit statt 
Grundlagenforschung.

Lothar M. schrieb:
> Bringt aber alles nichts, weil Sercan Savran (disaster35) kein
> AC-Netzteil mit Brücke hat. Oder?

DAS ist das hüpfende Komma.

: Bearbeitet durch User
von Helmut L. (helmi1)


Lesenswert?

Warum so kompliziert. Haenge ein einfaches FRAM (8 Pin) ueber I2C an den 
Controller und du kannst speichern bis zum naechsten Millenium.

http://www.cypress.com/file/41656/download

von Patrick C. (pcrom)


Lesenswert?

Noch eine bemerkung zum originalfrage...

Aendren alle EEPROM werten tatsaechlich jedes mal ? Abhangig von die 
bedeutung der Werte gibt es oft nur wenige aenderungen. Wenn man zuerst 
EEPROM lest und nur schreibt wenn noetig ist oft sind die zahl der 
Schreibaktionen oft viel weniger.

von Sercan S. (disaster35)


Lesenswert?

> Lothar M. schrieb:
>
> Wenn du schon unbedingt so eine Sekunden-USV bauen willst, dann mach es
> so:
>
1
>   +5V ----o------>|----o--- µC
2
>           |            |
3
>          100R          |
4
>           |            |
5
>           o------>|----'
6
>           |+     2x Schottky
7
>          === Goldcap
8
>           |
9
>   GND ----o----------------
10
>
>

Ich habe nun diese Schaltung genommen. Ich danke dir vielmals, es klappt 
super. Da kann man sogar mit den Augen betrachten wie 4 Segmentanzeigen 
langsam ausgehen. Nun will ich ja die Anzeige und die anderen 
Verbraucher nicht haben, während ich runterfahre, da ich diesen Strom 
besser am µC gebrauchen kann. Macht es nicht mehr Sinn, die obere Diode 
vor den Goldcap zu schalten? Also direkt nach +5V.
So wie hier:
   +5V ->|-o------------o--- µC
           |            |
          100R          |
           |            |
           o------>|----'
           |+     2x Schottky
          === Goldcap
           |
   GND ----o----------------
 [/pre]

Edit: Also ich bin kein Experte der Elektrotechnik, aber wenn ich die so 
schalte, sperre ich doch auch den Strom, zu den anderen verbraucher, 
weil die Diode ja dann hindert, dass die +5V Leitung von dem Goldcap 
verspeist wird und nur noch der uC Strom bekommt?

: Bearbeitet durch User
Beitrag #4969275 wurde vom Autor gelöscht.
von Sercan S. (disaster35)


Angehängte Dateien:

Lesenswert?

Ich habe es nun wie vorhin geschrieben zusammengelötet und habe mit dem 
Logic Analyzer paar Tests gemacht.
Also ich muss sagen, falls das jemand nachbauen möchte muss ich 
erwähnen, dass man keinen 0.22F Goldcap braucht (zumindest nicht für die 
Datenmenge. Naja sicher ist sicher, dachte ich mir :D).
Folgende Daten:
ATMega8 (8MHz intern osc.)
Datenmenge die ins EEPROM geschrieben wird: 21 Byte (4xdword,1xword, 
3xbyte)
Gesamtdauer ≈ Ø197.5ms (≈9.4ms/Byte)
Sleep-Mode = KEINS

Also mit den o.g. Daten war es mir möglich, den uC nach dem Stromausfall 
noch
≈ 7,5 Sekunden am leben zu erhalten. Laut dem Logic-Analyzer habe ich es 
in der Zeit geschafft, die Daten 38 mal (38*21 = 798 Bytes) in den 
EEPROM reinzuspeichern und das ganze ohne den uC in den Sleep-Mode zu 
setzen.

Danke, dass Ihr alle so reichlich geholfen habt.

Liebe Grüße :)

EDIT:
Ich denke mal, wenn man den Sleep-Mode Idle setzt, könnte man da noch um 
einiges mehr an Strom einsparen. Ich habe mal für den ATMega8 nun die 
Tabelle aus dem Datenblatt rausgeschnitten und als Anhang angehängt, 
darin kann mann sehen, dass bei den anderen Sleep-Modes außer den Idle, 
die external Interrupts nur bei level interrupts funktionieren und der 
EEPROM nur bei Idle & ADC Noise Reduction Mode arbeitet. Also sind die 
anderen Sleep-Modes dabei mit Vorsicht zu genießen.

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Sercan S. schrieb:
> dass man keinen 0.22F Goldcap braucht

Wundert mich nicht. ;-)

Die „Sparmatic“-Heizungsthermostaten haben einen Kondensator von 47 µF
drin, damit retten sie beim Batteriewechsel die aktuelle Uhrzeit.  Die
haben aber auch eine interessante Mimik, mit der sie bei Entnahme der
Batterien sofort einen Pinchange-Interrupt auslösen.

von Joachim B. (jar)


Lesenswert?

Sercan S. schrieb:
> Gesamtdauer ≈ Ø197.5ms (≈9.4ms/Byte)

die meisten Arduino EEPROM Routinen arbeiten aber mit 5ms-10ms delays 
was echt doof ist, ich habe das bei externen I2C EEPROMs über Polling 
gemacht wann es wieder bereit ist zum Antworten und bin viel schneller.

Arduino I2C EEPROM
1
#include <Wire.h> //I2C library
2
void my_i2c_eeprom_wait_ready(void)
3
{    
4
  // Wait until EEPROM gives ACK again.
5
  // this is a bit faster than the hardcoded 5 milli
6
  do
7
  { Wire.beginTransmission(MY_I2C_EEPROM_ADDRESS); Wire.requestFrom(MY_I2C_EEPROM_ADDRESS, 1);
8
    readIIC();
9
  }while(Wire.endTransmission());
10
}

: Bearbeitet durch User
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.