Forum: Mikrocontroller und Digitale Elektronik Sleep Mode beim ATMEGA8


von Karl-alfred R. (karl-alfred_roemer)


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

von Peter (Gast)


Lesenswert?

dann lass doch einfach eine LED in der main blinken, wenn sie nicht mehr 
blink schläft er.

von Franke M. (appletree)


Lesenswert?

10 Punkte für Peter. :-)

von Karl-alfred R. (karl-alfred_roemer)


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.

von Peter (Gast)


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)

von Gast (Gast)


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).

von Gast (Gast)


Lesenswert?

Ergänzung: "Idle" ist der "leichteste" Sleep Mode. Daraus kann der 
Controller von allen Interruptquellen wieder aufgeweckt werden.

von Karl-alfred R. (karl-alfred_roemer)


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.

von Falk B. (falk)


Lesenswert?

Siehe Sleep Mode

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.