InterruptPort – Auf ein Ereignis reagieren

Interrupts unterbrechen bei einem bestimmten Ereignis den aktuellen Programmablauf und führen einen festgelegten Code aus. Als Beispiel werde ich einen Taster an einen als InterruptPort konfigurierten Pin anschließen. Das Ereignis, auf das der Interrupt reagieren soll, ist der Tastendruck. Bei jedem Tastendruck wird das Programm unterbrochen und es wird ein Zähler erhöht, der die Anzahl der Tastendrücke zählt.

Der InterruptPort wird ähnlich wie ein normaler InputPort initialisiert und muss auch elektronisch so beschaltet werden. Die Grundlagen über den InputPort und den internen PullDown-Widerstand habe ich im Beitrag über den InputPort beschrieben.

 

Elektronischer Aufbau

Schaltplan Taster über PullDown an InterruptPort

Der Taster verbindet im geschalteten Zustand die 3.3 V mit dem Port. Für den Port habe ich im Code den internen PullDown-Widerstand aktiviert.

 

Code

public class Program
{
    private static int _buttonCounter = 0;

    public static void Main()
    {
        InterruptPort buttonInterruptPort = new InterruptPort(
            FEZCerbuinoBee.Pins.D0,
            true,
            Port.ResistorMode.PullDown,
            Port.InterruptMode.InterruptEdgeHigh);

        buttonInterruptPort.OnInterrupt +=
            buttonInterruptPort_OnInterrupt;

        while (true)
        {
            Thread.Sleep(100);
        }
    }

    private static void buttonInterruptPort_OnInterrupt(
        uint port, uint newValue, DateTime time)
    {
        _buttonCounter++;

        Debug.Print("Anzahl Tastendrücke: " +
            _buttonCounter.ToString());
    }
}

 

Erklärung zum Programmablauf

Zuerst wird der InterruptPort instanziiert. Über die Parameter im Konstruktor wird der interne PullDown-Widerstand aktiviert. Außerdem wird der Interrupt-Modus auf InterruptEdgeHigh gestellt. Dadurch wird der Interrupt immer in dem Moment ausgeführt, wenn sich der Wert am Eingang von Low auf High ändert.

Wird der Interrupt ausgelöst, wird vom .Net Microframework ein .Net-Event erzeugt. Das Event aboniere ich im Code, sodass bei einem Tastendruck buttonInterruptPort_OnInterrupt() ausgeführt wird:

buttonInterruptPort_OnInterrupt() erhält drei Parameter: Die Portnummer, den neue Wert des Ports und die Zeit, in der der Interrupt ausgelöst wurde.

Innerhalb der buttonInterruptPort_OnInterrupt()-Methode wird der Zähler hochgezählt und der aktuelle Wert als Debug-Meldung ausgegeben.

Die Endlosschleife ist nur dazu da um das Programm am Leben zu halten.

Der Aufruf der Sleep-Methode ist ratsam, weil der Schleifenrumpf sonst zu schnell durchlaufen werden würde. Das gäbe Probleme für Verbindungen vom PC, beispielsweise beim übertragen eines neuen Programms.

Das Programm hängt also in der Endlosschleife fest. In dem Fall ist das jedoch gewollt, denn sobald der Taster gedrückt wird, wird der Interrupt ausgelöst. Dadurch wird die buttonInterruptPort_OnInterrupt()-Methode ausgeführt, zählt den Zähler hoch und gibt die Meldung aus. Danach wird die Endlosschleife weiter ausgeführt.

Screenshot OutputWindow InterruptPort

Interessant ist auch der InterruptMode InterruptEdgeLevelHigh: Nachdem der Interrupt ausgelöst wurde, ist der Interrupt solange ausgeschaltet, bis dieser mit .ClearInterrupt() zurückgesetzt wurde. Die weiteren Modi sind selbsterklärend und auf der MSDN-Seite beschrieben.

 

Schalter über PullDown-Widerstand an .Net-Microcontroller anschließen - AufbauZusammenfassung

InterruptPorts verhalten sich ähnlich wie InputPorts. InterruptPorts reagieren jedoch auf Änderungen und werfen dann ein .Net-Event.

 

Quellen

MSDN: InterruptPort Class
MSDN: Port.InterruptMode Enumeration

 


Zurück zum NetMf-Tutorial-Index



Disclaimer

Die hier zusammen gestellten Informationen und Anleitungen habe ich mit bestem Wissen und Gewissen erstellt. Falls sich Fehler eingeschlichen haben oder du Verbesserungsvorschläge hast, schicke mir bitte eine Nachricht oder schreibe einen Kommentar unter den jeweiligen Beitrag. Informiere dich selber wie alles funktioniert. Ein Nachbau erfolgt auf eigene Gefahr. Du allein bist dafür verantwortlich, dass das, was du tust, funktioniert und keine Sach- oder Personenschäden verursacht.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.