Inter­rupt: Morsegerät

Lese­zeit: 4 Minu­ten

Lösung
Seite als PDF

Ein Tas­ter löst mit Hil­fe eines Inter­rupts ein Ereig­nis aus: die LED leuch­tet, solan­ge der Tas­ter gedrückt wird.

Der loop-Teil jedes Pro­gramms wird schritt­wei­se abge­ar­bei­tet. Es ist nicht mög­lich gleich­zei­tig einen ande­ren Befehl auszuführen. 

Bei­spiel:

Jeder delay()-Befehl stoppt den Pro­gramm­ab­lauf für die ange­ge­be­ne Zeit. In die­ser Zeit kann kein ande­rer Befehl aus­ge­führt werden.

Den­noch gibt es dafür eine Lösung:

Ein Tas­ter kann einem Inter­rupt zuge­ord­net wer­den (attach­In­ter­rupt). Wenn der Tas­ter betä­tigt wird, löst er den Inter­rupt aus. Der nor­ma­le Pro­gramm­ab­lauf wird unter­bro­chen und die fest­ge­leg­te Funk­ti­on (Inter­rupt-Ser­vice-Rou­ti­ne) wird aus­ge­führt. Anschlie­ßend wird das Pro­gramm nor­mal fortgesetzt.

attachInterrupt(digitalPinToInterrupt(TASTER), LED­Schal­ten, CHANGE);

Der Tas­ter löst den Inter­rupt aus, die Inter­rupt-Ser­vice-Rou­ti­ne LED­Schal­ten wird auf­ge­ru­fen. Der Inter­rupt soll auf einen Wech­sel des Tas­ter­zu­stands (LOW oder HIGH) reagieren.

Es gibt ver­schie­de­ne Ereig­nis­se, die den Inter­rupt aus­lö­sen können:

RISINGFALLINGCHANGE
der Inter­rupt wird aus­ge­löst wenn sich der Sta­tus von LOW zu HIGH ändertder Inter­rupt wird aus­ge­löst wenn sich der Sta­tus von HIGH zu LOW ändertder Inter­rupt wird aus­ge­löst wenn sich der Sta­tus ändert

Am Ardui­no UNO und bei der Ardui­no Nano-Fami­lie muss der Tas­ter zwin­gend am Pin 2 oder Pin 3 ange­schlos­sen wer­den.
Der Ardui­no WiFi Rev 2 kann alle digi­ta­len Pins benut­zen, die Ardui­no MKR-Boards ver­fü­gen über die Pins 0, 1, 4, 5, 6, 7, 8, 9 als Interrupt-Pins.

Zusätz­lich muss eine Varia­ble, die im Haupt­pro­gramm und in Inter­rupt-Funk­tio­nen ver­wen­det wird, als vola­ti­le defi­niert wer­den.
Varia­ble wer­den im RAM und tem­po­rär in inter­nen Regis­tern des Pro­zes­sors gespei­chert, bear­bei­tet oder ver­än­dert. Es kann vor­kom­men, dass der Zustand der Varia­blen im ⇒SRAM durch eine neue Wert­zu­wei­sung für kur­ze Zeit nicht stimmt, da der letz­te Wert zunächst nur in Pro­zes­sor­re­gis­tern liegt. 

Das Schlüs­sel­wort vola­ti­le weist das Pro­gramm an, die Varia­ble immer aktu­ell im SRAM zu hal­ten. Damit wird garan­tiert, dass der jeweils aktu­el­le Wert gela­den wird.

Außer­dem sind bei der Pro­gram­mie­rung einer Inter­rupt-Funk­ti­on eini­ge Regeln zu beachten:

  • Der Pro­gramm­teil muss so kurz wie mög­lich sein. 
  • Ver­wen­de kein delay(). 
  • Benut­ze auch kein Serial.print().

Benö­tig­te Bauteile:

  • LED
  • Wider­stand 220 Ω
  • Tas­ter
  • Lei­tungs­dräh­te

Beach­te die ⇒Vor­wi­der­stän­de ver­schie­de­ner LEDs

Baue die Schal­tung auf.
(Fah­re mit der Maus über das Bild, um die Bezeich­nun­gen der Bau­tei­le zu sehen)

Im Bei­spiel­pro­gramm ist die rote LED beim Start aus­ge­schal­tet.
Jeder Druck auf den Tas­ter löst den Inter­rupt aus und schal­tet die LED solan­ge ein.

Beach­te die Kommentare.

#define LED 7
#define TASTER 2 

/* 
  je nach Zustand der Variable TasterStatus ist die LED ein- oder ausgeschaltet 
  beim Start des Programms ist sie ausgeschaltet
*/
volatile bool LEDStatus = LOW; 

void setup()  
{ 
  pinMode(LED, OUTPUT); 

  // Eingangspegel des Tasters auf HIGH setzen 
  pinMode(TASTER, INPUT_PULLUP); 

  /*
    wenn der Taster gedrückt wird 
    ⇒ Funktion LEDSchalten aufrufen 
    CHANGE ⇒ es ist eine Veränderung eingetreten, der Taster 
    wurde gedrückt
  */ 
  attachInterrupt(digitalPinToInterrupt(TASTER), LEDSchalten, CHANGE); 
}

void loop()  
{ 
  // LED schalten
  digitalWrite(LED, LEDStatus); 
} 

void LEDSchalten()  
{ 
  // LEDStatus "umdrehen"
  // aus true wird false, aus false wird true
  LEDStatus = !LEDStatus;
} 

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Anleitungen:


Letzte Aktualisierung: Nov. 26, 2024 @ 11:47