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

1 - Installation der Propeller Tool IDE

Die Programmierumgebung Propeller Tool ist kostenfrei im Internet bei Parallax Inc. herunterzuladen. Mit dieser Sprache wende ich mich an diejenigen, die bereits Erfahrung mit dem Programmieren haben und das Propeller Board of Education (Prop-BoE) oder Propeller Activity Board (Prop-AB) kennen und die die Stärken eines 8-Kern Prozessors und wie man ihn programmiert erlernen möchten. Die Sprache SPIN ist für dieses Mikrocontroller entwickelt worden und lehnt sich in der Syntax etwas an die Sprache C an.

Eine Einführung in die Sprache SPIN gibt es hier -> Einführung in SPIN

2 - Propeller Board identifizieren

Nach dem Installieren und Laden der Software erscheint die Oberfläche der Propeller Tool IDE. Wähle aus dem Hauptmenü Run - Identify Hardware ....

Die IDE identifiziert damit das angeschlossene Board und gibt bei Erfolg eine entsprechende Meldung auf den Bildschirm aus.

In einem zweiten Schritt wird wieder über das Hauptmenü Run - Parallax Serial Terminal ... das Terminalfenster geöffnet und unten links der im Informationsfenster angezeigte COM-Port eingestellt.

3 - LED ein- und ausschalten

Der Propeller Controller verfügt über 32 I/O Pin, die sich als Ausgänge aber auch als Eingänge beschalten lassen. In der ersten Übung wird eine LED mit dem I/O Pin P9 verbunden und das zugehörige SPIN-Programm lässt die LED im Takt blinken. Nix aufregendes, aber man lernt mit diesem einfachen Programm die Sprache SPIN kennen.

Schaltungsaufbau

Abbildung 1 - Schaltungsaufbau auf einem Prop-BoE mit einer LED (Courtesy of Parallax Inc.)

Start des Programms - die Entwicklungsumgebung von Propeller Tool

Die IDE ist in drei große Bereiche aufgeteilt. Oben links befindet sich das Fenster, in dem die aktuell bearbeitete Datei, die wir zukünftig als Objekt ansprechen, erscheint. Darunter sind die Ordner und die Programmobjekte zu sehen, mit denen man aktuell arbeitet. Der grün umrandete Bereich ist der Programmeditor, in dem das aktuell bearbeitete Programm gelistet ist.

 

Sprachliche Festlegung

Programmdateien, die SPIN-Code enthalten, werden wir zukünftig Objekte nennen. Ein Objekt kann Programmcode anderer Objekte nutzen. Dies sind dann Objekte einer Benutzerbibliothek, sie enthalten Blöcke von Programmcode, die wir als Methoden ansprechen.

Das Programm LED_1.spin

Abbildung 3 - Programm LED_1.spin

Ein Programm starten

Öffne im Hauptmenü von Propeller Tool (PT) das Menü Run. Es werden zwei Optionen angeboten (Abb. 4).

Abbildung 4 - PT Hauptmenü Run - Load RAM F10

Über Run - Compile Current - Load RAM oder F10 wird ein Programm im RAM-Bereich abgelegt und ist nach dem Ausschalten der Versorgungsspannung gelöscht. Die Alternative ist Run - Compile Current - Load EEPROM oder F11. Das Programm wird im EEPROM abgelegt und bleibt auch nach einem Abschalten der Versorgungsspannung erhalten. Während man ein Programm aufbaut und erprobt, ist es völlig ausreichend es über Run - Compile Current - Load RAM oder F10 zu starten.

Wie arbeitet das Programm LED_1.spin?

  • Der PUB-Block

Der Programmcode beginnt mit dem Schlüsselwort PUB, für einen Block. Jedes SPIN-Programm besteht aus mindestens einem PUB-Block. In der Sprache C ist das ähnlich, da gibt es zum Beispiel void main() oder bei Arduino C void loop().

 

  • Der CON-Block

Im Block CON werden die Konstanten definiert. Im Programm LED_1.spin gibt es noch keinen Konstantenblock. Das lässt sich aber schnell nachholen, wenn man den Pin 9, an dem die LED angeschlossen ist, als Konstante deklarieren. Das sieht dann so aus:

