Arduino: Interrupts: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
 
(22 dazwischenliegende Versionen desselben Benutzers 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]]
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.
attachInterrupt()
Diese Funktion löst mittels Signal an einem definierten digitalen Port einen Interrupt
aus, der eine wählbare Programmfunktion aufruft.
attachInterrupt(InterruptNummer, Funktion, Mode)
Parameter InterruptNummer
Die Arduino-Standardboards können zwei Interrupts erfassen, die die Nummer 0
(angeschlossen an Pin 2) und die Nummer 1 (angeschlossen an Pin 3) besitzen.
Parameter Funktion
Durch das Erkennen des Eingangssignals an den erwähnten Ports kann eine auszuführende
Funktion angegeben werden.


Parameter Mode
== Einleitung ==
Dieser Parameter gibt an, bei welcher Signaländerung ein Interrupt ausgelöst werden
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
soll.
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.
LOW: Löst den Interrupt aus, wenn Pin auf LOW geht.
CHANGE: Löst den Interrupt aus, wenn sich das Signal am Pin ändert.
RISING: Löst den Interrupt aus, wenn sich das Signal von LOW auf HIGH ändert.
FALLING: Löst den Interrupt aus, wenn sich das Signal von HIGH auf LOW ändert.


== Beispiel ==
== Beispiel ==
Zeile 39: Zeile 21:


Quelle: [1]
Quelle: [1]
'''Tipp:''' Eine Variable sollte als [https://www.arduino.cc/reference/de/language/variables/variable-scope-qualifiers/volatile/ <code>volatile</code>] 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 <code>delay()</code>.
* Nutzen Sie kein <code>Serien.print()</code>.
* Deklarieren Sie Variablen, die mit dem Hauptcode geteilt werden als <code>volatile</code>.
* Schalten Sie keinen Interrups aus oder an.
== Nützliche Befehle ==
== Nützliche Befehle ==
{| class="wikitable"
{| class="wikitable"
Zeile 44: Zeile 37:
! style="font-weight: bold;" | Funktion  
! style="font-weight: bold;" | Funktion  
|-
|-
| <code>[https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/ attachInterrupt(InterruptNummer, Funktion, Mode)]</code> ||Diese Funktion löst mittels Signal an einem definierten digitalen Port einen Interrupt aus, der eine wählbare Programmfunktion aufruft.  
| <code>[https://www.arduino.cc/reference/de/language/functions/external-interrupts/attachinterrupt/ attachInterrupt(InterruptPin, Funktion, Mode)]</code> ||Diese Funktion löst mittels Signal an einem definierten digitalen Port einen Interrupt aus, der eine wählbare Programmfunktion aufruft.  
|-
|-
| <code>InterruptNummer</code> || Die Arduino-Standardboards können zwei Interrupts erfassen, die die Nummer 0 (angeschlossen an Pin 2) und die Nummer 1 (angeschlossen an Pin 3) besitzen. 
| <code>InterruptPin</code> || Die Arduino-Standardboards (Uno, Nano, Mini, other 328-based) können zwei Interrupts erfassen<br>
0: Pin 2<br>
1: Pin 3
|-
|-
| <code>Parameter Funktion</code> || Masse (GND)
| <code>Parameter Funktion</code> || Durch das Erkennen des Eingangssignals an den erwähnten Ports kann eine auszuführende Funktion angegeben werden.
|-
|-
| <code>Parameter Mode</code> || Dieser Parameter gibt an, bei welcher Signaländerung ein Interrupt ausgelöst werden soll.<br>
| <code>Parameter Mode</code> || Dieser Parameter gibt an, bei welcher Signaländerung ein Interrupt ausgelöst werden soll.<br>
Zeile 56: Zeile 51:
<code>FALLING</code>: Löst den Interrupt aus, wenn sich das Signal von HIGH auf LOW ändert.
<code>FALLING</code>: Löst den Interrupt aus, wenn sich das Signal von HIGH auf LOW ändert.
|-
|-
| [https://www.arduino.cc/reference/en/language/functions/external-interrupts/detachinterrupt/ <code>detachInterrupt(InterruptNummer)</code>] || Schaltet den Interrupt aus.<br>
| [https://www.arduino.cc/reference/de/language/functions/external-interrupts/detachinterrupt/ <code>detachInterrupt(InterruptPin)</code>] || Schaltet den Interrupt aus.<br>
<code>InterruptNummer</code>: 0 oder 1 (bei Arduino-Standardboards)<br>
<code>InterruptPin</code>: 0 oder 1 (bei Arduino-Standardboards)<br>
|-
| [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 ==
{{#ev:youtube|https://www.youtube.com/watch?v=ZTRiICx1ykM | 400 | | YouTube: Interrupts am Arduino einsetzten |frame}}
<iframe key="panopto" path="/Panopto/Pages/Embed.aspx?id=20a47176-18e6-44e3-b8f0-af5200e5d799&autoplay=false&offerviewer=true&showtitle=true&showbrand=true&captions=false&interactivity=all" height="405" width="720" style="border: 1px solid #464646;" allowfullscreen allow="autoplay"></iframe>
<br>
Video 1: Auslösen der Interrupt Service Routine mittels Taster
 
{{#ev:youtube|https://www.youtube.com/watch?v=ZTRiICx1ykM | 720 | | Video 2: Interrupts am Arduino einsetzten |frame}}
 
== Weiterführende Links ==
* [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 ==

Aktuelle Version vom 21. November 2022, 13:55 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
1: Pin 3

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.

LOW: Löst den Interrupt aus, wenn Pin auf LOW geht.
CHANGE: Löst den Interrupt aus, wenn sich das Signal am Pin ändert.
RISING: Löst den Interrupt aus, wenn sich das Signal von LOW auf HIGH ändert.
FALLING: Löst den Interrupt aus, wenn sich das Signal von HIGH auf LOW ändert.

detachInterrupt(InterruptPin) Schaltet den Interrupt aus.

InterruptPin: 0 oder 1 (bei Arduino-Standardboards)

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

Video 2: Interrupts am Arduino einsetzten

Weiterführende Links

Literatur

  1. 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: Arduino Praxiseinstieg