Wie genau klappt das miet diesen verflixten Power Down Modes? Am ende sleep setzten ist klar.. Aber wann wie und wo muss man das immer setzen? Wenn ich einen Timer INT auf Timer 2 aktiviere und DANACH den Sleepmode aktiviere, bleibt das Systems stehen, egal welchen mode ich verwende, auch IDE geht nicht. Und wenn das dann irgendwann mal gehen sollte.. muss ich dann nach jeder x beliebigen Anweisung ein sleep setzen?
Tonja schrieb: > muss ich dann nach jeder x beliebigen Anweisung ein sleep setzen? Ich habe hier eine Anwendung bei der ein externer Interrupt ausgelöst wird, danach läuft das Programm von dort weiter wo es schlafen gelegt worden ist, macht "Dinge" und legt sich dann wieder dort schlafen von wo aus es beim nächsten Interrupt wieder starten soll. Ist eigentlich ganz einfach, such dir die optimale Stelle in deinem Programm. Es wäre ja doof wenn das Programm nach dem Interrupt an der nächsten Schleife stehen bleiben würde und nicht mehr die ganzen Sensoren abfragen kann nur weil in der nächsten Schleife tausend mal Sleep aufgerufen wird. In der Zeit in der das Programm die Sensoren abfragt kannst du es eben nur in den IDLE-Modus schicken und am Ende der Abarbeitung versetzt du den Controller eben wieder in den tiefen Schlafmodus ... aber eben an geeigneter Stelle. (also die ideale Aufwachstelle)
@Tonja, also in eine ISR gehört schon mal nie ein Sleep. Da erst mit dem abarbeiten des letzten Befehls einer ISR (reti) die Interrupts wieder frei gegeben werden - was Vorrausetzung für ein späteres Erwachen ist. In der Regel genügt es den Sleep-Befehl am Ende der Mainloop dann aufzurufen, wenn die notwendigen Vorraussetzungen vorliegen und das Programm bis zum nächsten INT nichts mehr zu tun hat. Nach dem Aufwachen wird dann als 1. die ISR abgearbeitet, dann können verschiedene Funktionen in der Mainloop auf durch die ISR hervorgerufene Ereignisse reagieren. Braucht die Mainloop mehrere Durchläufe bis ein erneuter Sleep erfolgen kann musst du den Sleepbefehl solange überspringen oder ggf. auch einen anderen Sleepmode wählen. Sascha
Tonja schrieb: > Wie genau klappt das miet diesen verflixten Power Down Modes? Es gibt nur einen Power Down Mode. Den Power Down Mode. Tonja schrieb: > Wenn ich einen Timer INT auf Timer 2 aktiviere und DANACH den Sleepmode > aktiviere, bleibt das Systems stehen, egal welchen mode ich verwende, > auch IDE geht nicht. Das löst man nicht durch rumprobieren. Nimm dir die Liste im Datenblatt zur Hand. Da steht genau drin, welche Interruptquelle welchen Sleep Mode beenden kann. Der Sleep Mode POWERSAVE ist speziell für das Aufwecken durch einen Timer2-INT. Aber nur, wenn der Timer asynchron mit einem Uhrenquarz getaktet wird. Der CPU-Takt wird in diesem Mode abgeschaltet. Deswegen ist dein Controller stehen geblieben. Tonja schrieb: > Und wenn das dann irgendwann mal gehen sollte.. > muss ich dann nach jeder x beliebigen Anweisung ein sleep setzen? Üblicherweise beinhaltet ein Programm eine Endlosschleife in der main.
1 | volatile unsigned char CanSleep = 0; |
2 | |
3 | int main(void) |
4 | {
|
5 | //Init und sonstwas
|
6 | while(1) |
7 | {
|
8 | //Tu was
|
9 | //...
|
10 | |
11 | if(CanSleep) |
12 | {
|
13 | CanSleep = 0; |
14 | sleep_cpu(); |
15 | }
|
16 | }
|
17 | }
|
Am Ende der while-Schleife wird der Controller in den Sleep geschickt. Dies kann über die Variable CanSleep gesteuert werden. Muß aber nicht. Er kann auch grundsätzlich schlafen gehen. Das Programm wird nach dem Aufwachen mit der nächsten Anweisung nach sleep_cpu() fortgesetzt. In diesem fall ist es der Sprung auf den Anfang der while-Schleife. Also fängt er vorn in der Schleife wieder an.
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.