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
intmain(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
return0;
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.
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
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.
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.
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.
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
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.
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
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.
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.
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.
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.
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...
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:
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.
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?
@ 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.
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.
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(inti=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(inti=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
@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]
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.
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.
@ 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.
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.
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...
@ 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).
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.
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?
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.
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
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.
> 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?
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.
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.
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
voidmy_i2c_eeprom_wait_ready(void)
3
{
4
// Wait until EEPROM gives ACK again.
5
// this is a bit faster than the hardcoded 5 milli