Hallo!
Ich habe mit einem Atmega88 eine kleine RTC implementiert auf basis von
dem 16MHz quarz. Ich wollte mir die 3 euro und platz auf der platine
sparen.
Nun habe ich natürlich das problem, dass die uhrzeit kein reset
überlebt... Eine backup batterie habe ich schon, sonst läuft das gerät
am strom.
Ich frage mich aber, ob ich den watchdog benutzen soll, um auf nummer
sicher zu gehen: es wäre nicht so gut, wenn die pflanzen 24 stunden
beleuchtet werden, oder die heizung die ganze zeit läuft, weil sich der
mega88 sich aufgehängt hat...
Wenn der watchdog aber zubeisst, geht meine uhrzeit verloren (ist ja
klar...). Also dachte ich, ich muss doch eine RTC einbauen. Oder gibt es
vieleicht eine andere möglichkeit?
-Raphael.
Naja, Du kannst die Zeit auch vor dem Reset ins interne EEPROM
schreiben. Allerdings solltest Du eine Offset-Zeit vor dem Schreiben
dazu addieren. Diese müsstes Du irgendwo ermitteln (Zeitmessen,
Abschätzen oder OP-Codes zählen ...).
Hauptsächlich setzt sie sich dann zusammen aus:
- Zeit für das Einschreiben
- Resetzeit
- Startzeit des Mikrokontrollers
- Zeit für auslesen der Zeit aus dem EEPROM
Eine Ungenauigkeit und eine daraus resultierende Zeitabweichung wirst Du
aber auf jeden Fall haben.
Lege die Variablen für die Zeit einfach in eine Sektion, die beim
Neustart nicht (mit Null) initialisert wird.
Und warum hast du eigentlich Resets? Durch den Watchdog? Wenn ja, dann
solltest du mal nach der Ursache forschen. Ein Watchdogreset ist ein
Notausstieg und sollte während des normalen Programmablaufs niemals
vorkommen.
Danke für den tip!
Das hört sich ja machbar. Soll ich den "interrupt and system reset"
modus benutzen? Und dann muss ich noch beim start nachschauen, ob es
einen watchdog reset war, damit ich noch die zeit aus dem eeprom lesen
kann, richtig?
Da ich hoffe, dass ich nicht sooo schlecht programmiere, dass der
watchdog jeden tag zubeisst, ist mir die ungenauigkeit ein wenig egal.
Es geht nicht um sekundengenaues schalten.
-Raphael.
Hallo Cristian,
es handelt sich eher um prätive massnahmen. Ich habe jetzt noch keine
probleme mit der steuerung gehabt. Nur wenn was passiert, will ich
lieber vorbeugen. Deshalb wollte ich den watchdog benutzen. Ich habe es
in dem avrusb code gesehen. Da ich auch einen USB anschluss habe, wäre
es eher unpassend, wenn der USB code der uC aufhängen würde.
Wie gesagt, es wäre eine katastrophe, das gewächhaus auf 45 grad zu
heizen...
Gruß
Raphael.
Wenn es keine Katastrophe ist, dass die Heizung mal richtig Gas gibt,
dann sollte dir das aber mindestens die 3€ für eine externe RTC Wert
sein! Abgesehen davon wäre hier eine Temperaturüberwachung zusätzlich
angesagt.
Wie kritisch ist eigentlich ein Stromausfall von sagen wir mal zwei
Stunden?
@Christian:
moment mal: ich sagte, es IST eine katastrophe auf 45grad zu heizen. Und
eine temperatur regelung ist auch da, nur auch im mega88 implementiert.
Wenn er sich aufhängt, fällt alles aus! (oder bleibt an, je-nach-dem...)
-Raphael.
@Christian:
ein stromausfall ist weniger kritisch. Ich habe schon eine backup
batterie (wie oben beschrieben) sodass die zeit erhalten bleibt. Die
relais werden nicht versorgt, wenn die schaltung auf batterie läuft.
Die relais bekommen dann auch keinen strom im lastkreis, und
dementsprechend wird nichts überheizt, oder kommt durcheinander.
-Raphael.
Wie kann die Zeit, gespeichert im RAM des µC, einen zwei stündigen
Stromausfall überleben? Nach dem Wiederanlaufen gehtdeine Uhr zwei
Stunden nach, oder?
Ich will dir nicht den Watchdog ausreden, der ist in deinem Fall
notwendig. Allerdings solltest du dir Gedanken machen, ob (wie fiktiv
angenommen) das Nachgehen der Uhr irgendwelche Probleme bereitet.
ich wiederhole: jetzt schon (ohne WD oder RTC baustein) überlebt die
schaltung einen stromausfall von mehrere stunden, da der uC von der
batterie versorgt wird. Der rest (hauptsächlich relais und display) wird
nicht von der batterie versorgt, und diese zu schonen.
Die Uhrzeit geht also perfekt, mit oder ohne strom aus der dose, solange
die batterie noch geht, und kein reset (aus welchem grund auch immer)
durchgeführt wird.
Das einsparen eines richtigen RTC ist eher für mich zum lernen, als eine
kommerzielle überlegung. Ich wollte ausserdem die schaltung möglichst
einfach halten.
Ich werde also erstmal mit der vorgeschlagenen methode bei drohendem
WD-reset die zeit ins eeprom speichern. Und dann ein paar tests
machen...
-Raphael.
(falls ihr euch wundert, warum ich so viele grammatik-fehler in meinem
text habe: nicht wundern, ich bin franzose. Ergo ist deutch nicht meine
muttersprache)
1) USB Anbindung mit einem FTDI ueber das UART ist nun wirklich nicht
schwierig.
2) Es sollte ja nicht so schwer sein, etwas code zu schreiben, der
laeuft, ohne sich aufzuhaengen...
3) Mann kann den Hardware RTC ja im Layout vorsehen, muss ihn in der
Serie dann nicht bestuecken.
ok - mein Fehler mit der Backupbatterie, hab ich falsch interpretiert.
> Ich werde also erstmal mit der vorgeschlagenen methode bei drohendem> WD-reset die zeit ins eeprom speichern.
Wie willst du einen drohenden Watchdogreset voraussagen?
Wenn, dann mußt du schon zyklisch die Zeit ins EEPROM speichern, wobei
hier die Methode mit der RAM-Sektion besser wäre. Mach dir mal ein paar
Gedanken, wie oft du ins EEPROM speichern willst und für wie viele
Schreibzyklen das EEPROM ausgelegt (spezifiziert) ist.
@Christian:
wie ich den drohenden WD-reset "vorhersagen" kann ist ja easy: es gibt
einen modus, wodurch der WD erst einen interrupt und dann einen reset
auslöst (siehe abschnitt 10.9.2 im atmega88 datenblatt).
Et voila!
Raphael.
@oha:
Im prinzip hast du völlig recht. Nun bin ich einer, der lieber keine
SMD-teile verbaut ;-) Ausserdem finde ich die teile auch nicht ganz
billig. Als DIP-modul sind die ja richtig unbezahlbar (~20 euro). Und
bisher habe ich mit usbtiny oder avrusb sehr gute erfahrung gehabt.
Sonst, RTC vorsehen aber nicht bestücken ist keine schlechte idee, nur
wird es bei mir keine "Serie" geben. Ich mache alles selber, sprich mit
platine ätzen, bestücken, und benutzen. Falls jemand an die schaltung
interressiert ist, kriegt er von mir nur die schaltung: den rest kann ja
selber machen.
Wegen 2), das dachte ich auch. Nun habe ich gelernt (bin
informatiker...), "fehlertolerante software" zu entwickeln. Und da bei
mir die testphase äusserst inexistent ist (ist ja nur für mich), muss
ich einen fallschirm einbauen (der WD eben), auch wenn er löcherig sein
kann.
Also vielen dank an alle für die vielen vorschläge! Jetzt muss ich mich
mal ans ausprobieren machen.
-Raphael.
Christian Gärtner wrote:
> Lege die Variablen für die Zeit einfach in eine Sektion, die beim> Neustart nicht (mit Null) initialisert wird.
Das würde ich erst mal ausprobieren! Da ja die Spannung nicht ausfällt,
brauchst du das EEPROM nicht zu bemühen, das RAM hält ebenfalls die
Daten (gelöscht wird es erst beim Programmstart, und das lässt sich
verhindern, indem man den Kram in die noinit-Section packt).
Und beim Programmstart kannst du dann zuerst MCUCSR abfragen, wer denn
gerade resettet hat. War es ein Power-On-Reset, dann kannst du die Zeit
auf 00:00 zurücksetzen. War es der Hund, schreibst du "Diese
Fehlermeldung sollten sie niemals zu Gesicht bekommen!" aufs Display,
und behälst die Zeit.
@Christian:
deine lösung mit dem .noinit section hört richtig "elegant" an" das muss
ich sofort ausprobieren!
Was passiert eigentlich mit dem speicher während des resets? Ich konnte
dazu im datenblatt überhaupt nichts finden...
Danke!
-Raphael.
Ich habs gerade mal selbst getestet: läuft einwandfrei, das RAM überlebt
sämtliche Resets (bis auf Power-on-Reset natürlich). Und MCUCSR verrät,
wer schuld war.
Das RAM wird bei einem Reset anscheinend nicht initialisiert, und die
Register auch nicht. Auch ich habe dazu nichts im Datenblatt gefunden.
Ich habe es bei dieser Gelegenheit mal ausprobiert:
http://www.roboternetz.de/phpBB2/viewtopic.php?t=18714
In der Praxis merkt man das selten, weil der avr-gcc alle Variablen beim
Start auf 0 setzt.
> Das einsparen eines richtigen RTC ist eher für mich zum lernen, als eine
kommerzielle überlegung.
Was kostet ein Ausfall?
> Ausserdem finde ich die teile auch nicht ganz
billig. Als DIP-modul sind die ja richtig unbezahlbar (~20 euro).
Was soll das Modul? Batterie ist vorhanden, eine RTC mit eingebautem
Quarz kostet vielleicht 3-4€. Nebenbei sind damit alle
Software-Klimmzüge unnötig.
Habe jetzt auch noch mal etwas mit und ohne Brown-out getestet. Mein RAM
überlebt bis knapp unter 2,2V (normaler Mega16 ohne L, 16MHz). Darunter
bleibt der AVR hängen, und das RAM nimmt zufällige Werte an.
(Und sogar mein LCD, das eigentlich nur für 5V vorgesehen ist, macht da
noch mit! Allerdings nur mit negativer Kontrastspannung von -2,5V...)
@Uwe
Nun habe ich es auch am laufen. Es ist ja traumhaft ;-) Ich hätte nicht
gedacht, dass es mit so einem einfachen trick geht!
@Bensch:
das modul-preis bezog sich auf einen FTDI-modul in DIP-ausführung. Was
der preis der RTC bausteine angeht, stimmt es, dass die nicht wirklich
teuer sind.
Der punkt ist einfach: warum sollte ich ein RTC-baustein benutzen, wenn
mein atmega88 sich die ganze zeit langweilt... Und wenn es sogar mit dem
watchdog ohne grosse probleme geht, weiss ich wirklich nicht warum ich
es nicht im AVR implementieren sollte sollte.
-Raphael.
Ich weiß nicht, warum viele Leute immer so heiß auf den Watchdog sind.
Der Watchdog kann doch keine Programmfehler beheben, das kann nur der
Entwickler selber machen.
Peter
Mach erstmal alles ohne Watchdog und teste ob es sich innerhalb einer
Woche aufhängt, sozusagen alles Eingangstechnisch im Gewächshaus
aufbauen, aber die Ausgänge erstmal nur mit Ersatzlasten betreiben (230V
Halogenlampen?).
Wenn nach ner Weile alles noch geht, also so wie es soll, dann baust du
den Watchdog rein und testest nochmal.... aber mach irgendwo noch eine
LED hin die anzeigt ob der Watchdog angesprungen ist.
@Watchdog hasser:
Es kann ja immer mal irgendwas sein, Handy in der Hemdtasche oder sowas
in der Art wo dann der µC abstürzen kann, und bei einer wichtigen
Steuerung sollte die Hardware so designed sein, dass ein Handy kein
Problem ist.
Dazu sollte zusätzlich eben der Watchdog ansein, kann ja immer mal was
unerwartetes passieren
Also eine alternative wäre einen simplen Binärcounter-IC z.B. 74x393
dazu zu packen, der mit 8 Bit die kleinste Zeiteinheit ("tick")
hochzählt, entweder ständig und parallel zum uC, oder er wird von der
WTD routine gestartet.
Nach dem Reset ließt er sich den 8 bit Wert ein und weiß so exakt
wieviele Ticks er verpasst hat. So sollte man es deterministisch machen
können.