Arduino Signal Wechsel erkennen?

1 Antwort

Es gibt den "Interrupt on change", da springt der prozessor selber auf das Unterprogramm. Das kann den Arduino auch aus einem sleep aufwecken. Hier musst Du dich mit Interrupts beschäftigen.

Sonst pollen. In der Initialisierung (setup) eine Variable "altwert" = Pineingangswert setzen.

Dann in einer schleife einfach

If (altwert!=Pineingangswert)

Abfragen. Löst das aus mach Deine Ausgabe und setze den altwert auf den aktuellen Wert.

Woher ich das weiß:Berufserfahrung
Plop4x9 
Fragesteller
 13.07.2020, 17:10

Danke. Ich werde mich mal mit dem Thema beschäftigen.

0
Commodore64  14.07.2020, 13:05
@Plop4x9

Interrupts sind eine tolle Sache, da kann man eine Menge mit machen.

Es gibt viele Dinge, die einen interrupt auslösen können:

  • Änderung eines Pinzustandes oder Pin hat bestimmtes Level, z.B. LOW
  • Timer
  • UART
  • A/D Wandler fertig

Zum A/D Wandler: man kann die CPU schlafen legen während man eine Messung durchführt. Ist die CPU heruntergefahren, gibt es keine Störungen durch den Arbeitstakt und Stromspitzen durch laufende CPU Funktionen. Ist die Messung fertig lässt der Interrupt die CPU weiter laufen. Ob man einfach in einer Schleife Zeit vertrödelt bis fertig gemessen wird oder den Interrupt benutzt ist vom Programmablauf her egal, durch schlafen legen und aufwecken per Interrupt hat man aber eine genauere Messung!

Der Timer kann mit dem Arbeitstakt verbunden werden und so eingestellt werden, dass der in bestimmten Zeitintervallen auslöst. Das Programm wird unterbrochen und die ISR (Interrupt Service Routine) für den timer wird gestartet. Die kann dann zählen wie oft ausgelöst wurde und das dann in eine zeit z.B. Tage, Stunden, minuten, Sekunden, Hundertstelsekunden umrechnen. Als globale Variablen sind die dann im Programm verfügbar. ACHTUNG!!! Diese Variablen müssen als volatile definiert werden, z.B. "volatile int stunden". Das sagt dem Compiler, dass die Variable jederzeit unerwartet verändert werden kann. Sonst wird optimiert und nur eine Kopie in einem prozessorregister verwendet, das ist nicht aktuell. Eine Warteschleife kann dann u.U. niemals auslösen da immer der alte Wert geprüft wird und der Sollwert so nie erreicht werden kann. Das für jeden Befehl frisch aus dem Speicher holen kostet Zeit die standardmässig gespart wird!

Bei der UART kann man einen Ringpuffer anlegen der bei reinkommenden Zeichen durch die ISR automatisch gefüllt wird. So kann das Programm dann zu einem beliebigen Zeitpunkt diese Daten verarbeiten und es geht nichts verloren - außer der Puffer läuft über. Auch beim Debugging kann man so sein programm durch Tastendruck am terminal stoppen, diverse Variablen und Registerzustände am terminal ausgeben und weiter machen. So kann man im Klartext sehen wo was klemmt. Auch können immer wiederkehrende Aufgaben zur Überwachung, Steuerung und Regelung so regelmäßig durchgeführt werden während das eigentliche Programm z.B. mit dem User interagiert.

Und ich liebe Drehencoder! Die haben zwei Pins, A und B. Schaut man sich das Diagramm von so einem Encoder an, so stellt man fest, dass man das auch so sehen kann: Wenn A sich verändert, guckt man ob B gerade LOW oder HIGH ist. A ist also die Anzahl der Pulse und im Moment der Änderung sagt B die Drehrichtung! Da macht man sich eine Variable (volatile nicht vergessen!): count. Die zählt dann stur rauf oder runter, je nach Drehrichtung. Möchte man die im Programm benutzen, kann man die auf 0 oder einem Initialwert (z.B. aktuelle Jahreszahl bei Datumseingaben) setzen, dann in einer Schleife den Wert anzeigen bis der Drehencoder gedrückt wird (gibt Drehencoder mit Taster), dann hat man im count den Wert den der User eingestellt hat. Wunderbar geschmeidig und man braucht nicht aufpassen keine Impulse zu verlieren wenn man während man auf Eingabe wartet noch was anderes macht. Man kennt das von vielen Billiggeräten, dreht man zu schnell, läuft das zählen langsam oder zwischendurch in die falsche Richtung. Mit der ISR kann das nicht passieren.

1