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
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.
Wenn du den WDT nutzt lass ihn nach dem Sleep einfach einmal zuschlagen, dann hast du einen Reset :) Ingo
Anlaufstelle nummer eins ist das Datenblatt vom Hersteller, nicht von einem Trittbrettfahrer. Dort ist dem Sleep ein ganzes Kapitel gewidmet. Was ist daran unklar?
Meines Erachtens geht man nur an einer Stelle im Programm in den Sleepmode, und das ist im Main. Sicher nicht in einem Interrupt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.