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

Fundamentum Propeller SPIN Programmierung

Basiskurs 4 –  Abschnitt 1 - Zählermodule

Jeder der acht Prozessoren (COGS) eines Multicore Propeller P8X32A verfügt über zwei unabhängige Hardware-Zählermodule. Jeder Zähler ist eine konfigurierbare Zustandsmaschine zum Erfassen oder Erzeugen sich wiederholender Signale, möglicherweise bei jedem Taktzyklus.

 

Der Propeller-Chip verfügt über zwei Zähler in jedem Prozessor. Die Zähler arbeiten unabhängig voneinander und jeder ist ein Modul mit 32 Betriebsarten.

1 - Zählerregister

Jeder Zähler verfügt über drei unterschiedliche Register, die seinen Betrieb steuern. In jedem Prozessor heißen diese Register CTRA, FRQA und PHSA für den ersten und CTRB, FRQB und PHSB für den zweiten Zähler. CTRA / CTRB ist das Steuerregister für jeden Zähler.

 

Das CTRA/ CTRB Register legt

  • den Modus fest, in dem der Zähler arbeitet (CTRMODE-Feld),
  • den in den PLL-Modi verwendeten PLL-Teilungsfaktor (PLLDIV) fest
  • den ersten und zweiten Pin (APIN- und BPIN-Felder) fest.

Die beiden Pins werden in bestimmten Modi als Ein- oder Ausgang für den Zähler verwendet. Die Positionen der Felder zeigt Tabelle 2-5 (aus Propeller Manual v1.2).

Die BPIN- und APIN-Felder bestehen jeweils aus sechs Bits. Das höchste Bit in jedem Feld (Bits 5 und 14) ist für die zukünftige Verwendung reserviert und wird vom Propeller P8X32A ignoriert. Beide Zähler haben ihre eigene APIN und BPIN und sind in ihrem CTRA / CTRB-Register eindeutig angegeben.

 

In jedem Fall wird die tatsächliche Ausgabe eines Zählers, wie durch die Felder CTRMODE und APIN / BPIN bestimmt, mit dem entsprechenden Ausgangszustandsbit im Ausgangsregister (z. B. outa) ODER-verknüpft und mit dem entsprechenden Richtungsbit UND-verknüpft im Richtungsregister (z.B. dira).

 

Für einen typischen Betrieb muss das Ausgangszustandsbit auf 0 und das Richtungsbit auf 1 gesetzt werden. Sie können jedoch unterschiedlich eingestellt werden, um den Zähler wie gewünscht effektiv zu maskieren.

 

  • Das PHSA / PHSB-Register ist das Herzstück des Zählers. Es ist der Akkumulator, der den aktuellen Wert des Zählers speichert. Dieser Wert kann von einem Programm gelesen oder beschrieben werden. Für viele Anwendungen ist jedoch kein Schreiben in das Register erforderlich.

 

  • Das FRQA / FRQB-Register enthält den Wert, der dem Akkumulator hinzugefügt wird, wenn eine Akkumulationsbedingung wahr ist. Die Akkumulationsbedingung wird durch die im Feld CTRMODE des CTRA / CTRB-Registers eingestellte Betriebsart festgelegt.

Immer wenn ein Prozessor gestartet wird, werden alle sechs Register (drei für jeden Zähler) auf

  • $ 0000_0000  initialisiert.

Immer wenn ein Prozessor angehalten wird, werden alle Zähleraktivitäten beendet und die Register auf $ 0000_0000 zurückgesetzt.

2 - Zählerbetrieb

Bei jedem Taktzyklus addiert der Zähler den Inhalt von FRQA zu PHSA; dies aber nur, wenn die Akkumulationsbedingung wahr ist.

 

Für einen Propeller, der von einem 5-MHz-Kristall mit einem 16x PLL-Multiplikator getaktet wird, wird der Zähler 80 Millionen Mal pro Sekunde bedingt akkumuliert (16 x 5 MHz = 80 MHz). Die Bedingung für die Akkumulation wird durch das Feld CTRMODE im CTRA-Register festgelegt.

3 - Zählermodi

Die 32 Betriebsmodi für jeden Zähler sind in Tabelle 2 angegeben. Tabelle 3 enthält Anwendungsbeispiele für jede Teilmenge von Modi.

Tabelle 2: Zählermodi (CTRMODE-Feldwerte)

(aus Propeller Manual v1.2)

Tabelle 3: Anwendungsbeispiele für Zählermodi

Übung 1 - Entladezeit einer RC-Schaltung bestimmen (Theorieteil)

 

RC-Lade-/Entlade-Schaltungen werden typischerweise mit einer Kapazität C und einem Widerstand R aufgebaut. Der Kondensator lädt und entlädt sich und die Zeit für diese beiden Vorgänge kann gemessen werden.

In den meisten RC-Schaltungen wird eine der beiden Größen, R oder C, konstant gehalten, während die andere Größe variabel ist. In dieser Übung wird die Schaltung aus Abb. 1 verwendet.

Schaltskizze

 

 

 

 

 

 

Abb. 1

RC-Schaltung aus Potenziometer, Widerstand R von 100 Ohm und einem Kondensator C.

Die Schaltung ist mit P6 am Propeller Controller verbunden.

a - Strom und Spannungsverlauf beim Entladevorgang

Die Zeit TH, in der die Spannung über einem Kondensator auf die Hälfte gegenüber dem Ausgangszustand abnimmt, bezeichnet man als Halbwertszeit.

Über zwei verschiedene Differentialgleichungsansätze lassen sich der Lade- und Entladevorgang über einem Kondensator mathematisch beschreiben. Für den Spannungsabfall am Kondensator beim Entladevorgang gilt:

und für den Stromverlauf:

Die Halbwertszeit TH errechnet sich aus (rc_01) zu:

Sind C und R fest vorgegeben, ist die Halbwertszeit einer RC-Schaltung direkt proportional zur Einstellung des Schleifers am Potenziometer bzw. zum Widerstandswert der Potenziometereinstellung.

 

Vorgestellt habe ich dieses Thema schon einmal unter Signale richtig verstehen/RC-Schaltung 2 in verschiedenen Versuchen mit einer BASIC Stamp 2. Der Propeller Chip eröffnet mit seinen acht Kernen, der höheren Systemtaktung und der deutlich anderen Chip-Architektur weitaus mehr experimentelle Möglichkeiten und eine höhere Messgenauigkeit.

b - Lade- und Entladekurve eines RC-Gliedes (Theorieteil)

 

 

 

Abb. 1a

Lade- und Entladekurve über einem Kondensator in einem RC-Glied.

Der Kondensator ist mit Ausgang P8 direkt verbunden. Ist P8 HIGH, liegen 3,3 V an C.

Der Kondensator wird (Kurve ganz links) auf ca. 3,3 V aufgeladen.

Wird P8 von Ausgang auf Eingang umgeschaltet, erkennt der Propeller ein HIGH an P8. Der Kondensator entlädt sich über einen Widerstand. 

An der Schwelle 1,65 V erkennt der Eingang P8 des Propeller Chips den Zustand LOW.

c - Den Modus eines Zählermoduls einstellen

Der Positive Detector Mode

Es gibt zwei Einstellungs-Optionen für diesen Modus: „regular“ und „with feedback“. Im regulären Modus fragt der Propeller Chip einen seiner I/O Pins ständig ab und addiert bei jedem Taktimpuls den Zahlenwert in FRQ zum Inhalt von PHS, solange der I/O Pin auf HIGH gesetzt ist. Für das Hochzählen mit jeweiliger Erhöhung um 1 muss im FRQ-Register eine 1 stehen.

 

Der Zählvorgang sollte in dem Moment beginnen, wenn der I/O Pin seinen Zustand von Ausgang HIGH auf Eingang wechselt. Der Eingang wird dann als HIGH erkannt. Fällt der Signalpegel am Eingang des Pins unter 1,65 Volt, wird am Eingang der Zustand LOW erkannt und der Zählvorgang angehalten. Der Wert in PHS gibt dann die Entladezeit in Systemtakten an.

d - Die Modi des Zählermoduls

Tabelle 2 (siehe weiter oben) weist alle 32 Modi der Zählermodule aus. Der POS detector Modus hat laut Tabelle den fünfstelligen CTRMODE %01000.

Abb. 2 – Auszug aus dem Propeller Manual Vers. 1.2 der Fa. Parallax zu den Zählermodi.

Der fünfstellige Binärcode CTRMODE muss in das entsprechende Bitfeld CTRMODE im CTR-Register übertragen werden, damit der Propeller in den POS detector Modus umschaltet; in das APIN-Feld muss die Pinnummer eingetragen werden.

Abb. 2a - CTR-Register des Propeller Chips (Auszug aus dem Propeller Manual Vers. 1.2)

Die Einstellungen für das Zählermodul, dass mit jedem Taktimpuls den Zähler um 1 erhöhen soll, werden wie folgt vorgenommen:

 

  • ctra[30..26] := %01000

speichert %01000 im CTRMODE-Bitfeld des CTR-Registers und versetzt den Controller in den POS-Modus.

  • ctra[5..0] := 8

