Forum: Mikrocontroller und Digitale Elektronik ATmega169 SLEEP SMCR funktioniert nicht -Assembler-


von Bernhard S. (bernhard)


Lesenswert?

Der ATmega169 will nicht einschalfen, wo liegt der Fehler?


ldi temp, (1<<SM2)|(1<<SM1)|(0<<SM0)|(1<<SE)
STS(SMCR),temp

LOOP:
  SLEEP
  call LED_ON
  call WAIT_100mms
  call LED_OFF
  call WAIT_100mms
rjmp LOOP

von spess53 (Gast)


Lesenswert?

Hi

>STS(SMCR),temp

Versuche es mal mit 'out SMCR,temp'.

MfG Spess

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Aus mehreren Gründen funktionierte es nicht:

- POWER-save hätte aktiviert werden müssen, da Timer2 mit 32kHz Quarz im 
Asynchronmodus arbeitet

- out SMCR,temp   , danke spess53



Und so schläft der ATmega169V ein:


ldi temp, (0<<SM2)|(1<<SM1)|(1<<SM0)|(1<<SE) ; POWER-save
OUT(SMCR),temp

LOOP:
   SLEEP
rjmp LOOP

: Bearbeitet durch User
von Bernhard S. (bernhard)


Lesenswert?

... und noch ein Problem:

Watchdog beißt nach wenigen ms schon zu, obwohl 2 Sekunden eingestellt 
sind

Anmerkung: 'OUT(WDTCR),temp' bringt eine Fehlermeldung


ldi temp, (0<<WDCE)|(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0) ; 2 Sekunden
STS(WDTCR),temp

LOOP:
rjmp LOOP

von S. Landolt (Gast)


Lesenswert?

"Bit 4 – WDCE: Watchdog Change Enable" ...
"This bit must also be set when changing the prescaler bits."

Also würde ich es damit und der entsprechenden "timed sequence" 
versuchen; ob Letztere in diesem Fall nötig ist, kann ich aus dem 
Datenblatt nicht herauslesen.

von Bernhard S. (bernhard)


Lesenswert?

Danke S. Landolt für den Tipp :-)


So funktioniert es:

ldi temp, ( 1 <<WDCE)|(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0)
STS(WDTCR),temp

ldi temp, ( 0 <<WDCE)|(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0)
STS(WDTCR),temp


LOOP:
rjmp LOOP

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.