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

Die Software Propeller IDE ist Grundlage dieses Abschnitts und kann kostenlos bei Parallax Inc. aus dem Internet heruntergeladen werden.

1 – LED Blinker

LED Blinker
Aufgaben
  • Erstelle eine Schaltung und ein Programm, die bzw. das eine LED an P15 mit einer Frequenz von 1Hz zum Blinken bringt.
  • Gib das Programm LED1_blink.spin in den Editor ein und speichere es ab.
  • Starte das Programm aus dem Hauptmenü über Run – Compile Current – Load RAM.
  • Überzeuge dich, dass die LED im Sekundentakt leuchtet.
Material
  • 1x  Prop-AB oder Prop-BoE mit USB-Verbindungskabel
  • 1x  Steckdraht

Schaltungsaufbau

Abbildung 0 - Schaltungsaufbau auf dem Prop-BoE. Auf dem Prop-AB kann P27 oder P28 genommen werden..

Das Programm LED1_blink.spin

Abbildung 1 - Programm LED1_blink.spin

Wie arbeitet das Programm?

Das Programm startet mit Programmzeile 10 mit dem Blockkennzeichner pub LED1_blink. Der Text muss ganz links in der Zeile beginnen. Einrückungen sind an manchen Stellen entscheidend, während Groß- und Kleinschreibung beliebig gewählt werden können.

 

Programmzeile 12

Der Befehl dira[15] := 1 setzt den I/O Port 15 des Controllers auf Ausgang.

Programmzeile 13

Repeat leitet eine Schleife ohne Abbruchbedingung ein, die aus insgesamt vier Befehlen besteht. Alle nachfolgenden eingerückten Befehlszeilen gehören zur Schleife.

 

Programmzeile 14

Mit outa[15] := 1 wird der I/O Port 15 des Controllers auf 1 oder HIGH gesetzt.

 

Programmzeile 15

Der Befehl Waitcnt bedeutet so viel wie:

  • „Warte auf den Systemzähler, bis er clkfreq und cnt Takte weitergezählt hat“

und ist nichts anderes als ein Verzögerungsbefehl. In der Klammer hinter dem Befehl steht, wie lange der Controller warten soll. Die erste Systemvariable in der Klammer – clkfreq – enthält den Systemtakt, die Anzahl der Taktzyklen pro Sekunde. Cnt, die zweite Systemvariable, erhöht ihren Wert bei jedem Taktzyklus. Die Differenz zwischen dem cnt-Wert jetzt und einem Zeitpunkt t0 in der Vergangenheit gibt die exakte Anzahl von Taktzyklen in der Zeit an und kann damit als Zeitmaß verwendet werden. Wenn das Programm auf diesen Befehl trifft, enthält die Systemvariable cnt einen bestimmten Wert. Das Programm hält so lange an, bis der Systemzähler clkfreq-Takte weitergezählt hat; also genau eine Sekunde.

 

Programmzeile 16

Wirkung wie in Zeile 14 bereits beschrieben, mit dem Unterschied, dass der I/O Port 15 hier auf 0 oder LOW gesetzt wird.

Programmzeile 17 ist in ihrer Wirkung identisch mit Programmzeile 15.

Zeilennummerierung im Editor einstellen  

Über Edit – Preferences kann aus dem Hauptmenü heraus die Einblendung einer Zeilennummerierung im Editor eingeschaltet werden.

Lorem ipsum 1 Lorem ipsum 2 Lorem ipsum 3
Dolor Sit 0123-4
Consectetur Adipisicing 5678-9
Abbildung 2 – Einschaltung der Zeilennummerierung im Editorfenster des Programms Propeller Tool.

2 – Die Blinkfrequenz verändern

Die Blinkfrequenz verändern
Aufgaben
  • Verändere das Programm LED1_blink so, das eine LED an P15 mit einer Frequenz von 2Hz blinkt.
  • Speichere das geänderte Programm unter LED2_blink.spin ab.
  • Starte das Programm aus dem Hauptmenü über Run – Compile Current – Load RAM und überzeuge dich, dass es tatsächlich doppelt so schnell blinkt wie vorher. 

Das Programm LED2_blink.spin kann durch das Negationszeichen (!) etwas anders geschrieben werden.

Um die LED doppelt so schnell blinken zu lassen wie vorher, muss der Wert von clkfreq halbiert werden.

Das Programm LED2_blink.spin

Abbildung 3 – Programm LED2_blink.spin

3 – Methodenaufruf mit Parameter Übergabe

Die Blinkfrequenz über einen Parameter einstellen
Aufgaben
  • Verändere das Programm LED2_blink so, das die Blinkfrequenz der an P15 angeschlossenen LED durch Eingabe eines Parameters verändert wird.
  • Speichere das geänderte Programm unter LED2a_blink.spin ab.