legt P8 als I/O Pin im  APIN-Bitfeld des CTR-Registers ab. Der Zustand an diesem Pin wird beobachtet und der Zähler angeworfen, sobald eine 1 am Eingang anliegt. Abgebrochen wird, wenn eine 0 dort anliegt.

  • frqa := 1

speichert eine 1 im Register FRQ. Mit jedem Taktimpuls wird dieser Wert zum Inhalt von PHSA addiert.

Mit diesem Hintergrundwissen schauen wir uns jetzt Übung 2 und das zugehörige Programm an.

Übung 2 - Entladezeit einer RC-Schaltung aufnehmen

Für verschiedene Kapazitätswerte des Kondensators werden die Entladezeiten bei unterschiedlichen Positionen des Mittelabgriffs gemessen.

Übung 2 - Entladezeit einer RC-Schaltung aufnehmen

Material

  • 1x  Grove Rotary Angle Sensor
  • 1x  Widerstand, 100 Ohm
  • 1x   Kondensator, 10 nF, 100 nF
  • 1x   Parallax Flip oder Propeller Board
  • div. Steckdrähte

Aufgaben

  • Baue die Schaltung nach Schaltskizze auf.
  • Übertrage das Programm RC_Entladung.spin in den Editor und speichere es ab.
  • Starte das Programm und bestimme für verschiedene Schleiferpositionen die Entladezeit des Kondensators.

Schaltskizze

 

 

 

 

 

 

Abb. 3

Schaltungsaufbau einer RC-Schaltung mit einem Propeller Flip Chip und einem Grove Rotary Angle Sensor.

Das Programm RC_Entladung.spin

Abb. 4 - Programm zur Messung der Entladezeit eines Kondensators. In diesem Beispiel ist C = 100 nF. Die Wartezeit in Programmzeile 29 muss bei anderen Kapazitätswerten entsprechend angepasst werden.

Wie arbeitet das Programm?

Vor dem eigentlichen Entladungsvorgang muss der Kondensator geladen werden. Die Schritte dazu:

  1. P8 muss auf Ausgang und HIGH gesetzt werden. Dazu werden das Richtungs- und Ausgangsregister im Pin 8 auf 1 gesetzt:
  • dira[8] := outa[8] := 1
  1. Anschließend wird eine Warteschleife eingebaut. In dieser Zeit lädt sich der Kondensator auf. Als Faustformel wird der Wert der doppelten Halbwertszeit genommen.
  • waitcnt(clkfreq / 100_000 + cnt)

Bei C = 10 nF wären das ca. 0,14 ms oder 140 µs, bei C = 1 nF 14 µs.

 

  1. Bevor die Zeitmessung für den Entladevorgang startet, muss das PHS-Register auf Null und der I/O Pin auf Eingang geschaltet werden; dies übernehmen die Befehle:
  • phsa~
  • dira[8]~

Und wo kommt die Zahl 659 her?

 

Der Zähler wird in Programmzeile 19ff (siehe Abb. 4) in den Modus „POS detector“ versetzt und zählt los. Das Startsignal für die eigentliche Zählung beginnt in Zeile 32, wenn der I/O Pin von Ausgang auf Eingang umgeschaltet wird.

 

Dazu muss vorher das Phasenregister PHSA auf 0 gesetzt werden. Wieviele Ticks zwischen der Ausführung der Befehle phsa~ und dira[8] gezählt werden - der Entladevorgang beginnt ja erst mit Zeile 32 - muss noch bestimmt werden. Dazu verwendet man einen Kondensator mit möglichst kleiner Kapazität (1 pF oder so) und misst die Anzahl der Ticks. Vorher muss aber die Programmzeile 34 in

  • ticks := phsa

geändert und der Kondensator ausgetauscht werden. Der kleinste sich einstellende Wert liegt bei mir bei 659; diesen Wert sollte jeder auf seinem System selbst ermitteln.

Die 10 ms Wartezeit in Programmzeile 33 kann man abändern. Es muss nur sichergestellt sein, dass der Entladevorgang vor der Zuweisungsanweisung in Zeile 34 abgeschlossen ist; der Zähler nicht noch am Zählen ist.

Übung 3 – Zwei RC-Schaltungen gleichzeitig ausmessen

Jeder Kern in einem Propeller Chip enthält zwei Zähler; damit lassen sich über zwei verschiedene I/O Pins mit einem Kern zwei unterschiedliche Entladungszeiten bestimmen; nicht nacheinander im Multitasking-Betrieb, sondern gleichzeitig, nebeneinander im Multiprocessing-Betrieb.

 

