Forum: Mikrocontroller und Digitale Elektronik Atmega Power Down Modes


von Tonja (Gast)


Lesenswert?

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?

von Tonja (Gast)


Lesenswert?

oh ich sehe gerade, ich hatte Timer 1 erwischt...

von Mike J. (linuxmint_user)


Lesenswert?

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)

von Sascha W. (sascha-w)


Lesenswert?

@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

von Thomas E. (thomase)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?


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.