Das Programm LED2a_blink.spin

Abbildung 4 - Programm LED2a_blink.spin

Wie arbeitet das Programm led2a_blink.spin?

Programmzeile 10

In der Kopfzeile der Methode pub LED1_blink erscheinen in Klammern die Übergabeparameter f (Frequenz) und pin (Pinnummer).

 

Programmzeilen 12 und 13

Die Wertzuweisungen an die Variablen f und pin erfolgt in diesen beiden Programmzeilen. Der Wert für f wird in der Einheit Hertz eingegeben.

 

Programmzeilen 19 und 20

Die bisherigen Zahlenangaben werden durch die Parametergrößen ersetzt.

Der Vorteil dieser Programmschreibweise ist, dass nur noch an einer Stelle im Programm Veränderungen vorgenommen werden müssen, wenn dies erwünscht ist.

 

Die eingerückten Blöcke bei einem Schleifenaufruf lassen sich über entsprechende Indikatoren sichtbar machen. Wir haben das schon in den vorherigen Übungen gezeigt. Eingestellt wird diese Eigenschaft im Propeller Tool über Edit – Preferences – Appearance.

Einstellung des Blockindikators

Abbildung 5 – Einstellung des Blockindikators

4 – I/O Pins bitweise setzen

Das Richtungsregister DIRA ist ein 32-Bit Register für den Port A. Seine Syntax lautet:

  • ((PUB | PRI))
    
  • DIRA [Pins]
    

Das Argument Pins ist optional und beschreibt die Pin in Port A (0-31). Wird nur ein Zahlenwert eingegeben, dann bezieht er sich auf den benannten Pin (0 .. 31). Bei Eingabe eines Bereichsformates der Form a .. b, sind die aufeinanderfolgenden Pins gemeint.

Der Ausdruck DIRB, der sich auf einen Port B bezieht, ist nicht verfügbar und für zukünftige Anwendungen reserviert.

 

Die sechs Register, die direkten Zugriff auf die I/O Pin eines Propeller Controllers haben, sind:

DIRA, DIRB, INA, INB, OUTA und OUTB; alle Register, die sich auf Port B beziehen, sind für zukünftige Erweiterungen des Propeller Controllers reserviert und werden hier nicht mehr erwähnt. Das DIRA Register enthält die Richtungsangaben für jeden der 32 I/O Pin des Port A von 0 bis 31 bzw. P0 bis P31.

 

Über DIRA werden I/O Pins gesetzt und abgefragt. Eine 0 setzt den I/O Pin als Eingang, eine 1 als Ausgang. Beim Programmstart werden zunächst aus Schutzgründen alle I/O Ports auf 0 gesetzt.

Jeder Cog hat Zugriff auf alle I/O Pin zu jeder Zeit und verwaltet sein eigenes DIRA Register. Damit kann er die Richtung (ob Eingang oder Ausgang) selbst setzen. Die DIRA Register aller Cogs sind miteinander ODER-verknüpft. Der 32-Bit Wert dieser ODER-Verknüpfung bestimmt die I/O Richtungen der Port A Pin P0 bis P31. Das bedeutet:

  • Ein Pin ist nur dann ein Eingangspin, wenn keiner der Cogs ihn auf Ausgang setzt.
  • Ein Pin ist ein Ausgangspin, sobald einer der aktiven Cogs ihn auf Ausgang setzt.

Nicht aktive Cogs beeinflussen die Richtungsregister nicht.

Bits im Richtungsregister setzen oder löschen

In einer Befehlszeile lassen sich alle 32 Bit des Richtungsregisters DIRA setzen (1 -> Ausgang) bzw. löschen (0 -> Eingang).

  • Portpin   31      24 23      16 15       8 7        0
  • DIRA := %00000000_00000000_11111111_00000000

 

Im oben vorliegenden Beispiel werden die Pin 8 bis Pin 15 auf Ausgang gesetzt.

In vielen Situationen lassen sich auch die unitären Operatoren ~ und ~~ einsetzen. Es gilt:

DIRA~            Löscht das DIRA Register (d. h. alle I/O Ports werden auf 0 oder Eingang gesetzt)

DIRA~~          Setzt das DIRA Register (alle I/O Ports werden auf 1 oder Ausgang gesetzt)

 

Sollen nur einzelne nebeneinander liegende Ports betroffen sein, dann geschieht dies über

DIRA[5]~~     P5 wird Ausgang

DIRA[5..8]~~ P5 bis P8 werden Ausgänge

 

DIRA[5..3] := %110  Setzt P5 und P4 auf Ausgang und P3 auf Eingang. In dieser Schreibweise ist die Reihenfolge der Bitschreibweise entscheidend.

 

