Übung 4 – Helligkeitssteuerung einer LED mit den Arbeitsmodi der Zählermodule
Es gibt für die Zähler auf einem Propeller Chip zwei Arbeitsmodi (Duty Modes):
Im single-ended Modus lässt sich ein HIGH-LOW-Signal (Rechteckschwingung) über D/A Wandlung mit Hilfe des FRQ-Registers steuern.
Der Wechsel zwischen HIGH und LOW erfolgt sehr schnell; die mittlere Zeit für einen HIGH-Zustand (duty) wird bestimmt durch das Verhältnis vom Inhalt des FRQ-Registers zu 232 = 4.294.967.296. Allgemein gilt für ein Puls-/ Pausenverhältnis:
Nehmen wir an, dass bei einer D/A Wandlung ein Programm ein Signal von 0,825 Volt erzeugen soll. Von der anliegenden Betriebsspannung 3,3 Volt sind das 25 %. Um das zu erreichen, muss im Mittel ein Puls-/ Pausenverhältnis von 25 % = 0,25 eingestellt werden. Mit Hilfe der Formel pwm_01 ergibt das einen Wert für FRQ von
Aus Gleichung pwm_01 lässt sich auch der Arbeitswert DUTY berechnen, wenn der im FRQ-Register abgelegte Zahlenwert bekannt und über das CTR-Register der Single-ended DUTY Modus eingestellt ist.
Steht im FRQ-Register zum Beispiel die Zahl 536_870_912, dann ergibt das ein DUTY-Wert von
Bei einer anliegenden Versorgungsspannung von 3,3 Volt entspricht das einem Spannungswert von 0,4125 Volt.
Halten wir zum Schluss fest, dass die Zähler ihre Arbeit ausführen können, ohne dabei einen Kern des Propeller-Chips zeitlich zu belasten. Die Kerne können in der Zwischenzeit Arbeitsaufträge, die sie über das Programm erhalten, ohne Zeitverzögerung abarbeiten.
1 - DUTY-Modus näher betrachtet
Der DUTY-Modus wird bestimmt durch die Arbeitsgröße DUTY (Formel pwm_01). Der Quotient wird bestimmt durch den gesetzten Zahlenwert im 32-Bit FRQ-Register und der maximal darstellbaren Zahl in diesem Register:
Um die Arbeitsweise dieses Modus besser verstehen zu können, gehen wir mal von einem 3-Bit FRQ-Register aus. Der Nennerterm in Formel pwm_01 nimmt dann den Wert
an. Das FRQ-Register (3-Bit) kann mit allen Zahlen zwischen 0 und 7 gesetzt werden. Pro Arbeitstakt wird der im FRQ-Register abgelegte Wert zum PHS-Register addiert. Dazu schauen wir uns die ersten acht Takte und die Ergebnisse an.
Bei acht Additionen wird im Fall
genau dreimal das Carry-Bit gesetzt und der Ausgang auf
gezogen; entsprechend bei frq = 5 fünfmal.
2 - Wie arbeitet der Single-ended DUTY Modus?
Jedesmal, wenn der Wert aus dem FRQ-Register zum PHS-Register addiert wird, wird ein Carry-Flag gesetzt oder gelöscht.
Nehmen wir als Beispiel eine Schaltung, die maximal 3-stellige Dezimalzahlen verarbeiten kann; wird durch einen Additionsvorgang die 3-Stelligkeit überschritten – z. B. mit
erfolgt ein Übertrag in die vierte Dezimalstelle, die nicht zur Verfügung steht. Das Carry-Flag wird gesetzt (siehe hierzu: DUTY-Modus näher betrachtet)
Bei einer binären Addition mit Carry wird bei einem Propeller Chip in dem Moment, wo die Addition des FRQ-Registerwertes zum PHS-Register den Wert 232 – 1 überschreitet, ein Übertrag in die 33. Bitstelle erfolgen, die aber nicht vorhanden ist.
Im Single-ended DUTY Modus wird darauf hin das Carry-Bit gesetzt. Entscheidend ist, dass die Zeit, die das Carry-Bit HIGH ist, direkt proportional zu FRQ/232 ist.
Im Single-ended DUTY Modus steuert das Carry-Bit den Ausgangsstatus des zugehörigen I/O Pins (APIN/ BPIN). Da die Zeit, in der das Carry-Bit gesetzt ist, proportional zum Quotienten FRQ/232 ist, gilt das auch für den Ausgangszustand des betreffenden I/O Pins.
3 - Einen Zähler für den DUTY Modus konfigurieren
Im Propeller Manual findet sich der CTRMODE für den DUTY-Modus (siehe Abb. 1).
Der Tabelle entnimmt man für die beiden Modi single-ended und differential die CTRMODE-Einstellungen:
Aufgaben
Versuchsaufbau
Das Programm Led_PWM_duty_singleEnded.spin
Im DUTY-differential Modus reagiert Ausgang APIN wie im single-ended Modus; zusätzlich ist Ausgang BPIN auf !APIN (Negation von APIN) gesetzt. Während also an P21 die Lichtintensität zunimmt, nimmt sie an P22 ab. Beide LEDs verhalten sich gegenläufig. Dies kann mit Hilfe des Programms Led_PWM_duty_differential.spin gezeigt werden.
Das Programm Led_PWM_duty_differential.spin
4 - Die Spezialregister des Propeller Chips
Jeder Kern eines Propeller Chips verfügt über ein Spezialregister (SPR), auf dessen Elemente mit
zugegriffen werden kann. Die folgende Tabelle ist dem Propeller Manual v.1.2, S. 200 entnommen und zeigt die 16 verfügbaren Spezialregister jedes Kerns.
Mit Hilfe der Indexierung lassen sich Zählermodule innerhalb von Schleifenstrukturen in einem laufenden Programm initialisieren oder updaten; ein großer Vorteil. Aber es gibt auch einen Nachteil: die Spezialregister sind nicht Bit-adressierbar. Dies gelingt nur durch entsprechende Bitoperatoren, wie das folgende Beispiel zeigt.
5 - Ein Beispiel
Es werden zwei Einstellungen im CTR-Register betrachtet:
Die Bitadressierung über die Spezialregister gelingt mit folgender Programmzeile:
Das Bitmuster %00110 wird um 26 Stellen nach links verschoben und befindet sich dann im CTRA-Register in den Bitpositionen 30..26. Addiert man jetzt 4 dazu, dann wird diese Zahl in die Bitpositionen 5..0 geschrieben.
Mit dieser Schreibweise verkürzt sich das Programm Led_PWM-duty_singleEnded.spin (siehe Abb. 4) zu:
Die Indexierung erlaubt den Aufruf einzelner Registerfelder in einer Endlosschleife. Das Programm Led_PWM_duty_differential.spin (siehe Abb. 5) sieht dann mit Hilfe des spr-Befehls wie folgt aus:
6 - Lookup-Tabelle
Wenn die anzusteuernden Objekte, wie zum Beispiel LEDs, nicht an aufeinanderfolgenden Pins angeschlossen sind, dann ist die Indexierung in einem Programm nicht möglich. Stattdessen führt man eine Lookup-Tabelle ein.
Im folgenden Beispiel werden die LEDs an den Pins 17 und 22 angesprochen und zum Leuchten gebracht. Die LED an P22 verändert ihre Helligkeit doppelt so schnell wie die an P17.
Die Befehle LOOKUP, LOOKUPZ
Rückgabewert: 1-basierte Index-Position in der Liste (1..N) bzw. 0-basierte Index-Position in der zListe (0..N-1). Liste bzw. zListe ist eine durch Komma getrennte Liste von Ausdrücken. Liegt der Index außerhalb des Wertebereichs der Liste wird der Wert 0 zurückgegeben.