Dazu werden beide Zähler in einem Kern nacheinander gestartet, um dann unabhängig voneinander die Entladezeit in jeder Einzelschaltung vorzunehmen.

 

Mit der zweiten Schaltung, die aus einem Phototransistor, einem Widerstand und einem Kondensator besteht, wird die Lichthelligkeit bestimmt. Je nach Stärke des Lichteinfalls auf die Basis, variiert der Stromfluss durch den Transistor. Es gilt:

  • je heller es ist, umso stärker ist der Stromfluss durch den Transistor, umso geringer sein innerer Widerstand und umso kürzer die Entladezeit des Kondensators; je schwächer das Licht, umso größer der innere Widerstand, umso länger die Entladezeit.

Der Fototransistor

Fototransistoren sind, wie auch Fotodioden, elektrooptische Messwandler, die einfallendes Licht in elektrischen Strom wandeln. Ihr Gehäuse ist transparent, lichtdurchlässig; in der Mitte befindet sich auf der Bodenplatte ein quadratisches Halbleitermaterial, das ähnlich wie bei Sonnenkollektoren, auf Licht reagiert.

Fototransistoren haben einen freiliegenden Basisanschluss; Photonen, die auf die Basis treffen, aktivieren den Transistor und es kommt zu einem Stromfluss. Sie lassen sich im aktiven oder im Schaltmodus betreiben.

 

  • Im aktiven Modus verhält der Transistor sich wie ein analoges Element mit linearem Ausgang, der sich direkt proportional zur einfallenden Lichtintensität verhält.
  • Im Schaltmodus hingegen gibt es nur die Zustände: OFF oder ON. Zur Lichtstärkenmessung wird der aktive Modus benutzt.

Abb. 5

Fototransistor (links: Seitenansicht, Mitte: Draufsicht, rechts: Schaltzeichen)

Der Schaltungsaufbau

 

 

 

Abb. 6

Schaltungsaufbau mit zwei RC-Schaltung an P8 und P9 eines Propeller Chips.

Die Entladezeiten der beiden RC-Schaltungen werden von zwei unabhängig voneinander arbeitenden Zählern eines Kerns übernommen.

Das weitere Vorgehen

Entwirf in einem ersten Schritt ein neues Programm RC_Entladung_2Fototransistor, das nur die RC-Schaltung mit dem Fototransistor an P9 auswertet. Orientiere dich dazu an dem Programm aus der vorherigen Übung. Angesprochen wird die Schaltung mit dem Fototransistor am Eingang P9 des Propeller Chips mit

  • ctrb[5..0] := 9

das Zählermodul2 wird in den Modus POS Detektor versetzt mit

  • ctrb[30..26] := %01000

und die Erhöhung von phsb um 1 mit jedem Systemtakt erfolgt über

  • frqb := 1

Erst wenn das Programm fehlerfrei ist und die Schaltung die Entladezeiten im Terminalfenster anzeigt, integriere die neuen Programmzeilen in das Programm RC_Entladung aus Übung 2.  

 

Das komplette Programm mit zwei RC-Schaltungen, mit den unabhängig voneinander ausgemessenen Entladezeiten (Potenziometer und Fototransistor) sieht dann so oder so ähnlich aus:

Abb. 7a - Zwei RC-Schaltungen und ihre Entladezeiten werden über zwei voneinander unabhängig arbeitenden Zählern des Propeller Controllers (muliprocessing) ausgewertet und im Terminalfenster angezeigt.

Terminalausgabe

 

 

 

 

 

Abb. 7b

Im Terminalfenster werden die Entladezeiten von zwei RC-Schaltungen angezeigt. C1 ist der Kondensator im Potenziometerschaltkreis, C2 der im Schaltkreis mit der Fotodiode.

Die Entladezeiten bewegen sich bei 80 MHz Systemtakt zwischen ca. 440 µs und 640 µs.

Abschließende Bemerkungen

Ein Kern kann jeden seiner beiden Zählermodule völlig unabhängig voneinander starten und stoppen; er arbeitet nicht in einem timesharing-Verfahren.

 

Ein kleiner Schwachpunkt des Programms ist, dass die Verweilzeit, bis die Entladezeiten im Terminalfenster angezeigt werden, durch eine geschätzte Wartezeit (waitcnt(clkfreq/10 + cnt) erfolgt.

Möchte man die Entladezeiten anzeigen, sobald beide Kondensatoren sich entladen haben, dann muss das Programm etwas abgeändert werden:

Abb. 8 - Die repeat-Schleife wird solange durchlaufen, bis sich beide Kondensatoren entladen haben. Danach erfolgt die Anzeige im Terminalfenster.

Druckversion | Sitemap
© Reinhard Rahner - Gettorf