Konkret, er legt sich nicht schlafen...Der Zähler geht hoch, 1, 2, 3 und
dann geht er beim nächsten Tastendruck in "void enterSleepMode()" und
sofort wieder in loop().
Woran kann das liegen?
Vielen Dank für Tipps.
Welcher Mikrocontroller ist das konkret?
Ich frage, weil der mit dem ich das mal ausprobiert habe für diesen
Zweck keine Flanken (FALLING) benutzen kann.
Du hast mit dem Delay zwar sowas Ähnliches, wie Entprellung für Arme
gemacht. Das greift aber nicht beim Interrupt. Wenn da das Kabel länger
ist und der Eingang gar noch offen ist, dann ist das Ding eine bessere
Wünschelrute und wacht bei jedem bisschen Ladung auf, die
rumvagabundiert. Also relativ niederohmigen Pullup/down (Richtwert 10K,
erhöhen zum Stromsparen kann man immernoch) und 100n über den Taster.
Somit hast du elektrisch entprellt und der Controller kann sich auch mal
unbehelligt schlafen legen ;-)
Stefan F. schrieb:> Es geht nur LOW oder HIGH. Im Sleep Modus kann der Atmega328 keine> Flanken erkennen, nur Pegel.
Nein, das ist natürlich Unsinn. Man darf halt dafür nur nicht INTx
verwenden, sondern PCINTx. Letzteres kann überhaupt nur Flanken erkennen
und kann immer auch als WakeUp-Quelle aus dem PowerDown dienen.
Sämtliche 328 (ob ohne was dran oder mit P oder mit PB dran) können das.
Seit Jahrzehnten schon, möchte man hinzufügen.
Ob S. schrieb:> Nein, das ist natürlich Unsinn. Man darf halt dafür nur nicht INTx> verwenden, sondern PCINTx.
Dann zeige mal, wie du das mit Arduino erreichen willst. Hast du meine
zweiter Erklärung (die mit den Screenshots und Links zur Doku und
Quelltext) nicht gelesen?
Hier ist das "Problem" mit den Interrupts ausführlich beschrieben. Auch
wie man am Arduino Framework vorbei die Pin Change Interrupts verwendet:
https://dronebotworkshop.com/interrupts/
Stefan F. schrieb:> Dann zeige mal, wie du das mit Arduino erreichen willst.
An Arduino vorbei programmieren natürlich. Arduino ist zwar ziemlicher
Mist, geht aber nicht so weit, einem Direktzugriffe auf Register oder
eigene Interrupthandler zu verbieten. Wobei letztere, wenn sie nur dem
Zweck des Aufwachens dienen, ja obendrein leer sind, also
programmiertechnisch keine nennenswerte Herausforderung darstellen
dürften.
Stefan F. schrieb:> Dann zeige mal, wie du das mit Arduino erreichen willst.
Nur weil eine IDE nicht für alles und jedes einen Befehl haben kann, ist
es nicht verboten, es selber zu programmieren.
In den Urzeiten der Computerei gab es z.B. PEEK und POKE, um am Basic
vorbei die dollsten Sachen zu programmieren.
Vielen Dank, Gerald B., das ist die Lösung. Mit einem Kondensator
klappt's wunderbar. Hätte ich mir eigentlich denken müssen, Taster
wollen entprellt werden...
sleep_enable() ist nicht notwendig, mit sleep_mode() aus der sleep.h
wird das se-bit automatisch gesetzt/wieder gelöscht.
FALLING/RISING/CHANGE geht übrigens auch alles.
Tobias H. schrieb:> sleep_enable() ist nicht notwendig, mit sleep_mode() aus der sleep.h> wird das se-bit automatisch gesetzt/wieder gelöscht.> FALLING/RISING/CHANGE geht übrigens auch alles.
Das ist richtig, was ich mich aber auch frage: Warum setzt du den
Sleepmode immer wieder neu? Würde reichen, den in setup() einmal zu
setzen ;)
Ähnliches gilt für attachInterrupt() ;)
Tobias H. schrieb:> mit sleep_mode() aus der sleep.h> wird das se-bit automatisch gesetzt/wieder gelöscht.
Wobei dieses Macro nicht interruptfest ist! Im günstigsten Fall geht nur
ein Interrupt verloren (Uhr geht nach), im worst case schläft der MC für
immer (bis zum nächsten CPU-Reset).
Und das Löschen von SE nach dem Sleep ist eh überflüssig, es reicht
völlig das einmalige Setzen im Initcode.
Ob S. schrieb:>> Dann zeige mal, wie du das mit Arduino erreichen willst.>> An Arduino vorbei programmieren natürlich.
Wieso "vorbei"? In der Arduino IDE und auch in der Alternative
"PlatformIO" von Visual Studio Code kann man in C++ alle Register
ansprechen, und zwar mit Symbolen, die in diesen IDEs vordefiniert sind
und genau denen entsprechen, die in der Prozessor-Doku benutzt werden.
@Stefan F.
Über die Register-Programmierung kann man man den 328P auch aus dem
Deep-Sleep wecken, sowohl über die INT-Pins als auch über die
PCINT-Pins. Bei den PCINT-Pins gibt es "Pin Change" als Event, bei den
INT-PINS gibt es zusätzlich die Möglichkeiten "Low level", "Rising edge"
und "Falling edge". Prozessor-Doku S. 80/82.
Steht alles in der Prozessor-Doku. Wer sich auf die Arduino-Doku und
-Lib verlässt, muss eben "unten" bleiben und erfährt von vielen
Möglichkeiten niemals etwas.