Abbildung 4 - Programm LED_1a.spin

Das Programm LED_1a.spin tut das gleiche wie LED_1.spin, mit dem Unterschied, dass der Pinport als konstante Größe im CON-Block deklariert wurde. Änderungen im Programm lassen sich damit viel leichter durchführen, weil nur noch in einer Zeile ein Wert zu ändern ist.

  • dira[9] := 1

In SPIN ist das Symbol := ein Zuweisungsoperator. Das was rechts steht, wird dem was links steht zugeordnet.

Die allgemeine Bedeutung dieses Befehls ist:

  • dira[pin] = 0   macht Port pin zum Eingang
  • ina[pin] liest den Zustand am Port pin ein und gibt als Rückgabewert eine 0 (LOW bzw. unter 1,5V) oder 1 (HIGH bzw. über 1,5V) zurück. An den Ports sollten aus Schutzgründen keine Spannungen über 3,3V anliegen.
  • dira[pin] = 1   macht Port pin zum Ausgang
  • outa[pin] = 0 setzt den Ausgang pin auf GND, während eine 1 ihn auf HIGH setzt. In der Form outa[pin1 ... pinN] lassen sich mehrere nebeneinanderliegende Pin gleichzeitig setzen.

Die repeat-Schleife ohne jede Bedingung ist eine Endlosschleife. Die zur Schleife gehörenden Befehle werden eingerückt und markiert. Dies lässt sich über Edit - Preferences - Appearance - Show Block Group Indicators ein- bzw. ausschalten.

  • waitcnt(clkfreq + cnt)

Der Propeller Controller verträgt alle Taktfrequenzen zwischen 20kHz und 80MHz.

clkfreq ist eine Systemvariable, die die Taktzyklen (ticks) während einer Sekunde angibt. Arbeitet der Propeller mit 80MHz, dann ist die Taktfrequenz 80.000.000. Bei 20kHz entsprechend 20.000.

cnt ist der Systemtakt. Mit dem Hochfahren des Propeller-Controllers wird cnt auf 0 gesetzt und erhöht seinen Wert bei jedem Takt um 1, bis er den Wert 232 erreicht hat; dann fängt er wieder bei 0 an. cnt ist eine read-only Variable, sie lässt sich von außen nicht verändern.

waitcnt hält eine Programmausführung solange an, bis der Systemtakt den Wert in der Klammer erreicht hat und das ist hier cnt (aktueller Systemtakt) + clkfreq (das sind im Normalfall 80.000.000 ticks oder 1s). Eine halbe Sekunde würde dann über die Einstellung waitcnt(clkfreq / 2 + cnt) erreicht.

  • outa[9] := 0

Pin 9 ist Ausgang und wird auf Null (LOW) gesetzt; damit geht die LED an P9 aus.

Die letzten beiden Zeilen wiederholen sich und sind uns in der Wirkung bereits bekannt.

4 - Shortcuts

Einige Shortcuts sollen hier erwähnt werden, da ich sie in späteren Programmen benutzen werde.

  • dira[9]~~   entspricht dira[9] := 1

Die Doppeltilde setzt die Variable auf HIGH.

  • dira[9]~     entspricht dira[9] := 0

Die Einfachtilde setzt die Variable auf LOW

  • !outa[9]      entspricht outa[9] := 1, wenn es vorher 0 war und umgekehrt.

5 - Zwei LEDs mit zwei Tastern schalten

Zwei Taster schalten zwei LEDs
Material

1x  Prop-BoE oder Prop-AB

1x  Steckernetzteil

1x  USB-Verbindungskabel

2x  LED, rot und grün

2x  Mikrotaster

2x  Widerstand, 10kOhm

Aufgabe
  • Es gibt zwei Taster T1 und T2 und zwei LEDs. Jedem Taster ist eine LED zugeordnet. Wird ein Taster gedrückt geht die zugehörige LED an und wieder aus. Werden beide Taster gleichzeitig gedrückt, gehen beide LEDs an.

Das Programm Taster_LED.spin

Abbildung 5 - Mit zwei Tastern T1 und T2 werden zwei LEDs ein- und ausgeschaltet

Modifikation des Programms Taster_LED.spin

