Arduino: Generieren zeitkritischer Signale mit Interrupts

Ich habe einige Probleme, vollständig zu verstehen, wie Interrupts auf zB Arduinos/AVR in der Praxis verwendet werden. Nehmen wir an, ich möchte ein zeitkritisches Signal wie PWM erzeugen und gleichzeitig auf Eingaben von Tasten reagieren können. Beides sollte mit Interrupts implementiert werden.

Wie kann ich sicherstellen, dass das PWM-Signal nicht durcheinander gebracht wird, wenn der Taster betätigt wird und daher eine andere (nicht signalbezogene) Interrupt-Routine läuft? Ähnlich wie hier, wie können Interrupt-basierte Bibliotheken wie 'wire' sicherstellen, dass keine Anfragen verloren gehen, während anderer (vielleicht auch Interrupt-basierter) Code (implementiert von mir oder anderen Libs) läuft?

Warum sollten Sie PWM mit Interrupts implementieren, wenn AVRs perfekt dazu in der Lage sind, dies in Hardware zu tun?
Nehmen Sie das bitte nur als Beispiel. Zwei Aufgaben, von denen eine zeitkritisch und die andere etwas anderes ist.

Antworten (1)

Es ist ganz einfach: Sie können nicht. Und es ist plattformabhängig.

Einige Mikrocontroller haben Interrupt-Controller mit mehreren Prioritäten, so dass, wenn ein ISR mit niedriger Priorität läuft und ein Interrupt mit höherer Priorität ausgelöst wird, der Mikro aufhört, den niedrigen zu bedienen, den Kontext speichert, den mit hoher Priorität bedient und dann zur Routine mit niedrigerer Priorität zurückkehrt. Für Ihr Beispiel würden Sie wahrscheinlich die PWM auf hohe Priorität und die Tasten auf niedrige Priorität setzen, das Warten einer Handvoll von uns auf einen Menschen ist keine große Sache.

Wenn ein Mikrocontroller keinen prioritätsaktivierten Interrupt-Controller hat, ist eine ISR im Allgemeinen nicht unterbrechbar. Wenn eine Taste gedrückt wird und nach einigen Taktzyklen der Timer umbricht, ist es Zeit, den PWM-Pin gut umzuschalten ... Der Pin wartet. Das Unterbrechungsanforderungsbit wird gesetzt, und wenn der Mikro mit der Bedienung der Tasten fertig ist, kehrt er zur Hauptroutine zurück und kehrt dann zurück, um die neue Anforderung zu bedienen. Wenn mehr als eine Anfrage auftritt, während eine andere bedient wird ... Das ist plattformabhängig. Es kann eine feste oder programmierbare Reihenfolge geben, sie können FCFS oder vielleicht sogar zufällig serviert werden.

Der Schlüssel ist: Halten Sie Ihre ISRs kurz , und mit kurz meine ich kurz . Je kürzer, desto besser. Oder in diesem speziellen Fall die nicht kritische Aufgabe durch Polling erfüllen. Sie können Ihre schöne Weile haben (1) und die Schaltflächen dort drin überprüfen und alles tun, was Sie mit Ihrer Eingabe tun müssen, und PWM per Interrupt erzeugen.

Und der letzte Ratschlag: Verwenden Sie kein Arduino. Wenn Sie Ihren gesamten Code schreiben, wissen Sie, was er tut und wie er sich verhält. Atmel-Mikros können in "Vanilla" c oder asm programmiert werden, und meiner Meinung nach ist das viel besser.