Hallo, ich will einen ATmega168A in den Power-Down Mode bringen und dann per INT0 aufwecken. Mir war dunkel in Erinnerung, dass das nur mit einem Level-Interrupt möglich sei. Also habe ich im Datenblatt nachgesehen bzw. den Datenblättern. Denn in der Ausgabe von 2018 steht, dass das nur mit einem Level-Interrupt möglich sein. In der Ausgabe von 2020 fehlt diese Angabe. Im Errata des neueren Datenblatts steht lediglich "Removed footnote regarding interrupt modes for INT0 and INT1". Tests mit dem ATmega168A haben gezeigt, dass das Wakeup auch mit Flanken-Interrupts funktioniert, also wie im neueren Datenblatt beschrieben. Frage: Weiß jemand, ob das nur ein Fehler und eine Korrektur im Datenblatt war oder ob diese Einschränkung bei älteren Controllern tatsächlich bestand? In diesem Artikel hier https://www.mikrocontroller.net/articles/AVR-Tutorial:_Power_Management steht auch, dass das Wakeup nur mit Level-Interrupt möglich sei. Grüße Markus Ausgabe 2018: https://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf Ausgabe 2020: https://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061B.pdf
:
Bearbeitet durch User
Mark U. schrieb: > Denn in der Ausgabe von 2018 steht, dass das nur mit einem > Level-Interrupt möglich sein. Nein, guggst du Kapitel 10.5 Der Rest sind Datenblattfehler... Oliver
:
Bearbeitet durch User
In dem von S. L. angehängten Ausschnitt steht, dass für INT0 eine Flankenerkennung nur möglich ist, wenn der I/O-Clock läuft. Das gleiche steht in dem von Oliver S. genannten Kapitel 10.5, also dass das Aufwachen aus dem Power-Down Mode nur mit einem Level-Interrupt an INT0 möglich ist. Der Hinweis fehlt im aktuellen Datenblatt. Und vor allem: Ich habe den Interrupt auf Flankenerkennung eingstellt und der Controller wacht aus dem Power-Down Modus auf. Entweder habe ich das noch immer nicht verstanden oder einfach falsch programmiert...
Ist schon komisch, daß nach so langer Zeit an den Chips noch rumgebastelt wurde. Bei den neuen ATmega48..328PB steht die Zeile aber noch drin.
Mark U. schrieb: > Und vor allem: Ich habe den Interrupt auf Flankenerkennung eingstellt > und der Controller wacht aus dem Power-Down Modus auf. Auch die 0-1 Flanke probiert? Zeig mal den Code.
Oliver S. schrieb: > Nein, guggst du Kapitel 10.5 Da steht aber eindeutig: "Only an External Reset, ... an external level interrupt on INT0 or INT1, or a pin change interrupt can wake up the MCU."
Ich habe das nach diesem Beispiel hier gemacht: https://wolles-elektronikkiste.de/en/sleep-modes-and-power-management Im Abschnitt "Waking up via external interrupt" ist folgender Code angegeben, also Power-Down Mode mit Aufwachen mit Flanken-Interrupt:
1 | loop(){ |
2 | ...
|
3 | attachInterrupt(digitalPinToInterrupt(2), intRoutine, RISING); |
4 | set_sleep_mode(SLEEP_MODE_PWR_DOWN); // choose power down mode |
5 | sleep_mode(); // sleep now! |
6 | ...
|
7 | }
|
8 | |
9 | void intRoutine(){ |
10 | detachInterrupt(2); // external interrupt disable (INT0) |
11 | }
|
Und wenn ich das so mache, wacht der Controller auf - was er aber nicht dürfte...
Puh, ein Haufen unbekannter Lib-Aufrufe. Da müßte man mal den generierten Quellcode sehen. Mark U. schrieb: > Und wenn ich das so mache, wacht der Controller auf Wann wacht er auf, woran merkst Du das? Wie ist der Pin PD2 beschaltet?
Nur ganz kurz, muss gleich los: Also, nach dem Aufwachen toggle ich eine LED. Das passiert nur dann, wenn der Controller geweckt wird, indem ich an PD2 eine fallende Flanke erzeuge (Taste). PD2 ist als Input mit Pull-Up konfiguriert und dazu dann der Interrupt auf fallende Flanke (abweichend von der genannten Vorlage, da ist es eine steigende Flanke). Außerdem habe ich den Stromverbrauch geprüft. In der Phase im Power-Down Mode sind es nur einige uA, deswegen bin ich mir recht sicher, dass der Controller tatsächlich in diesem Modus ist.
Eine Taste prellt beim Drücken und beim Loslassen. Ob der Interrupt auf Pegel oder welche Flanke reagiert, kann man so nicht erkennen. Du brauchst einen sauberen Taktgeber, z.B. einen 2. µC oder zur Not mit einem 555. Mark U. schrieb: > Außerdem habe ich den Stromverbrauch geprüft. In der Phase im Power-Down > Mode sind es nur einige uA Auch wenn man die Taste gedrückt hält?
Power-down, 'rising edge of INT0': von meinen 8ern wachen die neueren (ATmega48PA, ATmega328P) auf, die älteren (ATmega88, ATmega168) nicht.
Wäre mal interessant, ob der Unterschied bei den ATmega164..1284/A/P/PA auch besteht. Man hätte es aber besser in die neuen Datenblätter explizit reinschreiben sollen. Nur eine Zeile weglassen, übersieht man leicht. Zumal es nicht an allen Stellen korrigiert wurde. Ich hab noch einen alten ATmega644 von 2006 rumliegen mit nur einer UART.
S. L. schrieb: > Power-down, 'rising edge of INT0': von meinen 8ern wachen die neueren > (ATmega48PA, ATmega328P) auf, die älteren (ATmega88, ATmega168) nicht. Apropos neuere AVR: All pins can be used as event input. All pins can be used for external interrupt. Asynchronous pin change sensing can wake the device from all sleep modes. The PORT also supports asynchronous input sensing with interrupts and events for selectable pin change conditions. Asynchronous pin change sensing means that a pin change can trigger an interrupt and wake the device from sleep, including sleep modes where CLK_PER is stopped.
> Wäre mal interessant ...
Ein ATmega16 wacht nicht auf, mein einziger ATmega16A ist unauffindbar,
ein ATmega644 wacht auf, und für die anderen gehe ich auch von Letzterem
aus (ATmega324PA, ATmega644P, ATmega1284P), erspare mir also den Test.
Danke für alle Rückmeldungen. Ich habe den Taster jetzt entprellt (RC-Glied + Schmitt-Trigger), da sehe ich hinsichtlich des Wakeups keinen Unterschied. Und wie jetzt schon einige Teilnehmer geschrieben haben, gibt es tatsächlich einen Unterschied zwischen älteren und neueren Controllern. Offenbar habe ich einen neueren (ATmega168A), der entgegen den Angaben aus dem Datenblatt auch mit einem Flanken-Interrupt aufwacht. Mich hätte jetzt noch interessiert, wo ich das von Georg M. angegebene Zitat finden kann.
S. L. schrieb: > Power-down, 'rising edge of INT0': von meinen 8ern wachen die > neueren (ATmega48PA, ATmega328P) auf, die älteren (ATmega88, ATmega168) > nicht. Mal ganz blöd gefragt: wie erzeugt man einen Rising Interrupt ohne Level davor und danach? Oliver
Also, normalerweise verwende ich dafür keinen Taster, das war nur zum Testen. In der eigentlichen Schaltung kommt ein Sensor zum Einsatz. Dieser Sensor hat normalerweise ein Ausgangssignal von High. Wenn er dann das entspr. Ereignis bemerkt, wechselt er das Ausgangssignal auf Low. Wie lange das dann auf Low ist, kommt auf das Ereignis an. Dafür ist ein Flanken-Interrupt einfacher, finde ich. Da muss ich das Interrupt auch nicht ein- und ausschalten, um eine Mehrfachtriggerung zu vermeiden. Insbesondere kann nach Abarbeitung des Interrupt-Codes der Controller schon wieder schlafen, während der Sensor noch ein Low-Signal ausgibt.
> Mal ganz blöd gefragt: wie erzeugt man einen Rising Interrupt > ohne Level davor und danach? Die Frage verstehe ich nicht - aber hier mein Vorgehen: INT0 (=PD2) mit externem Pull-down, Taster zieht auf high. Programm lässt LED langsam blinken, ein paar Sekunden lang, geht dann in Power-down. Dahinter liegt permanentes schnelles Blinken; Ablauf: nach den ersten Sekunden hört die LED auf zu blinken, ich betätige den Taster, anschließend sehe ich schnelles Blinken (oder eben nicht, bei den älteren Controllertypen).
Oliver S. schrieb: > Mal ganz blöd gefragt: wie erzeugt man einen Rising Interrupt ohne Level > davor und danach? Beispielsweise mit einem Gewitter ;-) Oder weißt Du wirklich nicht, was gemeint ist? In Kürze: Flankengetriggerte Interrupts werden durch eine Pegeländerung ausgelöst und müssen die Pegeländerung nicht bis zur Ausführung der betreffenden ISR beibehalten. Andernfalls ergibt sich ein 'spurious interrupt', der nicht bearbeitet wird. Ferner kann die Flanke beliebig sein, während es bei pegelempfindlichen Interrupts einen passiven und einen aktiven Pegel gibt.
:
Bearbeitet durch User
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.