Statt mit zwei Tastern lässt sich die Einschaltung der beiden LEDs auch mit einem Schalter umsetzen.

Mit einem Taster zwei LEDs ein- und ausschalten
Aufgabe
  • Bei jedem Druck auf den Taster soll zuerst LED1, dann LED2, dann beide LEDs und dann keine LED leuchten. Drückt man weiter auf den Taster, fängt alles wieder von vorne an.

Dazu wird ein neuer Block VAR (Variable) mit der Variablen Zaehler eingerichtet. Mit jedem Tastendruck wird die Variable um 1 erhöht und wenn sie den Wert 4 angenommen hat, wieder auf Null zurückgesetzt.

In einer CASE-Anweisung werden anschließend die LEDs ein- bzw. ausgeschaltet, die dem Wert der Variablen Zaehler entsprechen.

Abbildung 6 - Modifikation des Programms Taster_LED.spin mit nur einem Taster

6 - Methodenvielfalt

In den bisherigen Programmen wurde nur eine Methode main benutzt. Methoden haben immer einen Namen und enthalten Programmcode. Neu ist, dass Methoden sich über ihren Namen auch in anderen Programmen aufrufen lassen und das diesen Methoden auch Parameter übergeben werden können. Das hat Vorteile und die sollen jetzt sichtbar werden.

 

Lade zuerst das Programm LED_1.spin in den Editor von PT. Ergänze die beiden Methoden HIGH(pin) und LOW(pin) und ändere die Programmzeilen in der Methode main ab, wie in Abb. 7 dargestellt.

Abbildung 7 - Einzelne Funktionsteile des Programms LED_1.spin werden in eigene Methoden überführt.

Das Programm enthält jetzt drei Methoden:

  • main
  • HIGH(pin) und
  • LOW(pin)

 

HIGH(pin) setzt den I/O pin auf HIGH und LOW(pin) auf LOW. Mit Run - Compile Current - Load RAM wird das Programm anschließend auf Fehler überprüft und unter dem neuen Namen LED_1b.spin abgespeichert.

Jetzt ist das Hauptprogramm main deutlich einfacher zu lesen, es wurde kürzer und hat weniger Programmzeilen. Es geht aber noch besser.

7 - Aufbau einer Benutzerbibliothek

In einem weiteren Schritt werden jetzt die beiden Methoden HIGH und LOW in ein neues Programm übertragen und unter dem Namen HIGH_LOW abgespeichert.

Eingerahmt von einer doppelt geschweiften Klammer {{  }} habe ich erläuternden Text mit in das Programm gesetzt, der sich auf die in ihm enthaltenen Methoden HIGH und LOW bezieht.

Abbildung 8 - Programm HIGH_LOW mit den Methoden high(pin) und low(pin)
Einbindung von Methoden im Hauptprogramm
Aufgabe
  • Lade über File - Open das Programm LED_1.spin aus Abschnitt 3 in den Editor. Es bewirkte, dass die LED an I/O Pin 9 ein- und ausgeschaltet wurde. Ändere dieses Programm so ab, wie in Abb. 8 dargestellt.  mit Hilfe der Methode HIGH_LOW ab und speichere es im selben Verzeichnis wie die Methode HIGH_LOW.
Abbildung 9 - Geändertes Programm LED_1.spin

Im OBJ-Block wird das Objekt "HIGH_LOW" über seinen Dateinamen HIGH_LOW aufgerufen (das war der Name, unter dem die Datei abgespeichert wurde!) und der Umgangs- oder Aufrufname pin zugewiesen. Innerhalb des Hauptprogramms lassen sich jetzt alle Methoden aus HIGH_LOW mit dem vorangestellten Aufrufnamen pin und einem folgenden Punkt ansprechen.

Oben links im Fenster wird angezeigt, dass das Programm LED_1_Methode_pin.spin das Objekt HIGH_LOW als Unterobjekt enthält.

 

Auf die hier gezeigte Art kann man sich im Laufe der Zeit eine effiziente Benutzerbibliothek aufbauen und Routinezeilen im Programm deutlich vereinfachen.

Druckversion Druckversion | Sitemap
© Reinhard Rahner - Gettorf