Forum: Mikrocontroller und Digitale Elektronik ATmega32 Problem SleepMode


von Julian Z. (julian1103)


Angehängte Dateien:

Lesenswert?

Hi Leute,

Hab ein kleines Versuchsprogramm für den SleepMode am ATmega32 
geschrieben.
Es soll 5sek die LED1 aufleuchten, danach soll er in den PowerDown-Mode 
gehen und über Interrupt an INT0 wieder "aufgeweckt" werden und LED2 in 
der ISR aufleuchten (zum test der ISR).

Leider leuchtet die LED1 dauerhaft und es geht nicht in den SleepMode.
Kann mir jemand sagen was ich vergessen habe??

Danke.

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

1. ich sehe in deinem Programm nichts was die LED1 ausschalten würde
2. 5s mit delay_ms bei 16MHz sind glaube ich schon zu viel

Sascha

von Julian Z. (julian1103)


Lesenswert?

Hi Sascha

hab das ganze jetzt mal mit einem delay von 1000ms versucht was auf 
jeden fall funktionieren sollte. --> auch nichts.

und liege ich mit meiner Annahme falsch, das der PowerDown Mode den uC 
nicht abschalten sollte und somit auch die LED1 erlischen sollte???

Zudem sollte ja zumindesten bei drücken des Tasters der auf +5V 
liegt(somit Highflanke wenn gedrückt) die ISR Routine greifen und die 
LED2 aufleuchten.

: Bearbeitet durch User
von Sascha W. (sascha-w)


Lesenswert?

Alle Sleepmodi legen nur die internen Verarbeitungseinheiten mehr oder 
weniger lahm. Die Portzustände Ein-/Ausgang und Pegel bleiben hingegen 
unverändert.

Sascha

von Julian Z. (julian1103)


Lesenswert?

OK. Das heißt Display UART ADC usw muss ich noch extra ausschalten.
Aber die ISR Routine sollte doch trozdem greifen. Zumindest die LED2 auf 
ON

von Sascha W. (sascha-w)


Lesenswert?

Datenblatt lesen!
Power Down: Only INT2 or level interrupt INT1 and INT0

mit deiner Flanke an INT0 bekommst du ihn nicht wieder wach!

UART/ADC kannst du beim .32 glaube ich noch nicht gesondert deaktivieren 
um noch mehr Strom zu sparen da es das PRR Register dort noch nicht 
gibt. Ein Display kannst du ja über einen Portpin mit Strom versorgen 
wenns nicht zu viel braucht. Zuvor dann alle Datenleitungen auf Low oder 
Input und dann die Versorung auf Low.

Sascha

von Julian Z. (julian1103)


Lesenswert?

Sascha W. schrieb:
> Power Down: Only INT2 or level interrupt INT1 and INT0
>
> mit deiner Flanke an INT0 bekommst du ihn nicht wieder wach!
1
GICR |= (1 << INT0);    //Externen Interrupt freigeben
2
MCUCR |= (1<<ISC01) | (1<<ISC00);//Auf Steigende Flanke Interrupt ausführen

Aber wenn ich das richtig verstehe sollte ich mit diesen zwei Zeilen zum 
ersten den Externen Interrupt an INT0 freigeben und mit der zweiten 
Zeile den Interrupt auf eine High Flanke setzen

von Sascha W. (sascha-w)


Lesenswert?

das passt schon,
aber für das aufwecken aus dem Sleep gelten halt noch ein paar 
Einschränkungen!
Und da nützt es wenig auf Flanke zu stellen wenn diese Betriebsart dann 
für den Zweck nicht geeignet ist.
Siehe Tab14 unter Sleepmodes...

Sascha

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.