Unterbrechungen im AVR

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?

Sie sollten keine While-Schleife in eine ISR einfügen, das ist ein ziemlich ruckeliger Ansatz. Ein ISR soll ein kurzer, schneller Code-Burst sein. Sie sollten nur ein boolesches Flag in der ISR haben, das bei jedem Tastendruck umgeschaltet wird. Überprüfen Sie dann in der Hauptschleife den Status des Flags. Wenn es wahr ist, gehen Sie in den Schlafmodus.
Stellen Sie sicher, dass Sie Ihr Flag als deklarieren volatile(damit der Compiler weiß, dass es sich in der ISR ändern kann und es nicht wegoptimiert). Zum Beispiel:volatile boolean flag;
@TomCarpenter Dies ist als globale Variable definiert, nicht als lokale Variable, ja? dh wenn ich die Funktionsdeklarationen mache usw
Ja, globale Variable - damit sie sowohl in Ihrer ISR- als auch in Ihrer main()-Funktion im Geltungsbereich (sichtbar) ist. Sie können es entweder an den Anfang Ihrer .c-Datei setzen, wenn sich alles in einer Datei befindet, oder es in einer .h-Datei deklarieren.
Hey @TomCarpenter, danke für den Rat. Ich habe erfolgreich ein Programm implementiert, das den Interrupt aufruft und die LED 10 Sekunden lang aufleuchtet, bevor ich zum ursprünglichen Code zurückkehre. Dies verwendet ein flüchtiges Flag. Ich versuche jetzt in den Schlafmodus zu kommen. Meine Frage ist, wenn ein Mikrocontroller im Ruhezustand ist und ein Interrupt das Flag ändert ... wacht der Mikrocontroller auf?
Das ist vollständig Mikrocontroller-abhängig.
Die AVR-CPU wird automatisch von jeder Wake-Quelle geweckt. Sobald es aufwacht, schläft es nicht wieder ein, es sei denn, Sie sagen es ihm. Es verarbeitet also die ISR und kehrt dann zur Ausführung des Codes zurück, beginnend mit der ersten Anweisung nach dem Schlafbefehl.

Antworten (1)

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.