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.
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.
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
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.
Die 5min werden nur sehr ungenau sein. Besser wäre, einen 32kHz Quarz an T2 anzuschließen, das braucht auch nur wenige µA. Peter
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.