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

Fundamentum Propeller SPIN Programmierung

Ü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):

  • single-ended und
  • differential.

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:

  • 232 = 4.294.967.296.

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

  • 23 = 8

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.

Abb. 0 - DUTY Modus für ein 3-Bit PHS-Register. Es werden zwei unterschiedliche frq-Registerwerte betrachtet. Für frq = 3 ist das HIGH-LOW-Verhältnis 3/8, für frq = 5 entsprechend 5/8.

Bei acht Additionen wird im Fall

  • frq = 3

genau dreimal das Carry-Bit gesetzt und der Ausgang auf

  • APIN = 1 oder HIGH 

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

  • 568 + 839 = 1.407

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).

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

Der Tabelle entnimmt man für die beiden Modi single-ended und differential die CTRMODE-Einstellungen:

  • DUTY single-ended      %00110
  • DUTY differential         %00111

 

 

 

 

Abb. 2

Duty-Modus Einstellung für einen Propeller Controller, mit dem die Helligkeit von LEDs verändert werden kann.

Aufgaben

  • Eine LED soll so angesteuert werden, dass ihre Helligkeit sich in 256 Schritten von dunkel bis maximal hell bewegt.
  • Übertrage dazu das Programm Led_PWM_duty_singleEnded.spin in den Propeller Editor und speichere es ab.
  • Starte das Programm und überprüfe, ob die LED ihre Helligkeit in einer Endlosschleife immer wieder von "dunkel" bis "maximal hell" verändert.
  • Ändere das Programm so ab, dass der DUTY differential Modus eingestellt ist und schließe eine zweite LED an P22 an.
  • Wie verhalten sich die beiden LEDs zueinander. Beschreibe in kurzen Sätzen.

Versuchsaufbau

 

 

 

 

 

 

 

 

 

 

 

Abb. 3

Die an P21 und P22 angeschlossenen roten LED werden in Übung 4 benötigt.

Das Programm Led_PWM_duty_singleEnded.spin

Abb. 4 - Eine LED an P21 verändert ihre Helligkeit in 256 Schritten von dunkel bis ganz hell. Das Programm hat den Zähler in den DUTY single-ended Modus geschaltet.

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

Abb. 5 - Die LED an P21 verändert ihre Helligkeit in 256 Schritten von dunkel bis ganz hell, die an P22 von hell bis ganz dunkel in umgekehrter Folge. Das Programm hat den Zähler in den DUTY differential Modus geschaltet.

4 - Die Spezialregister des Propeller Chips

Jeder Kern eines Propeller Chips verfügt über ein Spezialregister (SPR), auf dessen Elemente mit

  • spr[index]

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.

Abb. 6 - Spezialregister des Propeller Chips (Auszug aus Propeller Manual v1.2 der Fa. Parallax Inc.)

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:

  • ctra[30..26] := %00110   ; Einstellung des CTR-Modus
  • ctra[5..0] := 4                    ; APIN-Bitfeld

Die Bitadressierung über die Spezialregister gelingt mit folgender Programmzeile:

  • spr[8] := (%00110 << 26) + 4

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.

Abb. 7 - Die Bitfolge %00110 wird um 26 Stellen nach links verschoben, dann wird %0100 hinzuaddiert. Das Ergebnis liegt im Registerfeld spr[8].

Mit dieser Schreibweise verkürzt sich das Programm Led_PWM-duty_singleEnded.spin (siehe Abb. 4) zu:

Abb. 8 - Die Zeilen 15 und 16 aus Abb. 4 wurden ersetzt durch die Zuweisung über das Spezialregister (neue Zeile 15).

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:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Abb. 9 - Zwei LEDs werden gleichzeitig alternierend von dunkel nach hell geschaltet. Die Initialisierung der Schaltung erfolgt in der ersten repeat-Schleife über das Spezialregister.

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.

Abb. 10 - Zwei LEDs an P17 und P22 verändern ihre Helligkeit mit unterschiedlicher Geschwindigkeit; die LED an P22 macht das doppelt so schnell wie die an P17.

Die Befehle LOOKUP, LOOKUPZ

  • lookup(index: Liste)
  • lookupz(index: zListe)

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.

Druckversion | Sitemap
© Reinhard Rahner - Gettorf