Forum: Mikrocontroller und Digitale Elektronik ATmega Power-Down und Wakeup mit INT0


von Mark U. (residuum)


Angehängte Dateien:

Lesenswert?

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
von S. L. (sldt)


Angehängte Dateien:

Lesenswert?

Zweiter Absatz (und oben links)

von Oliver S. (oliverso)


Lesenswert?

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
von Mark U. (residuum)


Lesenswert?

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...

von Peter D. (peda)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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."

von Mark U. (residuum)


Lesenswert?

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...

von Peter D. (peda)


Lesenswert?

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?

von Mark U. (residuum)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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?

von S. L. (sldt)


Lesenswert?

Power-down, 'rising edge of INT0': von meinen 8ern wachen die neueren 
(ATmega48PA, ATmega328P) auf, die älteren (ATmega88, ATmega168) nicht.

von Peter D. (peda)


Lesenswert?

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.

von Georg M. (g_m)


Lesenswert?

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.

von S. L. (sldt)


Lesenswert?

> 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.

von Mark U. (residuum)


Lesenswert?

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.

von Oliver S. (oliverso)


Lesenswert?

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

von Mark U. (residuum)


Lesenswert?

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.

von S. L. (sldt)


Lesenswert?

> 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).

von Mi N. (msx)


Lesenswert?

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
Noch kein Account? Hier anmelden.