Hallo Leute, da bastet und programmiert man schon seit jahrzehnten mit den AVR rum und denkt man kennt alles. Neue AVR-Typen sind immer für Überraschungen gut. Wie Beispielsweise der ATTINY406: *kompakte Programmierschnittstelle (3pins) *Komparator mit programmierbare Hysterrese *kompakte Gehäuseform ... Aber so eine einfache Sache zu implementieren wie per Tastendruck aufwachen aus dem Schlafzustand, das hat mich jetzt 1.5 Tage gekostet. Beim ATTINY24 konnte man jeden Pin dafür nutzen (Pin-Changes-Interrupt) Beim ATTINY406 funktionte das im Prinzip auch, aber komischer Weise nur bei aktiven Debugger aus dem Powerdown-Sleepmodus und autonom nur aus dem im Idle-Sleepmodus. Warum wird die schxxxx CPU nicht wieder wach?! Das Datenblatt studiert bis zum abwinken und da ist die Rede von: "Asynchronous Sensing Pin" Und auf den Seiten 17/18 fintet man eine kleine Randnotitz: "2. All pins can be used for external interrupts, where pins Px2 and Px6 of each port have full asynchronous detection." Die Erkenntnis: Aufwachen geht also nur mit Taster an Pin2 oder Pin6! Hat jemand schon ähnliche Erfahrunge gemacht das man sich im Datenblatt oder Internet blöde sucht nach der Lösung des Problems?
Torsten R. schrieb: > "2. All pins can be used for external interrupts, where pins Px2 and Px6 > of each port have full asynchronous detection." Der Punkt ist dass normalerweise alle Eingänge zuerst auf die interne Clock synchronisiert werden bevor sie ausgewertet werden. Das ist der gängigste Weg ungültige Zustände der Flipflops zu vermeiden. Wenn Du jetzt aber einen Sleep-Modus hast in dem alle Clocks aus sind, dann geht das nicht. Dafür braucht man dann die "full asynchronous detection". Die bringt aber meist andere Nachteile mit sich, wie z.B. langsamer, höherer Stromverbrauch, und wird daher nicht an allen Pins implementiert.
:
Bearbeitet durch User
> ... blöde sucht ...
Also darüber bin ich auch schon gestolpert, vor längerer Zeit; aber
anderthalb Tage habe ich nicht benötigt, um die Stelle im Datenblatt zu
finden:
Table 11-3. Sleep Mode Wake-Up Sources, Spalte 'Power-Down' mit der
Fußnote
1. The I/O pin must be configured according to Asynchronous Sensing Pin
Properties in the PORT section.
Darauf stößt man z.B. auch, wenn man sich die Pinbelegung des ATmega328 anschaut. Ein paar Pins haben zwei Interrupt-Funktionen. Ein Pin ist z.B. mit INT0/PCINT18 beschriftet. Das ist nicht aus Versehen doppelt gemoppelt.
:
Bearbeitet durch User
> ATmega328 ... Ein paar Pins haben zwei Interrupt-Funktionen ... PCINT18
Was aber nur sehr bedingt zum vorliegenden Thema passt.
Denn wie Torsten R. bereits schrieb, weckt jeder PCINTn den ATmega328
auch aus 'Power-down' auf.
:
Bearbeitet durch User
Viel Text, aber kein Code. Torsten R. schrieb: > Die Erkenntnis: Aufwachen geht also nur mit Taster an Pin2 oder Pin6! Nein, mit jedem Pin: Pull-up und Button gegen GND. Wie immer.
> Nein, mit jedem Pin: Pull-up und Button gegen GND. Wie immer.
Bei einem uC der AVRxt-Klasse aus Power-Down?
Torsten R. schrieb: > aber komischer Weise nur bei aktiven Debugger aus dem > Powerdown-Sleepmodus und autonom nur aus dem im Idle-Sleepmodus. Bei aktivem Debugger bleibt ein (interner) Takt auch im Powerdown aktiv, damit die Verbindung zum Debugger nicht abbricht, d.h. eigentlich geht der Controller gar nicht wirklich in den Powerdown. Nebeneffekt ist dann dass der Takt auch andere Peripherieeinheiten am Leben hält. Ist bei anderen Controllern ganz genau so (z.B. STM32), die können nur von bestimmten Pins aus den tieferen Low-Power-Modi geweckt werden - außer die Debug-Einheit ist aktiv, und ist so konfiguriert dass sie den Takt auf "an" forciert.
S. L. schrieb: > Bei einem uC der AVRxt-Klasse aus Power-Down? Jetzt bin ich aber verwirrt. Ich dachte, der LOW-Level-Interrupt funktioniert immer, und nur die Flankenerkennung braucht etwas komplizierteres. Jetzt muss man wieder alles testen.
Ja, der Low-Level-Interrupt beim Power-Down funktioniert mit PA1 genauso wie mit PA2.
> Jetzt bin ich aber verwirrt.
Okay, ich auch - ich habe gerade nur einen AVR32DD28 zur Hand, und was
ich bei diesem auf die Schnelle sehe, lässt mich stutzen.
Morgen mal in Ruhe überprüfen ...
> AVR32DD28 ... lässt mich stutzen
Dieser kann Pin-Change-Interrupt aus Power-Down z.B. auch auf PinA5.
An dieser Stelle gibt es offenbar Unterschiede innerhalb der
AVRxt-Klasse - es wird fein unterschieden zwischen 'partially
asynchronous' und 'fully asynchronous':
Datenblatt AVR16/32DD28/32:
All PORT pins support fully asynchronous input sensing with interrupts
for selectable pin change conditions. Fully asynchronous pin change
sensing can trigger an interrupt and wake the device from all sleep
modes, including modes where the Peripheral Clock (CLK_PER) is stopped.
Datenblatt ATtiny202/204/402/404/406:
All PORT pins support asynchronous input sensing ... while partially
asynchronous pin change sensing is limited ...
Es kommt also auf den jeweiligen Controllertyp an, zumindest für
Pin-Change-Interrupt. Zum Level-Interrupt hat ja Georg M. bereits eine
Aussage getroffen.
S. L. schrieb: > Datenblatt ATtiny202/204/402/404/406: > All PORT pins support asynchronous input sensing ... while partially > asynchronous pin change sensing is limited ... und weiter: "Only from BOTHEDGES or LEVEL interrupt sense configurations". Mit einer dieser beiden Optionen kann jeder Pin den ATtiny aus Power Down aufwecken. "BOTHEDGES" entspricht dem "Pin Change Interrupt" der aelteren Modelle.
Arne R. schrieb: > S. L. schrieb: >> Datenblatt ATtiny202/204/402/404/406: >> All PORT pins support asynchronous input sensing ... while partially >> asynchronous pin change sensing is limited ... > > und weiter: "Only from BOTHEDGES or LEVEL interrupt sense > configurations". Mit einer dieser beiden Optionen kann jeder Pin den > ATtiny aus Power Down aufwecken. "BOTHEDGES" entspricht dem "Pin Change > Interrupt" der aelteren Modelle. Hmmm... Für mich sieht das eher so aus, wie die Konfigurationsmöglichkeiten der alten INTx. Und auch da gab es bereits den Wildwuchs, dass bestimmte INTx sich nicht so konfigurieren ließen, dass sie in der Lage gewesen wären, das Teil bei Toggle aus dem PowerDown zu wecken. Beispiel AtMega16/32: INT0/1 können lassen sich zwar auch auf das Äquivalent zu BOTHEDGES konfigurieren, können dann aber das Teil nicht aus dem PowerDown holen. Das können sie nur, wenn sie auf LOWLEVEL konfiguriert sind. INT2 hingegen läßt sich bezüglich des "interrupt sense" überhaupt nicht konfigurieren (default ist hier BOTHEDGES), aber kann dafür das Teil bei Toggle aus dem PowerDown holen. Also, ich würde mich hier auf garnix verlassen, sondern es bei Bedarf so machen, wie es auch S.L. macht: ausprobieren.
Ob S. schrieb: > Also, ich würde mich hier auf garnix verlassen, sondern es bei Bedarf so > machen, wie es auch S.L. macht: ausprobieren. Habe ich gemacht, und BOTHEDGES funktioniert.
Torsten R. schrieb: > Wie Beispielsweise der ATTINY406: > *kompakte Programmierschnittstelle (3pins) > *Komparator mit programmierbare Hysterrese > *kompakte Gehäuseform Gerade bei der tinyAVR® 0-series ist der Komparator noch unterentwickelt. Bei den weiterentwickelten AVRs kann die Referenzspannung eingestellt werden - zwar nur mit 8 Bit, aber das ist auf jeden Fall besser als nichts.
Arne R. schrieb: > Ob S. schrieb: >> Also, ich würde mich hier auf garnix verlassen, sondern es bei Bedarf so >> machen, wie es auch S.L. macht: ausprobieren. > > Habe ich gemacht, und BOTHEDGES funktioniert. Hmmm... Da fragt man sich dann allerdings, was uns die Anmerkung auf Seite 17 sagen soll, die schon der TO erwähnt hatte. Und die er auch als wahr identifiziert hatte, also zumindest insofern, als dass es an anderen Pins als Px2/Px6 bei ihm eben nicht funktioniert hat. Genau das war ja überhaupt der Anlass für diesen Thread.
Ob S. schrieb: > Arne R. schrieb: >> BOTHEDGES funktioniert. > > Hmmm... Da fragt man sich dann allerdings, was uns die Anmerkung auf > Seite 17 sagen soll, die schon der TO erwähnt hatte. Ich lese das Datenblatt so, dass an diesen Pins alle Modi (also auch RISING und FALLING) aus Power Down aufwecken koennen. > dass es an > anderen Pins als Px2/Px6 bei ihm eben nicht funktioniert hat. AFAICS hat er nicht erwaehnt, welchen Modus (RISING/FALLING/BOTHEDGES/LEVEL) er gewaehlt hat.
:
Bearbeitet durch User
Arne R. schrieb: > AFAICS hat er nicht erwaehnt, welchen Modus > (RISING/FALLING/BOTHEDGES/LEVEL) er gewaehlt hat. Das stimmt, dazu gab es keine explizite Klarstellung, daran kann es also tatsächlich gelegen haben.
Das hat nun arg lange gedauert, ich möchte es aber trotzdem noch nachtragen: > AFAICS hat er nicht erwaehnt, welchen Modus > (RISING/FALLING/BOTHEDGES/LEVEL) er gewaehlt hat. Es ist zu vermuten, dass er denselben Fehler machte wie ich auch, sich nämlich auf Pin-Change RISING oder FALLING zu kaprizieren, statt, wie von Arne R. ausgeführt, BOTHEDGES (analog zur AVRe-Klasse) zum Aufwecken aus Power-down zu verwenden. Denn Letzteres funktioniert immer&überall, während Ersteres bei den älteren AVRxt auf PINx2/6 beschränkt ist: ATtinies, aber auch bspw. ATmega4809 oder AVR128DB28. Diese Einschränkung entfällt z.B. beim (neueren) AVR32DD28, bei diesem sind alle Pins 'fully asynchronous'.
> ... LEVEL ...
Beim Level-Interrupt ist unangenehm (und macht die Programmierung i.d.R.
aufwändiger), dass 'Notes 2. The LEVEL interrupt will keep triggering
continuously as long as the pin stays low'.
Bei Power-down vermeide ich diesen, wenn möglich.
Mit Tastern benutze ich immer den Low-Level-Sense-Wake-up-Interrupt und habe dabei noch nie irgendwelche Schwierigkeiten oder einen nennenswerten SW-Aufwand festgestellt.
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.


