Ich benutze einen atmega328 auf AVR. Ich habe noch keine Codierung durchgeführt, aber ich plane. Wie ich das in meinem Kopf tun werde. Ich möchte also in der Lage sein, den ATmega328 über einen Tastendruck aufzuwecken und in den Ruhezustand zu gehen, nachdem ich dieselbe Taste gedrückt habe. Wie mache ich das?
In meinem Kopf ist es ähnlich .
Ich werde den Schlafcode in die Hauptfunktion einfügen und auch eine While-Schleife in die ISR-Funktion. Wenn es einen Tastendruck erkennt, wird es aus der While-Schleife ausbrechen und wieder schlafen gehen.
Ob das funktioniert? Wie behandelt ein ATmega das Drücken der Taste, während er sich in der Interrupt-Service-Routine-Funktion befindet? Oder wie unterscheidet es zwischen einem Tastendruck, um den Schlaf zu unterbrechen, und einem Tastendruck, um einzuschlafen?
Interrupts und Tastendrücke vertragen sich überhaupt nicht. Tasten haben ein Phänomen, das einen Sprung kennt. Kurz bevor die Kontakte schließen, "prellen" sie, indem sie den Kontakt herstellen und unterbrechen. Wenn Sie beispielsweise einen Pin-Wechsel-Interrupt mit einer Taste verwenden, können Sie einige Male in den Ruhemodus wechseln und ihn verlassen, bevor sich die Taste stabilisiert. Schaltflächen müssen entprellt werden, eine Technik, die sicherstellt, dass der Schaltflächenstatus stabil ist, bevor diese Schaltfläche gelesen wird.
Der beste Weg, einen Taster zu entprellen, besteht darin, den Zustand des Tasters in regelmäßigen Abständen zu lesen, z. B. 1 ms. Wenn der Zustand der Taste mindestens 50 ms konstant bleibt, kann die Taste als stabil betrachtet werden.
Die Art und Weise, wie ich normalerweise eine solche Routine schreibe, besteht darin, die Schaltfläche alle 1 ms zu überprüfen. Wenn kein Entprellungsereignis im Gange ist und der aktuelle Tastenzustand nicht mit dem vergangenen Tastenzustand übereinstimmt, starten Sie ein Entprellungsereignis. Überprüfen Sie die Schaltfläche weiterhin alle 1 ms, aber erhöhen Sie einen Zähler jedes Mal, wenn eine Schaltfläche gelesen wird. Normalerweise beginne ich bei 50. Wenn der Button niedrig ist, werde ich dekrementieren und wenn der Button hoch ist, werde ich erhöhen. Wenn Sie 100 erreichen, ist der Button hoch und wenn Sie 0 erreichen, ist der Button niedrig. Setzen Sie die Startvariable auf 50 zurück und setzen Sie das Entprellereignis auf „false“.
In Ihrem Fall würde ich den Pin-Wechsel-Interrupt verwenden, um das Mikro zu wecken, aber dann eine obligatorische Entprellung auferlegen. Wenn die Entprellung vorüber ist, bleiben Sie wach. Wenn die Entprellung fehlschlägt, was bedeutet, dass ein Knopf nicht gedrückt wurde, dann fallen Sie zurück in den Schlaf.
Nik Williams
Tom Tischler
volatile
(damit der Compiler weiß, dass es sich in der ISR ändern kann und es nicht wegoptimiert). Zum Beispiel:volatile boolean flag;
Shang-Lin Chua
Tom Tischler
Shang-Lin Chua
Matt Jung
Tom Tischler