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
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.
Immer wenn ein Prozessor gestartet wird, werden alle sechs Register (drei für jeden Zähler) auf
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)
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
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.
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.
Die Einstellungen für das Zählermodul, dass mit jedem Taktimpuls den Zähler um 1 erhöhen soll, werden wie folgt vorgenommen:
speichert %01000 im CTRMODE-Bitfeld des CTR-Registers und versetzt den Controller in den POS-Modus.
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.
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 |
|
Aufgaben |
|
Schaltskizze
Das Programm RC_Entladung.spin
Wie arbeitet das Programm?
Vor dem eigentlichen Entladungsvorgang muss der Kondensator geladen werden. Die Schritte dazu:
Bei C = 10 nF wären das ca. 0,14 ms oder 140 µs, bei C = 1 nF 14 µs.
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
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:
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.
Der Schaltungsaufbau
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
das Zählermodul2 wird in den Modus POS Detektor versetzt mit
und die Erhöhung von phsb um 1 mit jedem Systemtakt erfolgt über
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:
Terminalausgabe
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: