faecher:nwt:arduino:lernbaustein2:interrupt:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
faecher:nwt:arduino:lernbaustein2:interrupt:start [22.05.2023 18:53] sbelfaecher:nwt:arduino:lernbaustein2:interrupt:start [22.05.2023 19:27] (aktuell) – [Interrupts aktivieren/deaktivieren] sbel
Zeile 4: Zeile 4:
  
 Wird ein Interrupt ausgelöst, wird der Ablauf des Programms angehalten, die Interrupt-Funktion ausgeführt (("ISR" - Interrupt Service Routine)), wenn die ISR abgearbeitet ist, wird das das Programm an der Stelle der Unterbrechung fortgeführt. Wird ein Interrupt ausgelöst, wird der Ablauf des Programms angehalten, die Interrupt-Funktion ausgeführt (("ISR" - Interrupt Service Routine)), wenn die ISR abgearbeitet ist, wird das das Programm an der Stelle der Unterbrechung fortgeführt.
 +
 +===== Wie macht mans? =====
 +
 +Der Ardunio Uno hat zwei Interrupts, die Pins 2 und 3 können verwendet werden. Um eine Interrupt-Service-Routine mit einem Interrupt zu verknüpfen, verwendet man die folgende Syntax: 
 +
 +  attachInterrupt(PIN, ISR, mode)
 +  
 +dabei ist:
 +  * PIN: Der Pin, der die ISR Triggern soll
 +  * ISR: Der Name der Funktion, die aufgerufen werden soll
 +  * mode: Definiert, wann der Interrupt getriggert werden soll. Dafür sind bereuts 4 Konstanten definiert:
 +    * LOW Interrupt wird getriggert, wenn der Pin LOW ist
 +    * CHANGE Interrupt wird getriggert, wenn der Pin den Wert ändert
 +    * RISING Interrupt wird getriggert, wenn der Pin von LOW auf HIGH wechselt
 +    * FALLING Interrupt wird getriggert, wenn der Pin von HIGH auf LOW wechselt
 +  
 +
 +==== Beispiel 1 ====
 +
 +{{ :faecher:nwt:arduino:lernbaustein2:interrupt:isr01.png |}}
 +
 +----
 +{{:aufgabe.png?nolink  |}}
 +=== (A1) ===
 +
 +Das Programm steuert ein Lauflicht mit 8 LEDs. Erläutere, wie die LEDs anschlossen sein müssen, damit das funktioniert. Welche Verhaltensweise wird durch den Einsatz des Interrupts erreicht?
 +
 +----
 +
 +==== ISR-Regeln ====
 +
  
 Für ISR gelten einige besondere Regeln:  Für ISR gelten einige besondere Regeln: 
  
-  * ISR sollten möglichst kurz gehalten werden.+  * ISR sollten möglichst kurz gehalten werden - keine serielle Konsole in ISRs!
   * ISR können keine Argumente bekommen oder Rückgabewerte zurückgeben. Stattdessen werden - ausnahmsweise! - globale Variablen benutzt, um Daten zwischen Interrupt Service Routinen und dem Hauptprogramm zu tauschen. Damit die Variablen dabei korrekt geändert werden, sollten sie als ''volatile'' deklariert werden.   * ISR können keine Argumente bekommen oder Rückgabewerte zurückgeben. Stattdessen werden - ausnahmsweise! - globale Variablen benutzt, um Daten zwischen Interrupt Service Routinen und dem Hauptprogramm zu tauschen. Damit die Variablen dabei korrekt geändert werden, sollten sie als ''volatile'' deklariert werden.
   * Einige Funktionen verhalten sich in ISRs anders als gewohnt oder funktionieren gar nicht:   * Einige Funktionen verhalten sich in ISRs anders als gewohnt oder funktionieren gar nicht:
Zeile 15: Zeile 46:
     * ''delayMicroseconds()'' benutzt keine Zähler und wird deshalb normal funktionieren.     * ''delayMicroseconds()'' benutzt keine Zähler und wird deshalb normal funktionieren.
  
 +
 +==== Beispiel 2 ====
 +
 +{{ :faecher:nwt:arduino:lernbaustein2:interrupt:isr2.png |}}
 +
 +----
 +{{:aufgabe.png?nolink  |}}
 +=== (A2) ===
 +
 +  * Was könnte man mit dem Programmgerüst bei geeigneter ausgestaltung der Funktion ''machIrgenwas'' erreichen?
 +  * Wie könnte man ein solches Konstrukt einsetzen, um z.B. einen Linienfolger zu steuern oder schnell auf ein Hindernis zu reagieren?
 +
 +==== Interrupts aktivieren/deaktivieren ====
 +
 +Manchmal möchte man in bestimmten Sequenzen eines Programms eine Unterbrechung des Ablaufs durch Interrupts nicht zulassen, in anderen aber schon. Dazu kann man dem Arduino mitteilen, ob er auf Interrupts reagieren soll oder nicht:
 +
 +
 +  noInterrupts(); // Ab jetzt nicht mehr auf IR reagieren!
 +  // anderer Code, der nicht unterbrochen werden soll
 +  interrupts(); // Ab hier wieder auf IR reagieren
 +
 +
 +Weitere Informationen findest du hier: https://gammon.com.au/interrupts
 +
 +==== Material ====
 +
 +{{simplefilelist>:faecher:nwt:arduino:lernbaustein2:interrupt:*}} 
  • faecher/nwt/arduino/lernbaustein2/interrupt/start.1684774421.txt.gz
  • Zuletzt geändert: 22.05.2023 18:53
  • von sbel