Forum: Mikrocontroller und Digitale Elektronik Sleep mode funktioniert nicht


von Markus (Gast)


Lesenswert?

Hallo

Ich arbeite mit einem Tiny13 und möchte diesen gelegentlich in den 
Sleepmode setzten und zwar so:
1
...
2
if( sleepMode )
3
{
4
...
5
sleepMode = 0;
6
// go to sleepMode
7
MCUCR |= (1 << SM1);
8
MCUCR |= (1 << SE);
9
}    
10
...

Die If-Bedingung wird ab und zu zweifelslos erfüllt (gebe im IF-Block 
noch was aus, vor dem Schlafen legen), dennoch setzt sich der uC nicht 
in den Sleepmode (die Anzeige wird weiterhin munter verändert durch 
Funktionen, die ausserhalb der sleep-IF-Schleife stehen => kein sleep 
mode aktiviert)

Im Datenblatt des Tiny13 steht über das "MCUCR – MCU Control Register" 
beim  "Bit 5 – SE: Sleep Enable":
"To avoid the MCU entering the sleep mode unless it is the programmer’s
purpose, it is recommended to write the Sleep Enable (SE) bit to one 
just before the execution of the SLEEP instruction and to clear it 
immediately after waking up."
Muss ich nun also noch eine SLEEP instruction ausführen? Aber was soll 
das sein? Hab dazu im Datenblatt keine weiteren nützlichen Infos 
gesehen. Könnt ihr mir weiterhelfen?

Vielen Dank
Markus

von andy (Gast)


Lesenswert?

Hallo
du brauchst nur
 set_sleep_mode(SLEEP_MODE_IDLE); (Modus auswählen)
 sleep_enable();                  (sleep interupt einschalten)

  sleep_cpu();                    (hier wird er schlafen gelegt)

gruss

andy

von Markus (Gast)


Lesenswert?

ok, vielen dank, die Version
1
#include <avr/sleep.h>
2
...
3
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
4
sleep_enable();
5
6
sleep_cpu();
funktioniert, aber mit einzelnen Bits setzen sollte doch auch 
funktionieren oder? Wo liegt da mein Fehler?

In diesem Zusammenhang stellt sich auch die Frage nach der Bedeutung der 
Funktion "sleep_disable()". Wenn ich durch einen Interrupt aus dem 
sleep-mode rauskomme, bin ich ja nicht mehr im Sleepmode, wozu also die 
Funktion???

von Markus (Gast)


Lesenswert?

hab nun zusammen mit dem Thread 
Beitrag "Bekomme ADC Noise Canceler beim ATMega16 nicht zum laufen" und dem Datenblatt 
rausgefunden, dass die im ersten Post erwähnte "Sleep instruction" 
entweder wie im vorgängigen Post mit "sleep_cpu();" oder mit "asm 
volatile ("sleep")" aufgerufen wird. Der Assembler-sleep-Befehl ist eine 
"MCU CONTROL INSTRUCTION" (s. Datenblatt unter "Instruction Set 
Summary")

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.