Forum: Mikrocontroller und Digitale Elektronik Aufwecken nach Sleep (AVR ATmega48)


von Herb G. (donar)


Lesenswert?

Guten Tag :)

(Neuling-Alert)

Ich möchte, dass mein ATmega48 in den power-down geht wenn ein Button an 
PD2 gedrückt wird und dass er auch vom selben Button (Int0) wieder 
aufgeweckt wird.

Die Idee ist nun, bei allgemein disableten Interrupts PD2 zu erkennen 
und dort folgendes zu tun:
- (Bits fürs enablen von Int0 setzen)
- sei
- (Bits für Power-Down setzen)
- sleep

Beim erneuten Drücken des Tasters wird der Interrupt dann ja den 
Controller aufwecken, richtig? Was passiert jetzt aber als nächstes? Ich 
möchte ja nicht wirklich etwas sinnvolles machen ausser das 
Hauptprogramm neu zu starten, also kann ich doch einfach in den 
Interrupt-Vektor ein
- reti
reinschreiben, ja?

Was macht der Mega aber dann als nächstes, wird er "von selber" wieder 
in den Reset-Vektor reingehen? Muss ich da dann ausser einem frühen
- cli
noch was anderes beachten?

Ich möchte es nicht unbedingt riskieren, den Mega nicht mehr aufwecken 
zu können, deshalb ganz grundsätzlich die Frage: Funktioniert das 
überhaupt oder gibt es da einen sinnvolleren Ansatz?

Besten Dank im voraus für Kommentare und Hinweise.

Donar

von Karol B. (johnpatcher)


Lesenswert?

Hast du dir denn die Artikel zum Sleep Mode durchgelesen? Da du von 
"reti" sprichst, nehme ich mal implizit an, dass du in Assembler 
programmierst. Demnach wäre dieser Artikel 
(https://www.mikrocontroller.net/articles/AVR-Tutorial:_Power_Management) 
sicherlich interessant für dich. Ganz allgemein zum Sleep Mode gibt es 
folgendes (https://www.mikrocontroller.net/articles/Sleep_Mode).

Kurz zusammengefasst: Der Controller macht nachdem er wieder aufgewacht 
ist genau da weiter, wo er aufgehört hat. Je nachdem wodurch der 
Controller aufgeweckt wird, wird i.d.R. noch eine ISR ausgeführt.

Übrigens ist es je nachdem was dein Controller noch so tut nicht 
unbedingt vorteilhaft Interrupts global zu (de-)aktivieren. Im 
Normalfall wird man bloß den entsprechenden Interrupt (de-)aktivieren. 
Typischerweise deaktiviert man z.B. in der "Aufweck"-ISR nur den 
Interrupt, um ihn dann kurz vor dem Schlafen gehen wieder zu aktivieren.

von Ingo (Gast)


Lesenswert?

Wenn du den WDT nutzt lass ihn nach dem Sleep einfach einmal zuschlagen, 
dann hast du einen Reset :)


Ingo

von Joggel (Gast)


Lesenswert?

Anlaufstelle nummer eins ist das Datenblatt vom Hersteller, nicht von 
einem Trittbrettfahrer. Dort ist dem Sleep ein ganzes Kapitel gewidmet. 
Was ist daran unklar?

von Joggel (Gast)


Lesenswert?

Meines Erachtens geht man nur an einer Stelle im Programm in den 
Sleepmode, und das ist im Main. Sicher nicht in einem Interrupt.

von Peter D. (peda)


Lesenswert?


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.