Das DIRA-Register ist beschreib- und auslesbar. Mit der Befehlszeile

  • Status := DIRA[7..4]

wird festgestellt, welche der I/O Ports Eingang und welche Ausgang sind.

Aufgabe

  • Verändere das Programm LED2a_blink so, dass acht LEDs, die an P8 bis P15 angeschlossen sind, blinken.
  • Speichere das neue Programm unter LED3_blink ab.

Mit Hilfe der unitären Operatoren ändert sich das Programm in den Programmzeilen 13 und 14 unwesentlich.

Für Lichtmuster lassen sich die einzelnen Bits im Ausgangsregister A setzen oder löschen und erzeugen in Verbindung mit dem Negationszeichen (!) einfache Lichtmuster.

5 - LED Blinkprogramm mit Parameterübergabe

In diesem Abschnitt wird das Blinkerprogramm aus den vorherigen Abschnitten so erweitert, dass mit ihm eine bestimmte LED am Pin pin für eine bestimmte Zeit t (in Millisekunden) das Blinken wdh-mal wiederholt. Die Methode heißt weiterhin LED1_blink, der Methodenkopf ändert sich in

  • pub LED1_blink(pin, t_in_ms, wdh)

mit den Übergabeparametern

pin                   Pinnummer (eine Zahl zwischen 8 und 15)

t_in_ms           ein ganzer Zahlenwert

wdh                 Anzahl der AN-AUS Sequenzen der angesprochenen LED

 

Für die Blinkwiederholung wird der Befehl repeat genommen, der unterschiedlich aufgerufen werden kann. Seine Syntax lautet:

  • REPEAT count
  •    Statements

 

  • REPEAT  var  FROM  start TO ende (STEP delta)
  •    Statements

 

  • REPEAT  UNTIL | WHILE  bedingung(en)
  •    Statements

 

  • REPEAT
  •    Statements
  • UNTIL | WHILE  bedingung(en)
Methodenaufruf mit Parameterübergabe
Aufgaben
  • Schreibe ein Programm, das eine von acht verschiedenen LED für eine bestimmte Zeit (Angabe in Millisekunden) an-und-aus geht und dieser Vorgang n-mal wiederholt wird.
  • Das Programm soll so entworfen sein, dass die Ausführung des Blinkvorgangs in einer eigenständigen Methode erfolgt, mit den Parameter pin (für I/O Pin der LED), t_in_ms (für die Leuchtdauer in ms) und wdh (für die Anzahl der Wiederholungen).
  • Eine Programmversion zeigt led4_blink.spin. Wenn du selbst kein Programm schreibst, übertrage das Programm in den Editor und speichere es anschließend ab.
  • Starte das Programm und überprüfe, ob es die oben beschriebenen Funktionen ausführt.

Das Programm led4_blink.spin

Wie arbeitet das Programm LED4_blink.spin?

In den Zeilen 12 bis 14 wird die Methode LED1_blink mit unterschiedlichen Parameterwerten aufgerufen. Das gesamte Programm besteht im Wesentlichen aus der Methode mit den Übergabeparametern pin, t_in_ms und wdh.

 

Programmzeile 18

Die I/O Pin 8 bis 15 werden Ausgänge.

 

Programmzeile 19

clkfreq (der Systemtakt) ist gleichbedeutend mit "1 Sekunde". Wird dieser Wert durch 1000 dividiert,  ist das gleichbedeutend mit 1/1000 Sekunde oder 1 Millisekunde. Multipliziert mit dem Faktor  t_in_ms ergibt sich eine Zahl im Millisekundenbereich.

 

Programmzeile 21

Start der Wiederholungsschleife mit Begrenzung der Wiederholungen auf den Wert wdh * 2. Die zur Schleife gehörenden Befehle (der Befehlsblock), wird durch die eingerückten Zeilen im Editor markiert.  Die Anzahl Wiederholungen besteht aus der Blinkfrequenz LED AN - Pause - LED AUS - Pause, das sind zwei Schleifendurchläufe. Aus diesem Grund muss im Schleifenaufruf die Zahl der Wiederholungen verdoppelt werden ( *2 ).

Die letzten beiden Programmzeilen sind bereits bekannt und müssen nicht mehr erklärt werden.

6 - Mit wieviel MHz läuft der Propeller Controller?

Soweit nichts anderes vereinbart wird in einem Programm, läuft ein Propeller Controller mit einem internen 12 MHz Takt, der aber sehr ungenau ist und einen Fehler von +/- 66% vom Idealwert erreichen kann.

Wer zeitgenaue Programmabläufe benötigt, muss über einen CON-Block auf die systeminternen Konstanten

  • _clkmode = xtal1 + pll16x
  • _xinfreq = 5_000_000

