Wie liest ein winziger Chip einen Taster?
In einer Waschmaschine, einem Thermostat oder einem Spielcontroller steckt ein kleiner Chip ohne Bildschirm und Tastatur. Er muss einen Taster bemerken, ein Licht einschalten und einen Motor regeln, nur indem er ein paar Zahlen schreibt und liest. Diese Lektion nutzt einen erfundenen Chip, in Python simuliert, damit du diese Zahlen sich ändern siehst.
Am Ende dieser Lektion
Notiz
Ich kann ein Register binär lesen und sagen, was das Setzen, Löschen oder Umschalten eines Bits bewirkt.
Schlüsselwörter
- Register: ein kleiner nummerierter Speicher im Chip, hier 8 Bit breit.
- Bit: eine 0 oder eine 1. Bit 0 ist das ganz rechts.
- Maske: eine Zahl, mit der man bestimmte Bits herausgreift oder ändert.
- Pin: ein metallenes Beinchen des Chips, hoch (1) oder niedrig (0).
- PWM: Pulsweitenmodulation, ein Pin, der sehr schnell ein- und ausgeschaltet wird, wobei der Anteil der Einschaltzeit die Stärke der Wirkung bestimmt.
- Interrupt: ein Signal, das den Chip anhält und einen Handler ausführen lässt.
Zum Einstieg: was du schon weißt
Notiz
Antworte im Kopf. 1. Welche gewöhnliche Zahl ist die Binärzahl 1010? 2. Wie viele verschiedene Werte passen in 8 Bit? 3. Was macht print in Python? Antworten: 10; 256, von 0 bis 255; es zeigt einen Wert auf dem Bildschirm an.
Bevor du anfängst
Notiz
Klicke oben in der Leiste dieser Lektion auf Lab starten und warte, bis dort steht, dass es läuft. Es gibt einen Container, jupyter, und das Terminal erreicht sein Python mit docker exec jupyter, das einen Befehl darin ausführt. Der Chip ist ein Simulator eines erfundenen Chips, kein echtes Board: Echte Chips haben andere Register, andere Namen und viel mehr Regeln. Der Link JupyterLab öffnet seine Webseite, Port 8888. Jede Schaltfläche Ausführen unten tippt ihren Befehl ins Terminal deines Labs, einen nach dem anderen in derselben Sitzung. Wenn du zuschauen oder eigene Befehle tippen willst, klicke in der Leiste auf Terminal öffnen (neuer Tab).
Ein Chip ist eine Handvoll Register
ls listet den Arbeitsordner auf: mcu.py ist der Chip, start.ipynb ein Notebook und steps die Skripte. Das erste Skript setzt den Chip zurück und gibt jedes Register binär, hexadezimal und als gewöhnliche Zahl aus. Es gibt sieben: DDR (welche Pins Ausgänge sind), PORT (was die Ausgänge treiben), PIN (was die Pins lesen), TCCR (die Timer-Steuerung), TCNT (der Timer-Zähler), OCR (der Vergleichswert) und IFR (das Interrupt-Flag). Nach einem Reset sind alle sieben 0b00000000.
docker exec jupyter lsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
docker exec jupyter python3 steps/registers.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 Bit ändert man mit einer Maske
Das Skript beginnt mit PORT bei 0b00001010. Ein ODER mit einer Maske setzt ein Bit und ergibt 0b00001011. Ein UND mit dem Gegenteil einer Maske löscht eines und ergibt 0b00001001. Ein XOR schaltet eines um und ergibt 0b00000001, und dasselbe Umschalten noch einmal bringt 0b00001001 zurück. Jedes Mal ändert sich nur das gewählte Bit, und genau dafür ist eine Maske da.
docker exec jupyter python3 steps/bits.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 Pin ist ein Bit, das man von außen sieht
Eine 1 in DDR macht einen Pin zum Ausgang. Das Skript macht Pin 0 zum Ausgang, schreibt eine 1 in Bit 0 von PORT, und PIN liest 0b00000001. Dann schaltet es das Bit acht Takte lang in jedem Takt um und gibt #.#.#.#. aus, ein blinkendes Licht: # heißt an und . aus.
docker exec jupyter python3 steps/pins.pyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Prüfe dich
Tipp
Welches Register entscheidet, ob ein Pin ein Ausgang ist, und was würde PIN für einen Ausgangspin zeigen, den PORT auf 1 gesetzt hat? Antwort: DDR, und eine 1, weil ein Ausgangspin zeigt, was der Chip treibt.
PWM ist ein Pin, der in jeder Periode einen Teil der Zeit an ist
Der Timer zählt von 0 bis 15 und beginnt dann von vorn, eine Periode dauert also 16 Takte. Solange TCNT kleiner als OCR ist, ist Pin 5 hoch. Das Skript probiert OCR mit 4, 8 und 12 und gibt von jedem eine Periode aus: vier Takte an und 12 aus sind 25 Prozent, acht und acht sind 50 Prozent, und 12 an und vier aus sind 75 Prozent. Dieser Anteil ist das Tastverhältnis, und so kann ein echter Chip ein Licht dimmen oder einen Motor bremsen, nur mit an und aus.
docker exec jupyter python3 steps/pwm.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 Taster prellt, deshalb kommt es darauf an, wie man zuhört
Ein echter Taster geht nicht einmal sauber von 0 auf 1: Er flackert. Das erste Skript fragt den Pin in jedem Takt ab, und ein einziger Druck lässt es zwei steigende Flanken sehen, bei Takt 2 und 4, es zählt also 2 Drücke. Das zweite Skript lässt den Chip das Interrupt-Flag setzen und einen Handler aufrufen. Er wird zweimal aufgerufen, bei Takt 2 und 4, bei denselben zwei Flanken. Dann ignoriert der Handler einen Aufruf, der weniger als drei Takte nach dem letzten behaltenen kommt, und ein einziger Druck wird gezählt.
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.
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.
Ein häufiger Fehler
Warnung
Viele glauben, ein Interrupt beseitige das Prellen. Das tut er nicht: Der Handler lief für jede Flanke, zweimal für einen einzigen Druck. Ein Interrupt bedeutet nur, dass der Chip nicht ständig nachfragen muss. Das Prellen steckt weiter im Signal, und dein Code muss damit umgehen. Denke auch daran, dass dies ein Simulator ist: Bei einem echten Chip sind Registernamen und Bitpositionen anders, und das Datenblatt hat das letzte Wort.
Dieselbe Arbeit in einem Notebook
Öffne JupyterLab über die Leiste und doppelklicke auf start.ipynb. Es baut den Chip, schreibt in Register und erzeugt ein PWM-Signal, Zelle für Zelle. Klicke auf eine Zelle und drücke Umschalt und Eingabe, um sie auszuführen. Die letzte Zelle bittet dich, den Vergleichswert zu ändern und zu sagen, wie groß das Tastverhältnis jetzt ist. mcu.py ist kurz und kommentiert: Öffne es neben dem Notebook und lies es.
Abschlussprüfung
Tipp
Antworte, ohne zurückzuschauen. 1. Welche Operation setzt ein Bit, und welche schaltet eines um? 2. Wie groß ist das Tastverhältnis bei einer Periode von 16 Takten und einem Vergleichswert von 8? 3. Warum wurde ein einziger Druck doppelt gezählt? 4. Ist dieser Chip ein echter Chip? Antworten: ODER setzt und XOR schaltet um; 50 Prozent; der Taster prellte und jede steigende Flanke wurde gezählt; nein, es ist ein Simulator eines erfundenen Chips.
Für Lehrkräfte
Tipp
Diese Lektion ist ein kleines Beispiel für eine Lektion, die in einem Lab abläuft: Die Schritte und die Schaltflächen „Ausführen“ sind die Lektion, und das Lab ist die eigene Kopie jeder lernenden Person. Das Lab ist ein Dienst, JupyterLab mit einem kurzen Python-Simulator eines erfundenen 8-Bit-Chips, und nichts hier bewertet sich selbst: Die Lernenden geben ein kurzes eigenes Skript oder Notebook ab, das mcu.py nutzt, aus JupyterLab heruntergeladen, und einen Satz dazu, was die Register gezeigt haben. Kernpunkte: 1. Ein Register ist eine Zahl, deren Bits jeweils etwas bedeuten. 2. Eine Maske setzt, löscht oder schaltet gewählte Bits um. 3. Ein Timer und ein Vergleichswert erzeugen ein PWM-Signal. 4. Ein Taster lässt sich abfragen oder per Interrupt behandeln, und in beiden Fällen prellt er. Häufiger Fehler: glauben, ein Interrupt beseitige das Prellen. Material: das Lab und ein Browser. Tipp: Lassen Sie die Lernenden jede ausgegebene Zeile vorhersagen, bevor sie auf „Ausführen“ klicken. Machen Sie deutlich, dass es ein Simulator ist: Echte Chips unterscheiden sich, und für einen echten liest man das Datenblatt. Kopieren Sie die Lektion in Ihr eigenes Modul und ändern Sie sie, oder bauen Sie im Lektionseditor über das Menü Lab eine neue von Grund auf.