Wie ein Chip auf eine Taste wartet
Polling heißt, dass ein Programm einen Eingang immer wieder abfragt. Ein Interrupt heißt, dass der Chip das Programm unterbricht, sobald etwas geschieht.
Beides braucht eine Taste, ein Türkontakt oder ein Sensor. Eine echte Taste prellt, sie wechselt beim Drücken mehrmals hin und her. Wer das nicht beachtet, zählt einen Druck doppelt.
Am Ende dieser Lektion
Notiz
Ich kann erklären, wie Polling und Interrupts arbeiten und wie man prellende Messwerte entprellt.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Polling | ein Eingang wird in jedem Durchlauf abgefragt | |
| Interrupt | ein Signal, das den Chip unterbricht | |
| Handler | eine Funktion, die der Chip bei einem Interrupt aufruft | |
| Flanke | der Wechsel eines Pegels von 0 auf 1 | 0, 1 |
| Prellen | ein Kontakt wechselt kurz mehrmals hin und her | |
| Entprellen | ein prellendes Signal auf einen Wechsel zurückführen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Beim Polling fragt das Programm in jedem Tick
Ein Programm im Chip läuft in einer Schleife. Bei jedem Durchlauf liest es den Pin und prüft, ob sich etwas geändert hat.
Dazu merkt es sich den Zustand vom letzten Tick. Eine Taste gilt als gedrückt, wenn der Pin jetzt 1 und beim letzten Tick 0 war. Das ist eine steigende Flanke.
Beispiel: Flanken in acht Messwerten
| Tick | Messwert | Letzter Zustand | Flanke |
|---|---|---|---|
| 0 | 0 | 0 | nein |
| 1 | 1 | 0 | ja |
| 2 | 0 | 1 | nein |
| 3 | 1 | 0 | ja |
| 4 | 1 | 1 | nein |
| 5 | 0 | 1 | nein |
| 6 | 0 | 0 | nein |
| 7 | 1 | 0 | ja |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Flanken mit einem Zustand zählen
# Eine Taste, die jeden Tick gelesen wird (Polling)
messwerte = [0, 1, 0, 1, 1, 0, 0, 1]
letzter = 0 # der Zustand beim letzten Tick
anzahl = 0
for tick in range(len(messwerte)):
jetzt = messwerte[tick]
if jetzt == 1 and letzter == 0:
anzahl = anzahl + 1
print("Steigende Flanke bei Tick", tick)
letzter = jetzt
print("Flanken:", anzahl)
# Ändern Sie die Messwerte so, dass nur eine Flanke bleibt.
Das Lab-Skript fragt eine echte Taste ab
Das Skript poll.py gibt einer Taste zwölf Messwerte. Es ist ein einziger Druck, aber die Taste prellt. Sie springt bei Tick 2 auf 1, bei Tick 3 zurück und bei Tick 4 wieder hoch.
Jede Zeile zeigt Tick, Pin und, ob eine Flanke gesehen wurde: yes heißt ja. Die Wörter sind englisch. Am Ende steht die Zahl der gezählten Drücke.
Eine prellende Taste per Polling zählen
docker exec jupyter python3 steps/poll.pyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Interrupt ruft einen Handler auf
Bei einem Interrupt fragt das Programm nicht dauernd. Der Chip setzt bei einer Flanke ein Flag im Register IFR und ruft den Handler auf, eine Funktion, die Sie vorher festgelegt haben.
Im Lab muss dazu das Bit IE im Register TCCR gesetzt sein. Das Programm kann in der Zwischenzeit etwas anderes tun, zum Beispiel schlafen und Strom sparen.
Das zweite Lab-Skript nutzt einen Handler
Das Skript interrupt.py gibt der Taste dieselben zwölf Messwerte. Der Chip ruft den Handler bei jeder steigenden Flanke auf, also bei Tick 2 und bei Tick 4.
Danach wartet es eine Sperrzeit von drei Ticks ab und behält nur den ersten Aufruf. Die Ausgabe nennt die Zahl der Aufrufe und die Zahl der behaltenen.
Dieselbe Taste mit einem Interrupt zählen
docker exec jupyter python3 steps/interrupt.pyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Entprellen lässt nur einen Wechsel gelten
Es gibt zwei übliche Wege. Beim ersten gilt nach einem Wechsel eine Sperrzeit: Weitere Wechsel in den nächsten Ticks werden ignoriert.
Beim zweiten gilt ein neuer Pegel erst, wenn die letzten n Messwerte alle gleich waren. Beide Wege sind nur eine Regel auf den Messwerten und lassen sich in Python prüfen.
Ein häufiger Fehler
Warnung
Viele denken, ein Interrupt beseitige das Prellen. Das stimmt nicht: Der Handler lief bei jeder Flanke, hier zweimal für einen Druck. Ein Interrupt spart nur das ständige Fragen. Das Prellen steckt weiter im Signal, und Ihr Code muss es entprellen.