Unterrichts- und Lernmaterial für Mikrocontroller
Unterrichts- und Lernmaterial fürMikrocontroller

Fundamentum Propeller SPIN Programmierung

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:

  • Basiskurs 1 – I/O Befehle und Grundlagen zum Zeitverhalten
  • Basiskurs 2 – Methoden und COGS
  • Basiskurs 3 – Objekte
  • Basiskurs 4 – Zählmodule und Schaltungsanwendungen

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

 

  • Installation der kostenfreien Software Propeller Tool von Parallax Inc. und Basiskenntnisse über die Oberfläche der Software.
  • Ein Propeller Board of Education (BoE) oder Propeller Activity Board (AB) oder ein  Propeller Flip Board (FB) mit Steckbrett. Netzteil und USB-Kabel.

Im Basiskurs 1 lernst du …

  • eine LED ein- und auszuschalten – Zuweisung einer I/O Pin Richtung; Deklaration von Ausgängen.
  • Gruppen von LEDs einschalten – Gruppenzuweisung von I/O Pin-Richtungen.
  • Anzeigen von Taster-Zuständen über LEDs – Eingänge abfragen und Ausgänge entsprechend setzen.
  • Anzeigen von Taster-Gruppenzuständen mit Hilfe mehrerer LEDs – parallel eine Gruppe von Eingängen überwachen und ihren Zustand über eine Gruppe von Ausgängen anzeigen.
  • Synchronisierte LED an/aus Signale – Zeitereignisse mit Hilfe eines Taktregisters auszählen
  • Systemtakt eines Propeller Chips verändern – Auswahl eines Taktgebers und konfigurieren des Phase-Locked-Loop (PLL) Frequenz-Multipliers eines Propeller Chips.
  • Anzeige von ein/aus Mustern – Einführung weitere SPIN-Operatoren, die auf das  I/O Register zugreifen.
  • Anzeige binärer Zählungen – Einführung mehrerer Operatortypen und von Bedingungsschleifen.
  • Ein Lichtmuster verschieben – Schiebeoperationen und Programmcode für bedingte Ausführungen.
  • Ein Lichtmuster mit Hilfe einer tastengesteuerten Refresh-Rate verschieben – globale und lokale Variable und weitere Bedingungsblöcke
  • Zeitmessung mit binärer Sekundenangabe über ein LED-Display – Einführung synchronisierter Zeitereignisse, die unabhängig von anderen Aufgaben in einem bestimmten COG ablaufen.

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
  • 6x  LED – 2 rot, 2 grün, 2 gelb
  • 3x  Taster – offen
  • 3x  Widerstand, 10 kOhm
  • 9x Widerstand, 470 Ohm
  • 1x  Propeller Board of Education (BoE)
    alternativ: Propeller Activity Board (AB) oder Propeller Flip Board (FB)

Das Testprogramm led_tester.spin

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Abb. 1

Testerprogramm in den Editor der Propeller Tool IDE eingeben und mit Ctrl-10 starten.

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.

  • COG

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.

  • SPIN

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.

  • Propeller und Assembler

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.

  • Methode

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 und lokale Variable

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.

  • Objekte

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
  • Baue die Schaltung nach Schaltskizze auf.
  • Übertrage das Programm led_einschalten.pin in den Propeller Tool Editor und speichere es ab.
  • Starte das Programm und überprüfe es auf Fehlerfreiheit.

Schaltskizze

 

 

 

 

 

 

 

 

 

 

 

Abb. 2

Schaltungsaufbau mit einem Parallax FLIP Controller.

Das Programm led_einschalten.pin

 

 

 

 

 

 

 

 

Abb. 3

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:

  • dira[4] := outa[4] := 1

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:

 

 

 

 

 

Abb. 3a

LED1 an P17 und LED2 an P18 werden eingeschaltet.

Ü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

  • 1x Streifenplatine
  • 6x  LED (je 2x rot, grün, gelb)
  • 1x  SIL 7x 470 Ohm
  • 1x  Stiftleiste

 

