Sleep Mode beim ATMEGA8

OP #1361423
Lesenswert?
• ▲
▼
Habe gerade mit den verschiedenen Sleep-Modes beim ATMEGA8
experimentiert. Also zunächst den Sleepmodus enabld im MCUCR-Register.

Kann es sein, dass der Controller entgegen den Angaben im
Atmega8-Datenblatt auch bei Timer1 (compare-Modus)Interupts
ganz normal aus dem Sleep-Modus aufwacht? In der Tabelle S.33
ist als Wake-Up-Quelle im Idle-Modus von den drei Timern nur der
Timer2 aufgeführt.

Weil mein Programm scheint im Idle-Modus vom Timer1 aufgeweckt
zu werden. Oder er schläft garnicht wirklich ein. Leider habe
ich kein so empfindliches Messgerät, um festzustellen, dass
der Controller tatsächlich schläft.

Danke für Eure Info
Karl
OP #1361485
Lesenswert?
• ▲
▼
Habe es gerade mal probiert. Habe die LEDs, die ohnehin schon an
sind, in der Hauptschleife invertieren lassen. (Alle, die an sind
gehen aus und umgekehrt) Einmal habe ich den Sleep VOR diese
Invertierung gestellt und einmal danach.

loop:
    sleep
    com LEDs
    out PORTB, LEDs
rjmp loop

loop:
    com LEDs
    out PORTB, LEDs
    sleep
rjmp loop

Kein Unterschied.
Der Controller scheint nicht einzuschlafen. :(

Den Sleep-Modus Enabled habe ich so:

  ldi temp1, (1 << SE) | (1 << ISC00) | (1 << ISC10)
  out MCUCR, temp1

Also nur Sleep enablend und die Sleep-Mode-Bits so gelassen
wie sie sind. Das müsste laut Datenblatt dann der Idle-Mode
sein.
Gast #1361514
Lesenswert?
• ▲
▼
>In der Tabelle S.33 ist als Wake-Up-Quelle im Idle-Modus von den drei
>Timern nur der Timer2 aufgeführt.

Indirekt sind auch Timer0 und Timer1 aufgeführt: sie fallen unter "Other 
I/O" (ganz rechts in der Tabelle).
OP #1361590
Lesenswert?
• ▲
▼
> wenn sie jetzt aber mit mehr als 1Mhz blinken, dann wirst du
> es vermutlich nicht von einem dauerleuchten unterscheiden könne.
> Mach mal eine Zeitverzögerrung rein. (oder mal die Frequenz an der
> LED messen)

In dem Programm wurden die LEDs vom Timer1-Interupt hochgezählt.
Die Hauptschleife hat die LEDs nur invertiert. Das Invertieren
hat auch geklappt. Leider hatte der Sleep-Befehl keine Auwirkungen.
Es ohne und mit Sleep invertiert.



Habe nun einen 24-Bit-Zähler in die Hauptschleife eingebaut
Dieser Zaehler steht, wenn ich sleep vor der Schleife stehen
habe und läuft, wenn ich es auskommentiere. Also scheint der
Idle doch irgendwie zu funktionieren.

loop:
  sleep
        inc zaehlerL
        cpi zaehlerL,255
        brne EndeZaehlerIncrementieren
        inc zaehlerM
        cpi zaehlerM,255
  brne EndeZaehlerIncrementieren
  inc zaehlerH
  EndeZaehlerIncrementieren:

        mov LEDs, ZaehlerH
        out PortB, LEDs
rjmp loop

Es scheint so, also ob es paar Takte oder einen oder mehrere 
Schleifendurchläufe dauert, bis der Controller einschläft.
Muss das aber gleich nochmal austüfteln.


>Indirekt sind auch Timer0 und Timer1 aufgeführt: sie fallen
>unter "Other I/O" (ganz rechts in der Tabelle).

Sehr allgemein formuliert in der Tabelle, aber das scheint
wohl so gemeint zu sein.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.