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

Fundamentum Propeller SPIN Programmierung

Basiskurs 2 –  Abschnitt 1 - Methoden und Kerne (COGS)

Objekte sind organisiert in Programmbausteinen, die man Methoden nennt. In der Sprache SPIN lassen sich mit Hilfe von Methodennamen die Programmkontrolle und Parameterwerte von einer Methode in eine andere übertragen.  

 

Bei einem Methodenaufruf benutzt eine Methode den Namen einer anderen und übergibt ihr die Programmsteuerung.

 

Methoden lassen sich auch in verschiedenen COGS starten, so dass ihre Befehle parallel mit Befehlen in anderen Methoden ausgeführt werden. Werden SPIN-Methoden in verschiedenen COGS ausgeführt, müssen globale Variablenfelder deklariert und Speicherplatz für die Rücksprungadressen der Methoden, Rückgabewerte, Parameter und Berechnungswerte reserviert werden. Dieser Speicherplatz wird Stack genannt.

Übung 1 - Methoden und lokale Variable

Übung 1 - Methoden und lokale Variable
Aufgaben
  • Entwirf einen Schaltungsaufbau, der eine LED an P19 mit einer Blinkfrequenz von 3 Hz insgesamt 9x blinken lässt und schreibe dazu ein SPIN-Programm.
  • Baue die Schaltung nach Schaltskizze auf.
  • Übertrage das Programm Blinker_locVar.spin in den Propeller Tool Editor und speichere es ab.
  • Starte das Programm und überzeuge dich, dass die Schaltung wie gefordert funktioniert. Überprüfe mit einem USB-Oszilloskop die Blinkfrequenz.
Material
  • 1x  Parallax Flip Module + 1x Steckbrett oder Prop BoE oder Prop AE mit USB-Kabel
  • 6x  LED, je 2 in rot, gelb und grün
  • 6x  Widerstand, 470 Ohm oder 1x SIL 8-7 470 Ohm
  • 3x  Widerstand, 470 Ohm
  • 3x  Widerstand, 10 kOhm
  • 3x  Taster
  • Div. Steckdraht
  • 1x  USB-Oszilloskop (optional)

Das Programm Blinker_locVar.spin

 

 

 

 

 

 

 

 

 

 

 

 

 

Abb. 1

Methode mit lokalen Variablen.

Oszillogramm

Abb. 2 - Das Oszillogramm wurde an P19 aufgenommen. Die LED blinkt mit einer Frequenz von 3,002 Hz insgesamt 9x.

Wie arbeitet das Programm Blinker_locVar.spin?

Beginnen wir mit den Vorgabewerten, die als Variable im PUB-Kopf hinter dem Pipe-Symbol eingetragen werden (Zeile 13).

  • LED an P19 wird im Programm zu pin := 19 (Zeile 15)
  • Blinkfrequenz von 3 Hz wird zu blinkrate := clkfreq / 3 (Zeile 16)
  • LED blinkt neun mal wird zu wdh := 9  (Zeile 17)

Um eine LED ein- und wieder auszuschalten, benötigt man zwei Taktimpulse; dies soll neun mal hintereinander ausgeführt werden. Dafür sind dann 18 Taktimpulse (2 * 9) nötig. Die Repeat-Schleife (Zeile 21) muss wdh * 2 durchlaufen werden.

Die 18 Taktimpulse sollen in 3s ausgeführt werden (Vorgabe sind 3 Hz), deshalb muss die Blinkrate verdoppelt werden mit blinkrate / 2.

Was man auch mal probieren sollte!

 

Wie muss das Programm abgeändert werden, um

  1. die LED an P19 mit 1 Hz 5x blinken zu lassen?
  2. Die LED an P21 mit 0,5 Hz 8x blinken zu lassen?

 

Lösungen

 

 

Lösung zu Frage 1

 

Lösung zu Frage 2

Übung 2 - Eine Methode aufrufen

In der nachfolgenden Übung wird das Objekt aus Übung 1 mit einer zweiten Methode taster erweitert zu einem neuen Objekt.

 

Beschreibung des neuen Objekts

Eine LED1 an P22 zeigt durch ihr Leuchten an, dass der Taster T1 an P26 betätigt werden kann. Sobald er gedrückt wird, erlischt LED1 und LED2 an P20 fängt an mit einer Frequenz von 1 Hz 9-mal hintereinander an- und auszugehen. Anschließend wird Taster T1 nach einer kurzen Pause von 2s wieder aktiv geschaltet und LED1 an P22 leuchtet auf.

Übung 2 - Eine Methode aufrufen
Aufgaben
  • Schaltungsaufbau wie in Übung 1
  • Übertrage das Programm AufrufBlinker.spin in den Propeller Tool Editor und speichere es ab.
  • Starte das Programm und überzeuge dich von der Korrektheit des Programmablaufs.
Pinbelegung
  • LED1 an P22
  • LED2 an P18
  • T1 an P26

Vorgehensweise

Die Methode blinkerLocVar aus Übung 1 wird ohne Änderung übernommen. Zusätzlich wird eine Methode taster am Anfang des neuen Objektes eingefügt, die nach dem Programmstart als erstes ausgeführt wird. In dieser wird die Methode blinkerLocVar aufgerufen, abgearbeitet und anschließend wird das Programm in der Methode taster fortgesetzt (siehe Abb. 2).

 

 

 

 

 

 

 

Abb. 2

Das Objekt AufrufBlinker besteht aus zwei Methoden. Die Methode BlinkerLocVar wird aus der Methode taster aufgerufen.

Objekt AufrufBlinker

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Abb. 3

Das Programm AufrufBlinker.spin

Übung 3 - Parameterübergabe

Eine noch flexiblere Handhabung lokaler Variabler erreicht man dadurch, dass man die Werte der Variablen bereits im Methodenaufruf definiert, statt es erst in der Methode selbst zu tun, wie es in Übung 2 erfolgte. Wie das praktisch funktioniert zeigt die folgende Übung. Der dazu notwendige Schaltungsaufbau ist identisch mit dem aus Übung 1.

Objekt AufrufBlinker

 

 

 

 

 

 

 

 

 

 

 

 

Abb. 4

Aus der Methode "Main" wird die Methode "blinker" mit Parameterübergabe aufgerufen. Nach Beendigung der Methode "blinker" wird das Programm in Zeile 19 fortgesetzt.

Die Methode blinker lässt sich in der Methode Main wiederholt und mit unterschiedlichen Parametern aufrufen und erzeugt damit hintereinander verschiedene Blinkmuster, sobald Taster T1 gedrückt wurde. Probiere es aus, indem du nach Zeile 18 die folgenden Befehlszeilen eingibst:

 

 

 

Abb. 5

Die Methode blinker wird nacheinander viermal aufgerufen und erzeugt nacheinander eine unterschiedliche Blinkfrequenz bei verschiedenen LEDs.

Übung 4 - Eine Methode einem anderen Kern (COG) übertragen

Bisher wurden alle Methoden eines Objektes nur vom COG 0 ausgeführt; dies ist standardmäßig die Voreinstellung.

 

Die in Übung 3 ausgeführten Blinksequenzen mit verschiedenen LEDs (s. Abb. 5) werden nacheinander ausgeführt, keinesfalls gleichzeitig.

Übertrage das Programm BlinkenMitCOG.spin in den Propeller-Tool-Editor und speichere es ab. Starte das Programm und betrachte das Ergebnis. Vergleiche es mit dem Blink-Verhalten aus Übung 3.

Das Programm BlinkenMitCOGS.spin

 

 

 

 

 

 

 

 

 

 

 

Abb. 6

Die fünf unterschiedlichen Methodenaufrufe von "blinker" werden an je einen COG übergeben. Alle LEDs leuchten im Takt gleichzeitig auf.

Wie arbeitet das Programm BlinkenMitCOG.spin?

 

Die erste Methode eines Objektes wird immer COG0 zugewiesen. Für das Objekt BlinkenMitCOG ist das die Methode Main. Es werden vier cognew-Befehle ausgeführt; anschließend fährt COG0 herunter. Inzwischen wurden vier andere COGS gestartet, von denen jeder wenige Sekunden arbeitet. Hat der letzte COG seine Arbeit getan, geht der Propeller Chip in den Low-Power Modus über.

 

Während COG0 auf unbenutzten globalen RAM zugreift, der gleich nach dem Programmcode für Methodenaufrufe, Rücksprungadressen, lokale Variable und Berechnungsausdrücke kommt, müssen andere COGS, die ebenfalls Methoden ausführen, ihre Variablen im globalen RAM vorübergehend im sogenannten Stackbereich ablegen.

Das blinkenMitCOG-Objekt aus dieser Übung benötigt 40 Elemente vom Typ long für alle gestarteten COGS, jedes Element 32-Bit lang.

 

Der Befehl

  • cognew(blinker(20, clkfreq/2, 11), @stack[0])

ruft die Methode blinker mit dem nächsten verfügbaren COG auf, das ist COG1. Der Parameter @stack[0] überträgt die Adresse des stack[0]- Feldelementes an COG1. Damit startet COG1 die Ausführung der Methode blinker(20, clkfreq/2, 11) mit Hilfe von stack[0], in den er Rücksprungadresse, lokale Variable und Berechnungen ablegt.

 

Den freien RAM, den COG0 für seinen Stack nutzt, kann über Object Info (Aufruf mit F8) eingesehen werden (siehe Abb. 7).

Abb. 7 - Object Info Fenster
  • Der grau unterlegte Bereich von 0000 bis 000F enthält Initialisierungscode.
  • Der rote Speicherbereich enthält SPIN-Code, der gelbe zeigt den globalen Variablenbereich  (die 40 Variablen vom Typ long des stack-Arrays).
  • Blau unterlegt ist der unbenutzte RAM-Bereich, von dem einige Bytes als Stack für COG0 reserviert sind. Die Startadresse des Stackbereichs für COG0 ist in diesem Beispiel 012816.

Übung 5 – Eine Methode in einem bestimmten Kern starten/ anhalten

 

Mit dem Befehl

  • cognew

schaut der Propeller Chip, welcher COG verfügbar ist und startet ihn anschließend. Im Objekt BlinkenMitCOG aus Übung 4 war vorhersagbar, nach welchem Muster ein neuer COG angesprochen wird.

 

Statt den nächsten verfügbaren kann man auch einen beliebigen der verfügbaren COGs ansprechen und starten. Dies geschieht mit dem Befehl:

  • coginit(cog nr, methode, stackzuweisung)

Ein COG wird angehalten mit

  • cogstop(cog nr)

Aufgaben

  • Übertrage das Programm StartStoppCOGS.spin in den Propeller Tool Editor und speichere es ab.
  • Starte das Programm und überprüfe, ob es die drei blinkenden LEDs nacheinander abschaltet.
  • Beschreibe die Wirkung jeder Programmzeile mit eigenen Worten.

Das Programm StartStopCOGS.spin

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Abb. 8 - Das Programm StartStoppCOGS.spin.

Hier geht es weiter mit dem Basiskurs 2  Abschnitt 2 - Kerne und Stack

Druckversion | Sitemap
© Reinhard Rahner - Gettorf