externe Interrupts

Interrupts haben wir bei genauer Betrachtung bereits kennen gelernt. Im PEC-Framework ist der erste Interrupt den wir von Anfang an genutzt haben der SystemTimer (SysTick). Dazu wir meist der erste einfache Timer des Controllers genutzt. Für uns steht damit das 10 Millisekunden Ereignis der Anwendungsklasse und der AppModule als Interrupt-Handler zur Verfügung. Auch die Ereingisse für 100 Millisekunden und das Sekundenereignis werden vom SysTick generiert. Im Abschnitt Timer finden wir die Nutzung selbst konfigurierter Zeitereignisse. In diesem Abschnitt soll sich mit der Anwendung externer Interrupts befassen. Das PEC-Interface für externe Interrupts basiert auf dem Template PecPinInput.

Aus diesem Modellabschnitt lässt sich ablesen, dass für einen externen Interrupt das Template PecPinInterrupt zur Verfügung steht. Dabei „erbt“ dieses Template alle Eigenschaften des PecPinInput. Das bedeutet, dass für PecPinInterrupt alle Optionen und Parameter des PecPinInput möglich sind. Zusätzlich muss der konkrete Interrupt des verwendeten Pins konfiguriert werden. Das Interruptereignis wird durch Überschreiben der Operation +onPinInterrupt():void behandelt.

Bevor wir beginnen benötigen wir ein neues Klassendiagramm. Dazu müssen Sie zurück in die oberste Ebene gehen (rechte Maustaste / nach oben oder einfach Taste ESC). Dort legen Sie ein neues Klassendiagramm an. Zur Erinnerung:

Die folgende Darstellung zeigt eine einfache Testanwendung für den externen Interrupt an PinD2.

Die Vorgehensweise entspricht dem bisher besprochenen:

  1. Projekt und Klassendiagramm für Ihr AVR-Board vorbereiten
  2. eine eigene Klasse RoteLED anlegen
  3. die Klasse RoteLED in der Klasse Controller aggriegieren
  4. das Template PecLed an die Klasse RoteLED binden
  5. das Template pinB00 an die Klasse RoteLED binden
  6. eine eigene Klasse ExtTrigger anlegen
  7. die Klasse ExtTrigger in der Klasse Controller aggrigieren
  8. das Template PecPinInterrupt an die Klasse ExtTrigger binden
  9. das Template PinD2 an die Klasse ExtTrigger binden
  10. das Template extInt0Avr an die Klasse ExtTrigger binden
  11. ggf. weitere Template anbinden oder Realisierungsparameter einstellen.

Sie können statt weiterer Templates wie pinPullUp oder pinLowActiv die gewünschten Eigenschaften und Parameter auch im Dialogbetrieb einstellen. Dazu selektieren Sie die Klasse ExtTrigger und rufen den Definierendialog auf. Dort erreichen Sie über die Schaltfläche Realisierungsparameter die gewünschten Einstellungen.

Die so vorbereitete Systemstruktur muss jetzt nur noch mit dem gewünschten Verhalten ergänzt werden. Es ist denkbar einfach. Wir senden der roten LED einfach die Nachricht, dass sie doch bitte umschalten möge.

ExtTrigger::onPinInterrupt

app.roteLED.toggle();

In der praktischen Anwendung werden wir bemerken, dass die Betätigung der Taste nicht unbedingt nur einen Interrupt sondern im ungünstigsten Fall eine Folge von Interrupts auslöst. Die Taste prellt. Im gleichen Zuge erkennen wir aber auch die geringe Latenzzeit beim Auslösen und Behandeln des Interrupts.

Wenn wir die Zeile richtig eingegeben und das Modell korrekt erstellt haben können wir aus dem Klassendiagramm wie gehabt den Quellcode generieren, diesen übersetzen und auf den Controller übertragen. Das erfolgt über das Aktionsmenü in der Objektbibliothek. Wählen sie dort den Menüpunkt Erstellen, Brennen & Ausführen.

Videozusammenfassung

Und hier diesen Abschnitt als kurze Videozusammenfassung.

Nächstes Thema