zugreifen. xinfreq teilt dem Propeller Controller mit, dass auf den externen 5 MHz Kristall zugegriffen und mit Hilfe von xtal1 + pll16x über einen propellerinternen PLL (phased-lock loop) dieser Wert um den Faktor 16 auf 80 MHz erhöht wird.

Weitere Informationen zu den Themen

  • Installation der Propeller Tool IDE
  • LED ein- und ausschalten
  • Shortcuts
  • Zwei LEDs mit Tastern schalten
  • Methoden
  • Aufbau einer Benutzerbibliothek

gibt es hier.

7 - Tasterabfrage

In diesem Abschnitt gehen wir auf die Abfrage von Tastern mit einem SPIN Programm ein und wie sich damit zum Beispiel andere Aktionen starten lassen (zum Beispiel das Einschalten einer LED, sobald ein Taster gedrückt wird oder ein E-Motor gestartet oder ein Heizelement eingeschaltet wird).

LED ein- und ausschalten über Tasterabfrage
Material
  • 1x  Prop-BoE oder Prop-AB
  • 1x  USB Verbindungskabel
  • 1x  Widerstand 100 Ohm
  • 1x  Widerstand 10 kOhm
  • 1x  Miniaturtaster
Aufgaben
  • Baue die Schaltung nach der Schaltskizze auf dem Steckbrett auf.
  • Übertrage das Programm taster1.spin in den Editor und speichere es ab.
  • Starte das Programm und überprüfe, ob die LED leuchtet, sobald der Taster gedrückt wird.

Schaltbild

Abbildung 6 - Taster- und LED-Schaltkreis

Das Programm Taster1.spin

Wie arbeitet das Programm Taster1.spin?

Die Kommandozeilen in Programmzeile 17ff greifen auf Methoden aus den beiden Bibliotheken "Input Output Pins" und "Timing" zurück, die Bestandteil des Programmpaketes Propeller Tool IDE sind.

Im OBJ-Block wird beiden Objekten ein Name zugeordnet, der später im Programm in Verbindung mit einer Methode benutzt wird. Dem Objekt "Input Output Pins" wird der Name pin und dem Objekt "Timing" der Name time zugeordnet.

Der Aufruf einer Methode aus einem der eben benannten Objekte setzt sich immer aus dem selbst gewählten Namen des Objektes (hier pin oder time) und dem Methodennamen zusammen, wobei beide Namen durch einen Punkt getrennt sind.

 

Beispiel

Die Methode Pause aus dem Objekt "Timing" wird im Programm aufgerufen mit

time.Pause(100)

 

Und wie kommt man an die Namen der Methoden aus den Objekten?

Nichts einfacher als das. Man lädt sie sich in den Editor. Neben dem Hauptprogramm erscheinen die zusätzlich geladenen Programme als Registerkarten, die durch Anklicken geöffnet werden.

Will man allerdings nicht auf Objektbibliotheken zurückgreifen, dann lässt sich das Programm mit den uns bereits bekannten Befehlen in das Programm taster1a.spin umschreiben und erzielt die gleiche Wirkung.

Abbildung 7 - Programm Taster1a.spin

8 - Terminalausgabe

Um das Parallax Serial Terminal ansprechen zu können, wird das Objekt "Parallax Serial Terminal" in den Programmcode im Objekt-Block mit eingebunden. Wie das geht, zeigt die folgende Übung.

Terminalausgabe
Material
  • 1x  Prop-BoE oder Prop-AB
  • 1x  USB-Verbindungskabel
  • 1x  Widerstand, 100 Ohm
  • 1x  Widerstand, 10 kOhm
  • 2x  Steckdraht
Aufgaben
  • Schreibe ein Programm, das eine LED für zwei Sekunden einschaltet, wenn eine Taste gedrückt wird und den Text "Die LED ist eingeschaltet" im Terminalfenster anzeigt.
  • Übertrage das Programm Terminal_1.spin in den Editor und speichere es ab.
  • Starte das Programm und überprüfe, ob es die beschriebenen Funktionen ausführt.

Das Programm Terminal_1.spin

Terminalausgabe

Neu hinzugekommen in diesem Programm ist die Einbindung der Objektdatei "Parallax Serial Terminal", aus der zwei Methoden in diesem Programm aufgerufen werden: Start und str.

 

In Programmzeile 18 im Objektblock wird der Zuordnungsname pst (Abk. für parallax serial terminal) gewählt, so dass alle Methoden aus dieser Objektdatei mit vorangestelltem pst. aufgerufen werden.

Die Zahl 13 in Programmzeile 30 und 33 ist der ASCII-Code für einen Zeilenrücklauf (CR -> carriage return). Damit wird erreicht, dass der Cursor nach Ausgabe eines Textes in die nachfolgende Zeile springt.

Druckversion Druckversion | Sitemap
© Reinhard Rahner - Gettorf