Forum: Mikrocontroller und Digitale Elektronik Watchdog - Sleep Modus Programm Design Frage (ATmega88A)


von Ernst B. (puravida)


Lesenswert?

Hi,

ich habe eine Programm-Design Frage.

Ich möchte meinen µC ca. 5 Minuten schlafen legen, dann Messwerte 
sammeln und wieder schlafen legen. Dazu habe ich die Idee mit dem 
Watchdog Timer hier aufgegriffen.

Zuerst wollte ich folgendes machen:

µC in der Main schlafen legen, alle 8 Sekunden wird der µC durch den 
Interrupt vom Watchdog aufgeweckt, Zähler hochzählen und falls noch 
nicht fünf Minuten vergangen sind wieder schlafen legen.

Jetzt habe ich gesehen, daß es auch einen Interrupt und System Reset 
Modus gibt. Beim ersten Timeout wird der Interrupt ausgeführt und wenn 
man ein Bit nicht wieder setzt beim nächsten Timeout ein System Reset 
ausgeführt. Das würde ich gerne nutzen denn sollte das Programm wirklich 
mal hängen könnte ich so auch die eigentliche Funktionalität des 
Watchdog nutzen.

Soweit so gut.

Allerdings steht jetzt im Datenblatt:

The first time-out in the Watchdog Timer will set WDIF. Executing the 
corresponding interrupt vector will clear WDIE and WDIF automatically by 
hardware (the Watchdog goes to System Reset Mode). This is useful for
keeping the Watchdog Timer security while using the interrupt. To stay 
in Interrupt and System Reset Mode, _WDIE must be set after each 
interrupt_. *This should however not be done within the interrupt 
service routine itself, as this might compromise the safety-function of 
the Watchdog
System Reset mode.*

So und jetzt frage ich mich wie ich das fett geschriebene am besten 
realisiere. Ursprünglich wollte ich in der ISR nur den Zähler hochzählen 
und falls der noch nicht den Wert 38 erreicht hat den µC innerhalb der 
ISR gleich wieder schlafen legen. Aber jetzt muß ich auch noch WDIE 
wieder auf 1 setzen und das soll nicht innerhalb der ISR geschehen.

Ich könnte das natürlich auch in eine Routine packen und diese Routine 
wird durch den ISR aufgerufen. Aber das soll man ja auch nicht machen 
innerhalb einer ISR eine Routine aufrufen.

Muß ich wieder zurück in die Main? Aber wie dann dort verhindern, daß 
die "normalen" Dinge wie Messwert erfassen und so weiter abgehandelt 
werden? Alles in eine IF-Abfrage packen die ein Flag auswertet ob der 
Zähler schon bei 38 ist? Das erscheint mir wenig elegant.

Was würdet ihr machen? Irgendwelche Ideen?

LG
Ernst

PS: Hoffe ich habe alles wesentliche erwähnt. µC ist ein ATmega88A und 
programmieren tu ich in C.

von STK500-Besitzer (Gast)


Lesenswert?

Ernst B. schrieb:
> So und jetzt frage ich mich wie ich das fett geschriebene am besten
> realisiere. Ursprünglich wollte ich in der ISR nur den Zähler hochzählen
> und falls der noch nicht den Wert 38 erreicht hat den µC innerhalb der
> ISR gleich wieder schlafen legen. Aber jetzt muß ich auch noch WDIE
> wieder auf 1 setzen und das soll nicht innerhalb der ISR geschehen.

Soll nicht...
Man könnte es aber so machen.
Der vorgeschlagene Fall betrifft die Nutzung des Watchdog als Wchhund, 
falls sich der Controller irgendwie aufgehängt hat.
Du benutzt ihn ja eigentlich nur als weiteren Timer.

Sollte ich das mal wieder falsch verstanden haben:
Setz in der ISR ein Flag, das du in der Main auswertest.
Am Ende der Main legst du ihn dann schlafen.

von Ernst B. (puravida)


Lesenswert?

STK500-Besitzer schrieb:
> Ernst B. schrieb:
>> So und jetzt frage ich mich wie ich das fett geschriebene am besten
>> realisiere. Ursprünglich wollte ich in der ISR nur den Zähler hochzählen
>> und falls der noch nicht den Wert 38 erreicht hat den µC innerhalb der
>> ISR gleich wieder schlafen legen. Aber jetzt muß ich auch noch WDIE
>> wieder auf 1 setzen und das soll nicht innerhalb der ISR geschehen.
>
> Soll nicht...
> Man könnte es aber so machen.
> Der vorgeschlagene Fall betrifft die Nutzung des Watchdog als Wchhund,
> falls sich der Controller irgendwie aufgehängt hat.
> Du benutzt ihn ja eigentlich nur als weiteren Timer.

Das stimmt schon, ich benutze ihn als weiteren Timer in erster Linie. 
Die Wachhund Funktionalität soll er aber nicht verlieren. Ich mag also 
beides.
>
> Sollte ich das mal wieder falsch verstanden haben:
> Setz in der ISR ein Flag, das du in der Main auswertest.
> Am Ende der Main legst du ihn dann schlafen.

Ich müsste fast den gesamten Code der in der Main-Endlosschleife steht 
in eine IF-Abfrage oder While-Schleife packen die dieses Flag auswertet. 
Übrig bleiben würde nur die Sleep-Anweisung am Ende die außerhalb steht.

Ich bin nicht so sicher ob das wirklich guter Programmier-Stil ist das 
so zu lösen? Weiß es aber nicht.

LG
Ernst

von STK500-Besitzer (Gast)


Lesenswert?

Ernst B. schrieb:
> Ich müsste fast den gesamten Code der in der Main-Endlosschleife steht
> in eine IF-Abfrage oder While-Schleife packen die dieses Flag auswertet.
> Übrig bleiben würde nur die Sleep-Anweisung am Ende die außerhalb steht.
das wäre ein "if (bla) {" und ein "}" ist das so umständlich?
>
> Ich bin nicht so sicher ob das wirklich guter Programmier-Stil ist das
> so zu lösen? Weiß es aber nicht.

Ich finde schon. Besser als irgendein Gebastel in der ISR.

von Peter D. (peda)


Lesenswert?

Die 5min werden nur sehr ungenau sein.
Besser wäre, einen 32kHz Quarz an T2 anzuschließen, das braucht auch nur 
wenige µA.


Peter

von Ernst B. (puravida)


Lesenswert?

Peter Dannegger schrieb:
> Die 5min werden nur sehr ungenau sein.
> Besser wäre, einen 32kHz Quarz an T2 anzuschließen, das braucht auch nur
> wenige µA.
>
>
> Peter

Hi Peter,

Danke für den Tipp aber die 5 Minuten müssen für meine Anwendung auch 
nicht genau sein. Da spielen ein paar Sekunden auf oder ab keine Rolle.

Aber ich habe gerade gesehen, daß Dein Vorschlag noch weniger Strom 
braucht als die Variante mit dem Watchdog-Timer.  Wobei ich nicht weiß 
ob die Graphik im Datenblatt den Stromverbrauch des 32kHz Quarzes mit 
berücksichtigt? Wahrscheinlich nicht, oder?

Aber zurück zu meinem eigentlichen "Problem":

Hast Du einen Vorschlag welche Lösung ich für meinen Programmcode 
vorziehen sollte?

LG
Ernst

von Ernst B. (puravida)


Lesenswert?

Niemand sonst eine Meinung was der "richtige" Weg ist?

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.