Inter­rupt: Mor­se­ge­rät

Lese­zeit: 5 Minu­ten
Navi­ga­ti­on

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 aus­zu­füh­ren.

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 wer­den.

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 Metho­de (Interrupt-Service-Routine) wird aus­ge­führt. Anschlie­ßend wird das Pro­gramm nor­mal fort­ge­setzt.

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

Der Tas­ter löst den Inter­rupt aus, die Interrupt-Service-Routine LED­Schal­ten wird auf­ge­ru­fen. Der Inter­rupt soll auf einen Wech­sel des Tas­ter­zu­stands (LOW oder HIGH) reagie­ren.

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

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

Der Tas­ter muss zwin­gend am Pin 2 oder Pin 3 ange­schlos­sen wer­den.

Zusätz­lich muss die Varia­ble, die eine Sta­tus­än­de­rung anzeigt, als vola­ti­le defi­niert wer­den. Varia­ble wer­den im RAM und tem­po­rär im Spei­cher­re­gis­ter gespei­chert, bear­bei­tet oder ver­än­dert.
Es kann vor­kom­men, dass der Zustand der Varia­blen im Flash­spei­cher und im SRAM durch eine neue Wert­zu­wei­sung für kur­ze Zeit nicht über­ein­stim­men. Das Schlüs­sel­wort vola­ti­le weist das Pro­gramm an, die Varia­ble immer aus dem ➨Flash­spei­cher und nicht vom ➨SRAM zu laden. 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 Interrupt-Methode eini­ge Regeln zu beach­ten:

  • 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 Bau­tei­le:

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

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 Kom­men­ta­re.

# define ROT 5 

// nur Port 2 und 3 können mit 
// attachInterrupt angesprochen werden 
# define TASTER 2 

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

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

  // Vorwiderstand einschalten 
  pinMode(TASTER, INPUT_PULLUP); 
  
  /*
    wenn der Taster gedrückt wird 
    → Methode LEDSchalten aufrufen 
    CHANGE → es ist eine Veränderung eingetreten,
    der Taster wurde gedrückt
  */
  attachInterrupt(digitalPinToInterrupt(TASTER), LEDSchalten, CHANGE); 
} 

void loop()  
{ 
  // nichts zu tun 
  // das Programm reagiert nur auf den Interrupt 
} 

void LEDSchalten()  
{ 
  // TasterStatus wird gelesen 
  TasterStatus = digitalRead(TASTER); 

  /*  
    TasterStatus muss "umgedreht" werden 
    weil TasterStatus bei gedrücktem Taster den Wert LOW hat 
    die LED aber leuchten soll 
  */ 
  digitalWrite(ROT, !TasterStatus); 
} 


Ver­wand­te Auf­ga­ben:


Letzte Aktualisierung: 30. Jul 2020 @ 9:26