mikrocontroller.net

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


Autor: Tobias Korrmann (kurzschluss81)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Zwölf Mal Acht (hacky)
Datum:

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

Autor: Tobias Korrmann (kurzschluss81)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm ein Flag:
volatile uint8_t sleep_flag;
// ...
  sleep_flag = 1;
  do
    sleep_cpu():
  while( sleep_flag );
// ...
ISR( x )
{
  sleep_flag = 0;
}


Peter

Autor: Kluchscheißernder Nixwisser (kluchscheisser)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tobias Korrmann (kurzschluss81)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.