Schaltungsaufbau

 

 

 

 

Abb. 4a

6-fach LED Anzeige auf einer Streifenplatine.

 

 

 

Abb. 4b

Rückseite (Lötseite) der Platine. Sechs Leiterbahnen müssen mit einer kleinen Feile durchtrennt werden.

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.

 

  • DIRA[17..22] := %111111

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

  • DIRA[17..22] := 63 erzielt das gleiche Ergebnis.
  • OUTA[17..22] := %011010

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

  • OUTA[17..22] := 41.

Vertauscht man bei OUTA die Reihenfolge in den eckigen Klammern wird das inverse Bitmuster über die LEDs ausgegeben.

  • OUTA[22..17] := %011010
Übung 2 - I/O Pin Gruppenanweisung
Aufgaben
  • Baue die Schaltung nach Schaltskizze auf.
  • Übertrage das Programm led_gruppenIOanweisung.spin in den Propeller Tool Editor und speichere es ab.
  • Starte das Programm und überprüfe es auf Fehlerfreiheit.

Schaltskizze

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Abb. 5

Schaltskizze mit Propeller Flip und 6x LED.

Das Programm led_gruppenIOanweisung.spin

 

 

 

 

 

 

Abb. 6

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.

 

 

 

 

 

Abb. 7

Welche der sechs LEDs leuchten auf, welche nicht. Begründe mit eigenen Worten deine Entscheidung.

Ü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
  • Baue die Schaltung nach Schaltskizze auf.
  • Übertrage das Programm taster_led.spin in den Propeller Tool Editor und speichere es ab.
  • Starte das Programm und überprüfe es auf Fehlerfreiheit.

Schaltskizze

 

 

 

 

 

 

 

 

 

 

 

 

Abb. 8

Die LEDs sind mit den Ausgängen P17 bis P22 verbunden; der Taster T1 ist über einen 470 Ohm Widerstand mit P0 verbunden.

 

 

 

 

 

 

 

 

Abb. 9

Über einen Taster an P0 wird eine LED an P17 angesteuert.

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.

  • Erweitere die Schaltung aus Übung 3 mit zwei weiteren Schaltern T2 an P24 und T3 an P25. Schreibe ein Programm, bei dem T1 LED1, T2 LED3 und T3 LED5 ansteuert.

Eine mögliche Programmlösung zeigt die folgende Abbildung.

 

 

 

 

 

 

Abb. 10

Die drei Taster sind mit P0, P24 und P25 verbunden. Die sechs LEDs mit P17 .. P22.

T1 steuert LED1 an P17, T2 LED2 an P19 und T3 LED3 an P21.

Ü3.2 - Noch eine kleine Übung

Liegen die I/O-Pin nebeneinander, lässt sich der Programmcode weiter verkürzen.

  • Baue die Schaltung aus U3.1 so um, dass die Taster T1 bis T3 mit P24..P26 des Propeller Controllers verbunden sind. Schreibe ein Programm, dass bei einem Tastendruck auf einen beliebigen der drei Taster jeweils genau eine LED aufleuchten lässt. Hinweis: Formuliere das Programm mit nur einem OUTA-Aufruf.

 

 

 

 

 

 

Abb. 11

Mit nur einem Ausführungsbefehl in der Bedingungsschleife lassen sich drei Taster abfragen und jeweils eine bestimmte LED ansteuern.

Ü3.3 - Fragen über Fragen

  • Kehre die Reihenfolge der Pins um in OUTA[22..17]. Welche Auswirkungen hat dies auf die Taster und ihre Verbindung zu den LEDs?
  • Was passiert, wenn die Reihenfolge umgekehrt wird in INA[26..24]?

Hier geht es weiter mit dem Basiskurs 1  Abschnitt 2 - Verzögerungszeiten mit System

Druckversion | Sitemap
© Reinhard Rahner - Gettorf