Hi, mein AVR fängt an zu spinnen wenn ich am Ende einer unterbrechbaren Timer-ISR in den Sleep-Mode zu gehen versuche. Durch einen erneuten Aufruf des Timers wird dann der AVR wieder geweckt. Leider fängt dann mein Programm völlig an zu spinnen. Liegt das daran, dass die ISR mit Aufruf des Sleep befehls noch nicht fertig ist und dann mit jedem erneuten erwachen die ISR neu angesprungen wird und somit nach kurzer Zeit der Stack überläuft? lg PoWl
Kann es sein, dass der AVR am Ende der Auf-wach-ISR wieder in den Sleep mode geht? (DANN läuft der Stack über, klar) Wie wär's mit Code?
Ok, ich hab grad noch einen kleinen Versuch dazu gemacht. In der Main Funktion wird jetzt in einer Schleife ständig überprüft ob die variable gosleep gesetzt ist. Ist sie es, wird sie gelöscht und sich schlafen gelegt. Erst in der Timer-ISR (Aufwach-ISR) wird diese wieder gesetzt. Theoretisch könnte ich auch einfach generell in der Schleife schlafen gehen, da diese eh nach dem Timerablauf angesprungen wird, aber da kommt ja noch mehr dazu. lg PoWl
Hi, ich sehe keinen Sinn darin (und würde es auch nie machen) eine CPU in einer ISR schlafen zu legen. ISRs sollen normalerweise schnell abgearbeitet werden. Ob nichts mehr zu tun ist und geschlafen werden sollte stellt man (notfalls über globale flags, wnnes nicht anders geht) in der Hauptschleife fest und legt dort schlafen. Dann kann durch beliebige ISR aufgeweckt werden ohne dass man Probleme bekommt. Wenn Du nämlih in einer ISR schlafen legst, und dann ein Interrupt aufweckt (evtl. ein anderer) dann wird ja eine ISR durch eine andere unterbrochen - was nicht immer gewünscht ist. >> Theoretisch könnte ich auch einfach generell in der Schleife schlafen >> gehen, da diese eh nach dem Timerablauf angesprungen wird, aber da kommt >> ja noch mehr dazu. Ja, genau. Das "mehr dazu" machst Du VOR dem schlafengehen, dann erledigt der Prozessor erst alle anstehenden Aufgaben und geht dann schlafen. Gruß, Bernhard
Paul Hamacher wrote: > Leider fängt dann mein Programm völlig an zu spinnen. Liegt das daran, > dass die ISR mit Aufruf des Sleep befehls noch nicht fertig ist und dann > mit jedem erneuten erwachen die ISR neu angesprungen wird und somit nach > kurzer Zeit der Stack überläuft? Wenn Du das Sleep im Interrupt ausführst, mußt Du ja die Interrupts enablen und damit läuft der Stack über. Der Schuldige ist aber nicht das Sleep, sondern das Interruptenable im Interrupt. Das Sleep gehört in das Main und nirgendwo sonst! Peter
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.