Aufwecken nach Sleep (AVR ATmega48)

OP #2710624
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
#2710735
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren