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

1 - Multicore Programmierung

Im folgenden Versuch werden wir eine Stärke des Propeller Controller - seine 8 Cores oder cogs - in einem kleinen Programm zeigen. Hilfreich ist, vorher ein bisschen etwas über Multiprocessing und Multitasking zu wissen.

Multicore Programmierung - 1. Teil
Aufgabe
  • Es werden drei LEDs gleichzeitig angesteuert. LED rot blinkt mit einer Frequenz von frot =  1Hz, LED grün mit fgrün = 2,5Hz, LED gelb mit fgelb = 2Hz.

Ein erster Lösungsansatz

Wir arbeiten mit Multiprocessing oder echtem Multitasking, d. h., für jede LED übernimmt ein bestimmter cog (Core) im Propeller-Prozessor die gestellte Aufgabe und arbeitet sie selbstständig ab, unabhängig davon was die anderen Prozessoren machen. Mit einem herkömmlichen Prozessor, wie z. B. einem Arduino, ist das nicht umsetzbar.

Wie startet man einen Cog?

In der SPIN Language Reference ist dafür der Befehl

  • COGNEW (SpinMethode <(Parameterliste)>, StackPointer)
    

vorgesehen. Dabei bedeuten die Argumente im Einzelnen

  • SpinMethode 
    

kann eine PUB oder PRI Methode sein, die der Cog abarbeitet. Optional lassen sich auch Parameter in Form einer Parameterliste übergeben.

  • Parameterliste 
    

eine durch Komma getrennte Liste von Parametern für die Methode SpinMethode.

  • StackPointer
    

ist ein Pointer auf den Speicherbereich, der dort einen Bereich für den neuen Cog bereitstellt. Vom Cog wird dieser Stack benutzt, um dort temporäre Daten während einer Programmausführung abzulegen. Steht nicht genügend Stackplatz zur Verfügung, arbeitet die Anwendung fehlerhaft oder lässt sich nicht starten.

Schaltskizze

Abbildung 1 - Auf einem Prop-BoE nimmt man die fest verdrahteten LEDs, auf einem Prop-AB muss man die LEDs mit Vorwiderstand separat auf dem Steckbrett aufbauen.
Multicore Programmierung - 2. Teil
Material

1x  Propeller Board of Education oder Propeller Activity Board

1x  USB Verbindungskabel

1x  Steckernetzteil

4x  Steckdraht

3x  Widerstand 220 Ohm (nur für das Prop-AB)

3x  LED (rot, grün, gelb) (nur für das Prop-AB)

Aufgaben
  • Baue die LED-Schaltungen und die Tasterschaltung auf dem Steckbrett des Propeller Board of Education nach Schaltskizze auf.
  • Übertrage das Programm LED_Taster_Multicore.spin in den PT Editor und speichere es ab.
  • Überprüfe, ob die LEDs unterschiedlich schnell blinken und gleichzeitig wieder aus gehen.

Das Programm

Startet man das Programm, dann sollten die drei LEDs im vorgegebenen Takt blinken. Die rote LED blinkt im Sekundentakt, insgesamt 10-mal (dauer = 50, zaehler = 10), die grüne LED blinkt 2,5-mal pro Sekunde, in 10 Sekunden also 25 mal (dauer = 20, zaehler = 25) und die gelbe LED blinkt 2-mal pro Sekunde, insgesamt dann 20 mal (dauer = 25, zaehler = 20). Alle LEDs hören gemeinsam auf zu blinken.

2 - Ultraschallsensor PING)))

Mit einem Ultraschallsensor lassen sich auf einfache Weise Entfernungen und Abstände bestimmen. Auf dem Markt werden zwei Sensoren angeboten, die sich sowohl im Preis als auch in der Zahl der elektrischen Anschlüsse unterscheiden.

Die Fa. Parallax bietet den PING))) Sensor mit drei Anschlussleitungen zu einem deutlich höheren Preis an, im Vergleich zum HC-SR04 mit vier Anschlussleitungen, der über das Internet bestellt werden kann. Ich werde beide Systeme testen und zeigen, wie sie unter Propeller SPIN angeschlossen und betrieben werden.

Abbildung 2.1 - Ultraschallsensor PING))) der Fa. Parallax Inc.
Ultraschallsensor PING)))
Material
  • 1x  Prop-BoE oder Prop-AB
  • 1x  USB-Verbindungskabel
  • 1x  PING))) Sensor
  • 3x  Steckdraht
Aufgaben
  • Baue die Schaltung nach der Schaltskizze auf dem Prop-BoE oder Prop-AB auf.
  • Übertrage das Programm ping1.spin in den Editor und speichere es ab.
  • Positioniere das Board mit dem Sensor so, dass der Sensor in Richtung der Raumdecke zeigt.
  • Starte das Programm und überprüfe, ob im Terminalfenster ein realistischer Zahlenwert angezeigt wird.
  • Miss den Abstand zu verschiedenen Gegenständen.

Das Programm ping1.spin

Wie arbeitet das Programm ping1.spin?

Im CON-Block wird die Taktfrequenz des Controllers eingestellt. Die Taktfrequenz des externe  Kristalls von 5 MHz wird über den internen PLL 16-fach auf 80 MHz erhöht.

Im OBJ-Block werden die beiden Bibliotheken "Parallax Serial Terminal" unter dem Namen pst und "ping" unter dem Bezeichner ping_sensor eingebunden. Damit stehen eine Vielzahl von Methoden zur Verfügung.

Im Hauptprogramm pingsensor wird die lokale Variable Entfernung im Kopf definiert und in Zeile 20 die Terminalansteuerung über die Methode pst.Start(115200) in einem zweiten Cog gestartet. In der nachfolgenden Endlosschleife (Zeile 22ff) wird der vom Sensor ermittelte Laufzeit-Differenzwert des Ping-Signals in eine Entfernungsangabe in Zentimetern umgerechnet und in der Variablen Entfernung abgelegt.

Die folgenden drei Terminal-Ausgabenbefehle beziehen sich auf die Text- und Datenausgabe des gemessenen Wertes des Ultraschallsensors.

3 - Ultraschallsensor HC-SR04

Auf den ersten Blick scheint dieser Sensor völlig identisch zum PING))) Sensor von Parallax zu sein; aber es gibt einen kleinen Unterschied. Er besitzt insgesamt vier Anschlussleitungen, zwei davon für die Spannungsversorgung, sowie eine Trigger- und eine Echoleitung.

Abbildung 3.1 - Ultraschallsensor HC-SR04 Sensor mit Anschlussbelegung
Ultraschallsensor HC-SR04
Material
  • 1x  Prop-BoE oder Prop-AB
  • 1x  USB-Verbindungskabel
  • 1x  HC-SR04 Sensor
  • 4x  Steckdraht
Aufgaben
  • Baue die Schaltung nach der Schaltskizze auf dem Prop-BoE oder Prop-AB auf.
  • Übertrage das Programm HCSR04sensor1.spin in den Editor und speichere es ab.
  • Positioniere das Board mit dem Sensor so, dass der Sensor in Richtung der Raumdecke zeigt.
  • Starte das Programm und überprüfe, ob im Terminalfenster ein realistischer Zahlenwert angezeigt wird.
  • Miss den Abstand zu verschiedenen Gegenständen.

Das Programm HCSR04sensor.spin

Terminalausgabe

4 - Zwei Ultraschallsensoren abfragen

Für den Einsatz auf einem Roboter kann man sich zwei oder mehr Ultraschallsensoren vorstellen, die unterschiedliche Bereiche auf Hindernisse abscannen und dann dafür sorgen, dass der Roboter ohne Crash die Hindernisse passieren kann. Dies wird über zwei LEDs (rot und grün) simuliert. Ist der Abstand vom linken Sensor kleiner als 10 cm, dann soll die rote LED aufleuchten und entsprechend auf der anderen Seite die grüne LED (in der Praxis würde statt des Aufleuchtens einer LED der Motorantrieb entsprechend geregelt, damit der Roboter dem Hindernis ausweicht). Wir arbeiten mit echtem Multitasking - beide Ultraschallsensoren sollen von je einem Cog verwaltet werden. Wie man eine solche Schaltung aufbaut und programmiert, wird in diesem Abschnitt erklärt.

Zwei Ultraschallsensoren mit 2 Cogs abfragen - Multiprocessing
Material
  • 1x  Prop-BoE oder Prop-AB
  • 1x  Steckbrett einzeln
  • 1x  HC-SR04 Ultraschallsensor
  • 1x  PING)))-Sensor
  • 1x  Widerstand, 1kOhm
  • 2x  LED (1x grün, 1x rot) optional für das Prop-AB
  • 2x  Widerstand, 220 Ohm - optional für das Prop-AB
  • 9x  Steckdraht
Aufgaben
  • Baue zwei Ultraschallsensoren auf dem Steckbrett auf.
  • Die Signalleitung des PING))) Sensors wird mit P15 des Controllers verbunden.
  • Die Trig- und Echo-Leitung des HC-SR04 Sensors wird mit P8 und P9 des Controllers verbunden.
  • Übertrage das Programm 2Ultraschallsensoren.spin in den Editor und speichere das Programm ab.
  • Die rote LED (Backbord, in Fahrtrichtung links) auf dem Prop-BoE wird mit P12 und die grüne (Steuerbord, in Fahrtrichtung rechts) mit P11 verbunden.

Gehe beim Aufbau so vor, dass zunächst nur eine Sensorschaltung aufgebaut und anschließend mit dem Programm getestet wird. Sollten sich dort bereits Fehlfunktionen einstellen, behebe die Fehler und mache erst weiter, wenn die Schaltung fehlerfrei läuft.

Echtes Multitasking

Der Propeller Controller verfügt über 32k RAM, auf den von allen acht Cogs zugegriffen werden kann. Sobald ein Programm in den Controller geladen und im RAM abgelegt ist, startet der erste Cog mit seiner Arbeit. Ein zweiter Cog wird mit der Befehlszeile

  • COGNEW(methode, @stack)
    

hinzugeschaltet. Der Befehl COGNEW weist den ersten Cog an, einen zweiten Cog zu starten und die Methode auszuführen, die im Befehlsaufruf angegeben ist. Es lassen sich mit dem Programmstart eines neuen Cogs auch Werte an die aufgerufene Methode übergeben. Neu und etwas ungewöhnlich ist der Zusatz @stack im Befehlsaufruf. Da jeder Cog einen eigenen Arbeitsbereich benötigt, muss im VAR-Block des SPIN-Programms ein Stackbereich deklariert werden; zum Beispiel durch

  • long stack[25]

Wie groß der Stackbereich sein muss, hängt letztlich von der aufgerufenen Methode ab. Wenn man mit einem Wert von 25 startet und feststellt, dass das Programm Probleme bereitet, dann erhöhe den Wert solange, bis das Programm sauber läuft.

Der Schaltungsaufbau

Abbildung 4.1 - Schaltungsaufbau mit einem HC-SR04 und einem PING))) Sensor auf einem Prop-BoE.

Das Programm 2Ultraschallsensoren.spin

Abbildung 4.2 - Die Methode HCSR04_sensor wurde der Objektbibliothek "spin" entnommen.

Kommentar schreiben

Kommentare

  • olaf (Sonntag, 10. Dezember 2017 08:35)

    wow...die mit Abstand beste Site, die ich bisher zu diesem Thema gesehen habe :-))
    Vielen Dank dafür. Hilft super beim Erklären!!

  • David Eisenblätter (Sonntag, 11. Februar 2018 13:38)

    Sehr schön erklärt, und zufällig heute, wo ich nochmal nach einer detailierten Gedankenstütze diesbezüglich gesucht habe!

    Vielen vielen Dank!

    David.

Bitte geben Sie den Code ein
* Pflichtfelder
Druckversion Druckversion | Sitemap
© Reinhard Rahner - Gettorf