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().
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 ;-)
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.
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/
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.
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.
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() ;)
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.
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.