Basiskurs 1 – Abschnitt 1 - I/O Befehle
Das Fundamentum Propeller SPIN Programmierung wendet sich an Schüler, Studenten und Hobbyisten, die bereits Erfahrung mit Programmiersprachen haben.
Das Fundamentum besteht aus vier aufeinander aufbauenden Basiskursen:
Die Inhalte lehnen sich sehr stark an das von der Fa. Parallax Inc. herausgegebene Skript „Propeller Education Kit Labs von Andy Lindsay“ an.
Alle hier durchgeführten Versuche lassen sich auch über einen Raspberry Pi mit angeschlossenem Prop AB, Prop BoE oder Prop Flip auf einem Linux-Rechner durchführen.
Umfangreiche Dokumentationen zum Propeller Controller gibt es hier.
1.1 - Einleitung
Das Verhalten der Propeller I/O Pins , die auf INPUT (Eingang) gesetzt sind, werden in den folgenden Übungen mit einfachen Taster-Schaltungen überprüft. Die Ausgangspins eines Propeller Controllers werden mit einer 6-fach LED-Schaltung überwacht. Mit ihrer Hilfe lässt sich auch das Zeitverhalten der jeweils betrachteten Ereignisse näher studieren.
Mit Hilfe einfacher Taster- und LED-Beispiele werden eine Reihe von effektiven Programmiertechniken in der Sprache SPIN vorgestellt.
1.2 - Technische Voraussetzungen für alle Basiskurse
Im Basiskurs 1 lernst du …
Vorbereitungen auf den Basiskurs: Start eines Testprogramms
Mit Hilfe des Testprogramms led_tester.spin wird die Funktionstüchtigkeit des eingesetzten Boards überprüft; dies soll verhindern, dass man stundenlang nach Fehlern in seiner Schaltung sucht und das Problem ganz woanders liegt;-))
Testprogramm zur Vorbereitung auf den Basiskurs | |
Material |
|
Das Testprogramm led_tester.spin
Mit Ctrl-F10 wird das Programm geladen und die LED an P26 sollte jetzt im Sekundentakt blinken.
Damit sind die Vorbereitungen zum Basiskurs 1 abgeschlossen. Wir können mit der ersten Übung beginnen, schauen aber vorher erst noch auf den Sprachgebrauch im Umgang mit einem Propeller Chip.
1.3 - Propeller Nomenklatur
Einige Begrifflichkeiten, die spezifisch im Umgang mit einem Propeller Controller sind, werden hier kurz angesprochen.
Ein Prozessor auf einem Propeller Chip. Insgesamt sind acht COGS auf einem solchen Chip untergebracht; damit ist ein Propeller ein Super-Mikrocontroller mit acht Hochgeschwindigkeits 32-Bit Prozessoren. Jeder COG hat Zugriff auf die I/O Pins des Propeller Chips und auf 32 kB Global-RAM. Jeder COG verfügt über 2kB eigenen RAM, in dem ein SPIN Code Interpreter oder ein Assemblerprogramm laufen kann.
Programmier-Hochsprache für den Propeller Chip. COGS, die SPIN-Code ausführen, machen dies, indem sie aus dem RAM eines Propeller Chip einen SPIN-Interpreter laden. Mit den Operationen Holen und Ausführen (Fetch and execute) werden SPIN Befehle ausgeführt, die im Global RAM des Propeller Chips gespeichert sind.
In der Hochsprache SPIN wird dem COG mitgeteilt, WAS er tun soll, in Assembler wird dem COG mitgeteilt, WIE er es tun soll. Ein Assemblerprogramm erzeugt Maschinencode, der im RAM eines COGS abgelegt und direkt ausgeführt wird.
Ein Block ausführbarer SPIN Befehle mit einem Namen und Zugriffsregeln. Methoden können lokale temporäre Variablen erzeugen und Übergabewerte bereitstellen sowie Parameter enthalten.
Globale Variable stehen allen Methoden eines Objektes zur Verfügung, dabei wird Speicherplatz für die Zeit des Programmlaufs reserviert.
Lokale Variable werden innerhalb einer Methode definiert, sind nur in ihr abrufbar und existieren solange Kommandos in einer Methode ausgeführt werden.
Wird eine neue Methode aufgerufen, wird der Speicherplatz der lokalen Variablen wieder freigegeben und für lokale Variable dieser neuen Methode bereitgestellt.
Ein Anwendungsbaustein, der den gesamten Programmcode einer SPIN-Datei umfasst. Manche Propeller Anwendungen bestehen nur aus einem Objekt, die meisten aber aus mehreren.
Übung 1 – LED on mit Hilfe von Richtungs- und Ausgangsregister Bits
Das Richtungsregister (Data Direction Register – DDR) gibt für jeden Pin eines Ports an, ob er Ausgangs oder Eingang ist.
In dieser Übung soll eine an P4 angeschlossene LED mit Hilfe eines Programms LEDon.spin eingeschaltet werden. Dazu wird ein Befehl benutzt, der einen COG auf dem Propeller Chip anweist, seinen P4 I/O Pin als Ausgang zu deklarieren und ihn auf HIGH oder 1 zu setzen. Die dort angeschlossene LED leuchtet auf.
Übung 1 - LED on mit Hilfe von Richtungs- und Ausgangsregister Bits | |
Aufgaben |
|
Schaltskizze
Das Programm led_einschalten.pin
Wie arbeitet das Programm?
Zeilen 1 – 7
Kommentarzeilen, die immer mit ´´ beginnen.
Zeile 8 - 13
Reservierte Worte und Operatoren erscheinen in SPIN fett gedruckt.
Alle vom Propeller ausgeführten SPIN-Befehle müssen sich innerhalb eines Methoden-Blocks befinden. Zeile 8 startet einen solchen Methoden-Block mit der Zugriffsregel PUB (steht für public) und dem Namen LED_einschalten.
Das Register dira ist eines von mehreren Sonderregistern im COG RAM. Sie lassen sich lesen und beschreiben und speichern die I/O Pinrichtung für jeden I/O Pin. Eine 1 setzt das Register auf Ausgang, eine 0 auf Eingang. Das Symbol „:=“ ist ein Zuweisungsoperator.
Die Anweisung dira[4] := 1 weist dem Sonderregister dira eine 1 in Bit 4 zu; Pin 4 wird Ausgang.
Über das outa Register wird der Pin mit 1 oder HIGH auf 3,3 V und mit 0 oder LOW auf 0 V gesetzt.
Die Anweisung outa[4] := 1 weist dem Sonderregister outa eine 1 in Bit 4 zu und setzt den Pin auf 3,3 V. Die LED ist jetzt gegen Masse geschaltet; liegen 3,3 V an der LED, dann ist sie durchgeschaltet und leuchtet.
Jeder COG hat ein eigenes I/O Ausgangs- und I/O Richtungsregister. Zurzeit nutzen wir nur einen COG, so dass es keine Probleme geben kann. Später dazu mehr.
Der repeat-Befehl (Bedingungsbefehl) umfasst in der Regel weitere Befehle, die dann im Editor eingerückt (2 Positionen) untereinander im Programm erscheinen und ausgeführt werden, bis die Bedingung (Abbruchbedingung) erfüllt ist. In diesem Programm gibt es keine Abbruchbedingungen, so dass es in einer Endlosschleife verbleibt.
Ließe man diesen Befehl weg, wird das Programm beendet und der Controller würde sich, nach Abarbeitung aller Befehle, in den Low-Power Bereich begeben. Die LED würde dann zwar für einen sehr kurzen Augenblick eingeschaltet sein, dann aber sofort wieder ausgehen. Unser Auge würde den kurzen eingeschalteten Zustand nicht wahrnehmen.
Ein kompakteres Programm ergibt sich, wenn man mehrere Befehle in eine Zeile schreibt. Die Programmzeilen 10 und 11 ließen sich in einer Programmzeile zusammenfassen:
LED_on.spin verändern
Zwei oder mehrere Befehle lassen sich auch in einer Programmzeile unterbringen. Sollen zwei LEDs eingeschaltet werden, dann sieht das Programm wie folgt aus:
Übung 2 – I/O Pin Gruppenanweisungen
Dazu wird eine 6-stellige LED Anzeige benötigt, die auch in den weiteren Übungen eingesetzt werden kann. Auf einer Streifenplatine lässt sich eine solche Anzeige schnell und für ein paar Cent erstellen.
Bauanleitung – 6-fach LED Anzeige
Material
Schaltungsaufbau
In der Sprache SPIN lassen sich bitweise Wertezuordnungen in den Registern DIRA und OUTA auch so vornehmen, dass eine ganze Gruppe nebeneinanderliegender Bits angesprochen werden kann.
Mit Hilfe von Bitmustern lassen sich aber auch beliebige Registerbits gezielt ansprechen. Die Anweisung dazu kann im Binärformat oder als Dezimalzahl erfolgen.
setzt Bit 17 bis 22 im DIRA-Register auf Ausgang. Der Binärzahl-Indikator % sorgt dafür, dass die nachfolgende Ziffernfolge als Binärzahl interpretiert wird. Die Eingabe
setzt Bit 17 auf 0, Bit 18 und 19 auf 1 usw. Die Pinanschlüsse P18, P19 und P22 werden auf 1, P17 auf 0 usw. gesetzt, mit dem Ergebnis, dass nur die LEDs an P18, P19 und P22 leuchten. Das gleiche Ergebnis wird erzielt mit
Vertauscht man bei OUTA die Reihenfolge in den eckigen Klammern wird das inverse Bitmuster über die LEDs ausgegeben.
Übung 2 - I/O Pin Gruppenanweisung | |
Aufgaben |
|
Schaltskizze
Das Programm led_gruppenIOanweisung.spin
Ü2.1 - Eine weitere kleine Übung
Ist ein DIRA-Registerbit auf LOW oder 0 gesetzt, reagieren die OUTA-Register Bits nicht auf HIGH oder LOW. Ein I/O Pin, der als Eingang gesetzt wird, überprüft, ob an seinem Eingang ein HIGH oder LOW-Pegel liegt; er stellt aber keine Spannung zur Verfügung, wie ein Ausgang.
Mit diesem Wissen sollte die Wirkung des nachfolgenden kleinen Programms vorhergesagt werden können. Beschreibe sehr genau, welche der sechs LEDs warum leuchten.
Übung 3 – Eingänge abfragen, Ausgänge steuern
Mit der nachfolgenden Schaltung wird der Tasterzustand abgefragt und eine LED an- oder abgeschaltet.
Übung 3 - Eingänge abfragen, Ausgänge steuern | |
Aufgaben |
|
Schaltskizze
Wie arbeitet das Programm?
Der Schaltskizze entnimmt man, dass im offenen Schalterzustand an P0 Massepotential liegt (Pull-down-Schaltung). Wird T1 gedrückt, fällt über dem 10 kOhm Widerstand fast die gesamte Betriebsspannung ab und an P0 liegt 3,3 V oder HIGH.
P0 ist mit dem Befehl in Zeile 11 als Eingang deklariert. Im Registerbit INA[0] ist eine 0 gespeichert, solange der Taster T1 nicht gedrückt wird. Der gespeicherte Wert in INA[0] wird in Programmzeile 14 dem Registerbit OUTA[17] zugewiesen. Da der Wert 0 ist bei nicht gedrückter Taste, leuchtet die LED an P17 nicht.
Wird T1 gedrückt, liegt in INA[0] eine 1, die OUTA[17] zugeordnet wird und dazu führt, das die LED an P17 leuchtet.
Die Zuweisung steht innerhalb eines Wiederholungsblocks (REPEAT) und wird, da es keine Abbruchbedingung gibt, beliebig oft durchlaufen.
Ü3.1 - Eine weitere kleine Übung
Mit diesem Wissen lässt sich jetzt sehr einfach eine Schaltung mit zwei oder drei Tastern aufbauen, die jeweils eine beliebige LED aus den sechs vorhandenen ansteuert.
Eine mögliche Programmlösung zeigt die folgende Abbildung.
Ü3.2 - Noch eine kleine Übung
Liegen die I/O-Pin nebeneinander, lässt sich der Programmcode weiter verkürzen.
Ü3.3 - Fragen über Fragen
Hier geht es weiter mit dem Basiskurs 1 Abschnitt 2 - Verzögerungszeiten mit System