Der Propeller Mikrocontroller verfügt über 32 Ein-/Ausgabepins, oder kurz I/O Pins, die mit Schaltkreisen verbunden werden können.
Auf dem Propeller Board of Education sind einige I/O Pins des Mikrocontrollers mit LEDs, einem VGA Video Ausgang, einem Kopfhörer Stereo Ausgang und weiteren Zusatzschaltungen fest verdrahtet; es verbleiben 16 frei zugängliche Propeller I/O Pins.
In dieser Station werden wir uns mit der Beschaltung und Programmierung der LEDs auf einem PropBoE bzw. PropAB beschäftigen.
Die Ausgänge eines Mikrocontrollers, die wir als Ports oder Portpin ansprechen, können entweder den Zustand 0 oder 1 annehmen. 0 ist gleichbedeutend mit 0 Volt oder Schalter aus, während 1 gleichbedeutend ist mit Betriebsspannung (die liegt je nach Mikrocontrollertyp bei 3,3 Volt oder 5 Volt) oder Schalter ein.
Ziele dieser Station
Wenn du die Station Blinklichter durchgearbeitet hast, bist du in der Lage ...
Neue Programmbefehle in dieser Station
Beschreibung | C Programmierung |
Kommentarblock | /* ... */ |
Kommentarzeile | // |
Endlosschleife |
while(1) { ... Befehlsblock } |
Port x einschalten |
high(pin); Beispiel: high(12); |
Port x ausschalten |
low(pin); Beispiel: low(14); |
Pause-Befehl | pause(<Zahl n in ms>); |
Definiert I/O Portpin als Eingang (0) oder als Ausgang (1) |
set_direction(pin, 0 oder 1); |
Definiert aufeinander folgende I/O Ports als Ein- oder Ausgang |
set_directions(pinoben, pinunten, Bitmuster) |
Port x ein-/ausschalten | set_output(pin, 0 oder 1); |
Aufeinander folgen- de Ports ein-/ausschalten | set_outputs(pinoben, pinunten, Bitmuster) |
Aufbau einer while-Schleife
while(Bedingung)
{
Befehlsblock
}
{wiederhole alle Befehle im Befehlsblock, solange die Bedingung gilt. Gilt die Bedingung nicht mehr, geht es mit dem ersten Befehl nach dem Befehlsblock weiter.}
while(1)
{
Befehlsblock
}
gilt immer, deshalb wird der {Befehlsblock} beliebig oft durchlaufen.
high(10);
schaltet Port 10 auf dem BoE auf Ausgang und legt dort den Pegel auf "1" oder "high".
low(12);
schaltet Port 12 auf dem BoE auf Ausgang und legt dort den Pegel auf "0" oder "low".
pause(100);
der Prozessor verweilt für 100 ms in einer Pausenschleife.
set_directions(pinoben, pinunten, Bitmuster);
im I/O-Register werden die I/O Pins mit Hilfe des Bitmusters auf 1 (Ausgang) oder 0 (Eingang) gesetzt. Die angesprochenen Pins müssen nebeneinander liegen. Beispiel: die Ports P8, P7 und P6 werden beschaltet, P7 ist ein Eingang, P8 und P6 fungieren als Ausgang. Dann lautet der Befehl: set_directions(8, 6, 0b101);
set_direction(pin, 0 oder 1);
das I/O Register wird für den Port pin auf 0 gesetzt, wenn er als Eingang und auf 1, wenn er als Ausgang genutzt werden soll.
set_outputs(pinoben, pinunten, Bitmuster);
an die Ausgänge der Ports pinoben - pinunten werden mit Hilfe eines Bitmusters Nullen (0 V) oder Einsen (+3,3 V) gelegt.
Liegen noch keine Programmierkenntnisse in der Sprache C vor, sollten die Übungen 1 bis 3 der Einführung in Propeller C bearbeitet werden. Dort wird die Arbeitsumgebung der Software SimpleIDE und der Aufbau eines C-Programms beschrieben.
Der Propeller Mikrocontroller verfügt über 32 I/O Ports oder I/O Pin. Über sie kann er mit anderen Schaltkreisen verbunden werden.
In dieser Übung nutzen wir die auf dem Prop-BoE bereits fest verdrahteten Anschlüsse, werden aber im weiteren Verlauf auch Schaltkreise auf dem Steckbrett aufbauen und diese dann mit den entsprechenden I/O Pin des Controller verbinden.
Die erste Schaltung ist bereits fertig aufgebaut auf dem Prop-BoE aufgebaut. Unterhalb des weißen Steckbretts befinden sich zwei kleine gelbe Rechtecke, die mit P26 und P27 beschriftet sind. Es handelt sich hier um zwei LEDs (Abb. 2).
Sinnvoll ist, hier das Datenblatt (engl.) des Herstellers Parallax einzusehen. In ihm sind die einzelnen Baugruppen deklariert und ausführlich beschrieben.
Material |
|
Aufgabe |
|
Das Programm St1_1.c
Wie arbeitet das Programm St1_1.c?
Zeile 9
Hier beginnt eine Endlosschleife. Alle Befehle innerhalb der geschweiften Klammern (von Zeile 11 bis Zeile 14) werden immer wieder ausgeführt.
Zeile 11
Der Funktionsaufruf HIGH(26) setzt den Ausgang P26 des Propeller Chips auf 1, was gleichbedeutend damit ist, dass am Pin die Versorgungsspannung von 3,3V liegt. Die Anode der Diode liegt auf +3,3V, die Kathode auf 0V, damit ist die LED in Durchlassrichtung gepolt und ein Strom kann fließen; die LED leuchtet.
Zeile 12
Es tritt eine kurze Pause von 100ms ein, in der der Prozessor so gut wie nichts tut. Aber die LED bleibt an.
Zeile 13
LOW(26) setzt P26 zurück auf 0V; Anode und Kathode der LED liegen auf 0V, damit ist die Diode in Sperrichtung gepolt und geht aus.
Zeile 14
Es folgt wieder eine Pause von 100ms, in der nichts passiert; die LED bleibt aus.
Zeile 15
Hier endet der Blockbereich der Endlosschleife aus Zeile 9.
Die Befehle in den Zeilen 11 bis 14 bezeichnet man auch als Befehlsblock der Endlosschleife oder als Befehlsblock der WHILE-Schleife. Da eine Abbruchbedingung fehlt, die dazu führen würde, dass die Befehle im Befehlsblock nicht mehr ausgeführt werden, blinkt die LED so lange, bis der PWR-Schalter am Prop-BoE oder Prop-AB auf 0 gestellt wird.
Nach dieser ersten Übung wagen wir uns an eine etwas komplexere Aufgabe. Auf dem Prop-BoE gibt es weitere fest verdrahtete LED unterschiedlicher Farbe; sie befinden sich links neben dem Steckbrett und sind entsprechend ihrer Farbe beschriftet mit: R für rot, G für grün und B für blau. Die LEDs mit der Bezeichnung H und V leuchten gelb, mit D0 blau und mit D1 rot.
Übung 2
Material |
|
Aufgaben |
|
Schaltungsaufbau und Schaltskizze
Programmcode zu Teilaufgabe 1 grüne LED leuchtet im Sekundentakt
Programmcode zu Teilaufgabe 3 grüne und blaue LED
Wie funktionieren die beiden Schaltungen St1_2gruen und St1_2GruenBlau?
Programm St1_2gruen.c
Zeile 8: Mit dem Funktionsaufruf high(2)geht der I/O-Portausgang des Propellerchips P02 auf high oder 1. Dies ist gleichbedeutend damit, dass der Ausgangspin P02 auf + 3,3 V gesetzt wird.
Wenn an P01 +3,3 V liegen, ist die Diode LEDgrün durchgeschaltet, es fließt ein Strom und die LED beginnt zu leuchten.
Zeile 9: Pause von 500 ms. Die LED leuchtet weiter.
Zeile 10: I/O Port 02 wird auf low oder 0 gesetzt. Die Diode erlischt.
Zeile 11: Pause von 500 ms. Die LED bleibt aus.
Die vier Befehle befinden sich in dem von geschweiften Klammern eingerahmten Befehlsblock einer while-Schleife. Sie wird beliebig oft durchlaufen, so dass sich der oben beschriebene Vorgang ständig wiederholt.
Programm St1_2GruenBlau.c
Zeile 8: Mit dem Funktionsaufruf high(2)geht der I/O-Portausgang des Propellerchips P02 auf high oder 1. Dies ist gleichbedeutend damit, dass der Ausgangspin P02 auf + 3,3 V gesetzt wird.
Wenn an P01 +3,3 V liegen, ist die Diode LEDgrün durchgeschaltet, es fließt ein Strom und die LED beginnt zu leuchten.
Zeile 9: Pause von 2000 ms. Die LED grün leuchtet weiter.
Zeile 10: I/O Port 02 wird auf low oder 0 gesetzt. Die Diode erlischt.
Zeile 11: Die LED blau an P5 wird eingeschaltet.
Zeile 12: Pause von 1000 ms. Die LED blau bleibt an.
Zeile 13: Die LED blau an P5 wird ausgeschaltet.
Die sechs Befehle befinden sich in dem von geschweiften Klammern eingerahmten Befehlsblock einer while-Schleife. Sie wird beliebig oft durchlaufen, so dass sich der oben beschriebene Vorgang ständig wiederholt.
Jetzt kommst du!
Die Blinkgeschwindigkeit (Blinkfrequenz) lässt sich dadurch erhöhen, dass die Pause zwischen dem Ein- und Ausschalten der Leuchtdiode verkürzt wird. Die LED wird zum Beispiel doppelt so schnell blinken, wenn die Pausenzeit halbiert wird. Probiere es aus und speicher das fertige Projekt unter St1_3 ab.
Experimentierecke
Schreibe ein neues Programm St1_ampel, bei dem eine Ampelanlage simuliert wird. Die Phasen einer normalen Ampelanlage sind: rot - rot/gelb - grün - gelb - rot.
Die Zeiten zwischen den einzelnen Phasen werden wie folgt festgelegt: Rotphase: 10 s, Rot/Gelbphase: 3 s, Grünphase: 15 s, Gelbphase: 5 s.
Erweiterung
An den bisherigen Programmen haben wir gesehen, dass der Programmieraufwand sehr groß werden kann, wenn mehr als eine LED zum Leuchten gebracht wird.
Die folgende Übung zeigt, wie sich sechs nebeneinander liegende LEDs auf dem PropBOE als Lauflicht programmieren lassen. Mit den beiden bisher bekannten Befehlen HIGH und LOW gelingt das nur schwer. Es müssen viele Programmzeilen geschrieben werden und es "kostet" viel Speicherplatz.
Einfacher geht es mit zwei neuen Befehlen: set_directions und set_outputs. Ein Auszug aus der Bibliothek von simpletools beschreibt beide Funktionen.
Der Propeller-Mikrocontroller verfügt über 32 sogenannte I/O Ports, von denen 16 für uns frei verfügbar sind. Diese frei verfügbaren 16 Ports können sowohl Eingabe- als auch Ausgabeport sein. Wann sie welche Funktion übernehmen, wird mit Hilfe sogenannter I/O-Register gesteuert. Steht eine 0 im Register, wird der entsprechende Port zum Eingang, eine 1 macht ihn zum Ausgang.
Bis jetzt haben wir uns darüber keine Gedanken machen müssen. Wir haben gelernt, dass der Aufruf des Befehls high(8) an den Ausgang von Port 8 eine 1 und low(8) entsprechend eine 0 legt. Wenn sechs LEDs, angeschlossen an den Ports 8, 7, ..., 3 nacheinander ein- und ausgeschaltet werden sollen, dann ließe sich das mit den bisherigen Befehlen wie folgt umsetzen:
Mit zwei neuen Befehlen reduziert sich der Programmieraufwand erheblich.
... legt fest, welcher von aufeinander folgenden Pins Eingang (0) und welcher Ausgang (1) wird.
legt fest, welcher Pegel (0 oder 1) an welchem Ausgang anliegen soll.
Aufgabe |
|
Programm St1_outputs.c
Wie funktioniert St1_outputs.c?
Zeile 9: Die I/O-Ports 3 ... 8 werden auf Ausgang gesetzt -> "1".
Zeile 10: Die Pegel 0 oder 1 werden in der Reihenfolge von oben nach unten gesetzt.
Port P8 P7 P6 P5 P4 P3 Pin des Controllers
Pegel am Ausgang 1 0 1 0 1 0 0 Volt oder 3,3 Volt
I/O Register 1 1 1 1 1 1 mit set_directions auf Ausgang (1) gesetzt
In der folgenden Übung 4 werden sogenannte Feldvariable benutzt. Wenn man damit noch nicht vertraut ist, sollte vorher der Unterabschnitt Feldvariable im Kapitel Variable und reelle Zahlen durchgearbeitet werden.
Material |
|
Aufgabe |
|
Programm St1_lauflicht.c
Wie funktioniert das Programm St1_lauflicht.c?
Zeile 09 Das Feld maske[] enthält sechs Elemente in der ge-
schweiften Klammer in binärer
Schreibweise. Binäre
Zahldarstellungen beginnen
mit der Zeichenkette 0b
Zeile 14: Die I/O-Ports 3 ... 8 werden auf Ausgang gesetzt -> 1.
Zeile 15: Zählschleife von i = 0 bis i = 5, jeweils um 1 erhöht bei
jedem Durchgang.
Zeile 17: Die Ausgangsports 3 ... 8 werden mit der Bitmaske
maske[i] angesteuert.
Zeile 18: Pause von 100 ms.
Was ist neu im Programm St1_lauflicht.c?
Es gibt zwei neue Befehle in diesem Programm: FOR ...{ } und die Deklaration maske[].
Mit FOR ... {} wird eine klassische Zählschleife eingeleitet. Weitere Informationen dazu gibt es in der Lerneinheit Einführung in Propeller-C.
Grundsätzlich gilt für jeden Aufbau einer FOR ... Schleife:
FOR (Anfangswert; bis Abbruchbedingung; incrementiere den Anfangswert)
gefolgt von einem Befehlsblock in geschweiften Klammern. Alle Befehle im Befehlsblock werden so lange durchlaufen, bis die Abbruchbedingung wirkt. ACHTUNG: wird die Abbruchbedingung nicht zielgenau gesetzt, kann es unter Umständen nie zu einem Programmabbruch kommen.
Beispiel
FOR (int i = 1; i <= 10; i++)
{
Befehlsblock;
}
maske[] ist ein sogenanntes Array. Weitere Informationen dazu finden sich ebenfalls in der Lerneinheit Einführung in Propeller-C.
Wenn noch Zeit bleibt, dann ...
...schreibe ein Programm, dass ein Lauflicht - bestehend aus den sechs LEDs der Übung 4 - erzeugt, dass von außen nach innen und zurück läuft. Es ist das Knight-Rider Lauflicht. Benutze zur Lösung ein Array und speicher das Projekt unter dem Namen St1_rider ab.