Arduino: Interrupts: Unterschied zwischen den Versionen
| (5 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
[[Kategorie:Arduino]] | |||
'''Autor:''' [[Benutzer:Ulrich_Schneider| Prof. Dr.-Ing. Schneider]] | '''Autor:''' [[Benutzer:Ulrich_Schneider| Prof. Dr.-Ing. Schneider]] | ||
| Zeile 25: | Zeile 26: | ||
== Regeln == | == Regeln == | ||
Wenn Sie eine Interrupt Service Routine (ISR) schreiben, bedenken Sie: | Wenn Sie eine Interrupt Service Routine (ISR) schreiben, bedenken Sie: | ||
* Halten Sie | * Halten Sie die ISR kurz. | ||
* Nutzen Sie kein <code>delay()</code>. | * Nutzen Sie kein <code>delay()</code>. | ||
* Nutzen Sie kein <code>Serien.print()</code>. | * Nutzen Sie kein <code>Serien.print()</code>. | ||
| Zeile 55: | Zeile 56: | ||
| [https://www.arduino.cc/reference/de/language/functions/external-interrupts/detachinterrupt/ <code>digitalPinToInterrupt(InterruptPin)<code>] || Im Normalfall sollte <code>digitalPinToInterrupt(InterruptPin)</code> verwendet werden anstatt den InterruptPin direkt zu setzen. <br>Die Interruptpins und deren Mapping variiert von Board zu Board. Wenn der Sketch also auf einem anderen Board ausgeführt werden soll, kann es schnell zu Problemen kommen. | | [https://www.arduino.cc/reference/de/language/functions/external-interrupts/detachinterrupt/ <code>digitalPinToInterrupt(InterruptPin)<code>] || Im Normalfall sollte <code>digitalPinToInterrupt(InterruptPin)</code> verwendet werden anstatt den InterruptPin direkt zu setzen. <br>Die Interruptpins und deren Mapping variiert von Board zu Board. Wenn der Sketch also auf einem anderen Board ausgeführt werden soll, kann es schnell zu Problemen kommen. | ||
|} | |} | ||
== Videos == | == Videos == | ||
| Zeile 68: | Zeile 63: | ||
{{#ev:youtube|https://www.youtube.com/watch?v=ZTRiICx1ykM | 720 | | Video 2: Interrupts am Arduino einsetzten |frame}} | {{#ev:youtube|https://www.youtube.com/watch?v=ZTRiICx1ykM | 720 | | Video 2: Interrupts am Arduino einsetzten |frame}} | ||
== Demo == | |||
[https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Arduino/ArduinoLibOrdner/ArduinoUnoR3/examples/DemoInterrupt/DemoInterrupt.ino SVN: DemoInterrupt.ino] | |||
== Weiterführende Links == | == Weiterführende Links == | ||
* [http://gammon.com.au/interrupts Nick Gammon Forum: Interrupts] | * [http://gammon.com.au/interrupts Nick Gammon Forum: Interrupts] | ||
* [https://www.mikrocontroller.net/articles/Verwendung_von_Interrupts_mit_Arduino Verwendung von Interrupts mit Arduino] | |||
== Literatur == | == Literatur == | ||
| Zeile 77: | Zeile 76: | ||
---- | ---- | ||
→ zurück zum Hauptartikel: [[ | → zurück zum Hauptartikel: [[Arduino_Praxiseinstieg_WS_25/26|Informatikpraktikum 1]]<br> | ||
Aktuelle Version vom 16. Oktober 2025, 13:00 Uhr
Autor: Prof. Dr.-Ing. Schneider
Einleitung
Bei einem Interrupt wird durch ein Ereignis, beispielsweise ein Signal von außen, das Hauptprogramm gestoppt und ein anderes Programm ausgeführt. Das externe Signal kann zum Beispiel ein kurzer Puls von einem sich drehenden Magneten sein. Damit jedes Signal des sich drehenden Magneten auch gezählt wird, kann damit ein Interrupt ausgelöst werden, der einen Zähler um 1 erhöht.
Beispiel
Die Funktion alarm wird bei ansteigendem Signal an Pin 2 ausgeführt.
include attachInterrupt(0, alarm, RISING);
void alarm()
{
// Anweisungen
}
detachInterrupt() Schaltet den Interrupt aus. detachInterrupt(InterruptNummer) InterruptNummer: 0 oder 1 (bei Arduino-Standardboards)
Quelle: [1]
Tipp: Eine Variable sollte als volatile deklariert werden, wenn sie von irgendwo anders geändert werden kann außer in dem Codeteil, in dem sie auftaucht. Beispiele dafür sind Threads, die parallel ausgeführt werden. Im Arduino kann das nur bei Interrupts vorkommen, in sogennanten Interrupt Service Routinen.
Regeln
Wenn Sie eine Interrupt Service Routine (ISR) schreiben, bedenken Sie:
- Halten Sie die ISR kurz.
- Nutzen Sie kein
delay(). - Nutzen Sie kein
Serien.print(). - Deklarieren Sie Variablen, die mit dem Hauptcode geteilt werden als
volatile. - Schalten Sie keinen Interrups aus oder an.
Nützliche Befehle
| Befehl | Funktion |
|---|---|
attachInterrupt(InterruptPin, Funktion, Mode) |
Diese Funktion löst mittels Signal an einem definierten digitalen Port einen Interrupt aus, der eine wählbare Programmfunktion aufruft. |
InterruptPin |
Die Arduino-Standardboards (Uno, Nano, Mini, other 328-based) können zwei Interrupts erfassen 0: Pin 2 |
Parameter Funktion |
Durch das Erkennen des Eingangssignals an den erwähnten Ports kann eine auszuführende Funktion angegeben werden. |
Parameter Mode |
Dieser Parameter gibt an, bei welcher Signaländerung ein Interrupt ausgelöst werden soll.
|
detachInterrupt(InterruptPin) |
Schaltet den Interrupt aus.
|
digitalPinToInterrupt(InterruptPin) |
Im Normalfall sollte digitalPinToInterrupt(InterruptPin) verwendet werden anstatt den InterruptPin direkt zu setzen. Die Interruptpins und deren Mapping variiert von Board zu Board. Wenn der Sketch also auf einem anderen Board ausgeführt werden soll, kann es schnell zu Problemen kommen. |
Videos
Video 1: Auslösen der Interrupt Service Routine mittels Taster
Demo
Weiterführende Links
Literatur
- Brühlmann, T.: Arduino Praxiseinstieg. Heidelberg: mitp, 4. Auflage 2019. ISBN 978-3-7475-0056-9. URL: HSHL-Bib, O'Reilly-URL
→ zurück zum Hauptartikel: Informatikpraktikum 1