Forum: Mikrocontroller und Digitale Elektronik AVR Sleepmode nur zu bestimmten Zeiten verlassen


von Tobias K. (kurzschluss81)


Lesenswert?

Hallo ich verwende einen AT90CAN128 dort wollte ich den Sleepmode 
verwenden damit der Prozessor zwischen zwei schleifendurchgängen 
schlaffen geht.
Die Schleifen sollen immmer zu definierten zeitpunkten durchlaufen 
werden.
Dazu soll der Sleepmode von einem bestimmten Timer aufgeweckt werden. 
Alle anderen Interrupte welche ich verwende sollen den Sleepmode nicht 
beenden.
Ich habe also den mir den IDEL Mode eingestellt und den Prozessor 
schlafen gelegt. Nun habe ich aber festgestellt das der Sleepmode immer 
serh viel früher verlassen wird als er soll, und zwar immer dann wenn 
ein anderer Interrupt vor dem Timerinterrupt auftrat. Ist das normal?
Beim MSP kenne ich das so das der Sleepmode erst deaktiviert werden muss 
damit der Prozessor aufwacht. Dort können andere Interrupte auftretten 
aber der Sleepmode wird erst verlassen wenn ich das will (und 
einprogrammiert habe) und nicht nach jedem Interrupt.

Wie kann ich dem AVR das beibiegen das der Sleepmode nur bei meinem 
Timerinterrupt veralssen wird nicht aber bei anderen Interrupten? Die 
anderen Interrupte müssen aktiviert sein.

von Purzel H. (hacky)


Lesenswert?

Man muss den sleepmode richtig konfigurieren. Entweder sollen interrupts 
aktiv sein, oder eben nicht.

von Tobias K. (kurzschluss81)


Lesenswert?

Naja Interrupt schon aber nur von einem bestimmten Interupt das kann 
doch nicht so schwierig sein andere Mikrocontrolelr können das doch 
auch.

von Falk B. (falk)


Lesenswert?

@  Tobias Korrmann (kurzschluss81)

>Ich habe also den mir den IDEL Mode eingestellt und den Prozessor

>serh viel früher verlassen wird als er soll, und zwar immer dann wenn
>ein anderer Interrupt vor dem Timerinterrupt auftrat. Ist das normal?

Ja, siehe Sleep Mode.

>Beim MSP kenne ich das so das der Sleepmode erst deaktiviert werden muss
>damit der Prozessor aufwacht. Dort können andere Interrupte auftretten
>aber der Sleepmode wird erst verlassen wenn ich das will (und
>einprogrammiert habe) und nicht nach jedem Interrupt.

Der MSP430 ist da halt anders.

>Wie kann ich dem AVR das beibiegen das der Sleepmode nur bei meinem
>Timerinterrupt veralssen wird nicht aber bei anderen Interrupten? Die
>anderen Interrupte müssen aktiviert sein.

Muss man in deine State Machine in der Hauptschleife einarbeiten, 
siehe auch Interrupt.

MfG
Falk

von Peter D. (peda)


Lesenswert?

Nimm ein Flag:
1
volatile uint8_t sleep_flag;
2
// ...
3
  sleep_flag = 1;
4
  do
5
    sleep_cpu():
6
  while( sleep_flag );
7
// ...
8
ISR( x )
9
{
10
  sleep_flag = 0;
11
}


Peter

von Kluchscheißernder N. (kluchscheisser)


Lesenswert?

Ich glaube, Du bringst da einiges durcheinander.

Aus dem Sleep als Zustand wird der AVR von jedem Interrupt geweckt, 
sofern dieser Interrupt das Recht hat, den AVR aus diesen Sleepmodus zu 
wecken (siehe Datenblatt, Sleep-Modi). In den Sleep gelegt wird der AVR 
nicht durch Einstellen eines Sleep-Modus, sondern durch Aufruf des 
ASM-Befehls "sleep".

Mit dem Sleep-Modus wird vorgewählt, in welchen Sleep-Mode der AVR 
fallen soll, wenn der ASM-Befehl "sleep" auftritt. Idle legt nur den 
CPU-Takt still und kann von jedem Interrupt geweckt werden. 
ADC-Noise-red. legt auch den Takt für die Timer still und kann daher 
nicht vom Timer geweckt werden. Power-Down legt auch andere Takte 
(Timer, I/O, ADC) still und kann nur von Low-Level-Int, TWI, Timer2 im 
Async-Mode und PinChange geweckt werden, wobei das von AVR-Typ zu 
AVR-Typ unterschiedlich ist, siehe Datenblatt.

MfG

von Tobias K. (kurzschluss81)


Lesenswert?

@Klugscheißender Consulter
nein ich bringe dort nichts durcheinander
"Lästern an"
bei einem Vernüftigen Controller ala MSP430
"Lästern aus"

schaltet man den Sleep modus ein und wieder aus.
Interupte werden auch im Sleepmodus bearbeitet.
Aber das abschalten des Sleeps Modus muss durch das setzen eines Bits in 
einem Hardwareregister geschehen, und nicht dadurch das "nur" ein 
Interrupt ausgelöst wird.
das heist das der Controller nach der abarbeitung eines Interruptes 
wieder automatisch in den Sleepmode geht solange dieser aktiviert ist.

von Peter D. (peda)


Lesenswert?

Tobias Korrmann schrieb:
> "Lästern an"
> bei einem Vernüftigen Controller ala MSP430
> "Lästern aus"

Das ist höchstens Geschmackssache.
Der AVR macht eben das automatisch, was man beim MSP noch händisch 
machen muß. Und oftmals ist das richtig.

Und wenn man es mal anders haben will, macht man es eben mitm Flag 
(siehe oben).
Und wer dafür kein Byte verschwenden will, kann auch das SE-Bit nehmen.


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
Noch kein Account? Hier anmelden.