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

SPIN2 und Propeller P2

I/O Pin - Teil 1

In dieser Rubrik greifen wir auf das Wissen und die Vorerfahrungen mit dem Propeller P1 zurück. Sehr hilfreich ist deshalb die Kenntnis aus der Rubrik Propeller P1 SPIN.

1 - Die I/O Pin des Propeller P2 (Theorieteil, muss leider sein)

 

Über das Thema P2 Intelligente Pins ließen sich viele Kapitel schreiben. Wir werden ganz bescheiden mit ein paar einfachen Beispielen über das Verhalten der I/O Pins anfangen.

 

Jeder der 64 I/O Pins eines Propeller P2 kann als Standard-Tri-State-I/O Pin konfiguriert oder mit 31 verschiedenen Modi intelligent aufgerüstet werden. Dabei kann jeder der acht Kerne die Pins aufrufen.

Das Verhalten jedes I/O-Pins wird durch die Kombination von vier Einstellungen beschrieben:

  1. Richtung (Eingang/Ausgang)
  2. Zustand (Ausgangsantrieb/Eingangssinn)
  3. Pin-Modus und
  4. Smart-Modus (optional).

Die ersten drei davon aktivieren oder verwenden spezielle interne Schaltungen im I/O-Pin-Block selbst (über DIR-, OUT/IN-, Mxx-Signale) und der vierte bietet optionale Zustandsmaschinensteuerungen. Jede der vier Einstellungen wird im Folgenden beschrieben.

 

1 - Richtung und Zustand

In ihrer einfachster Form werden I/O-Pins über dedizierte COG-Register und die sie betreffenden Befehle gesteuert. Das kennen wir bereits vom Propeller P1 und den Registern DIRA, OUTA und INA. Die Registernamen konnten unter SPIN1 als SPIN1-Anweisungen mit gleichem Namen in einem Programm verwendet werden (siehe unter Propeller P1 SPIN - I/O Befehle).

Abb. 1 - Auszug aus "Smart Pins rev. 5 von John Titus - Parallax Inc."

Mit Hilfe allgemeiner und spezieller Pin-Befehle kann in die Register

  • DIRA / DIRB
  • OUTA / OUTB

geschrieben und das Pin-Ein-/Ausgangsverhalten beeinflusst und über

  • INA / INB

Pin-Zustände ausgelesen werden.

Allzweckbefehle arbeiten mit dem gesamten 32-Bit-Register (alle Pins), während die speziellen Pin-Befehle mit einzelnen Bits (Pins) oder Bitgruppen arbeiten.

Abb. 2 - Auszug aus "Smart Pins rev. 5 von John Titus - Parallax Inc."

Insgesamt gibt es 14 Pinmethoden unter SPIN2; weitere Informationen zu den Befehlsaufrufen finden sich hier. Mit einzelnen Befehlen werden wir uns in den folgenden Übungen vertraut machen.

2 - I/O-Pin als Ausgang deklarieren

SPIN2 stellt für Ausgangspins verschiedene Methoden bereit.

  • pinh(pinfeld), pinhigh(pinfeld)
  • pinl(pinfeld), pinlow(pinfeld)
  • pint(pinfeld), pintoggle(pinfeld)
  • pinw(pinfeld), pinwrite(pinfeld)
  • pinc(pinfeld), pinclear(pinfeld)
  • pinf(pinfeld), pinfloat(pinfeld)

Die genannten Methoden setzen die Richtungsregister (DIRA, DIRB) für die angesprochenen Pins auf Ausgang. Ein Pinfeld kann aus minimal einem und maximal 63 Pins bestehen.

Übung 1 - Eine LED ein- und ausschalten

In drei aufeinanderfolgenden Stufen wird ein einfaches Blinkprogramm verschlankt und die Möglichkeit der Bitgruppenadressierung gezeigt.

Übung 1 - Eine LED ein- und ausschalten
Material
  • 1x  Parallax Propeller P2-Edge
  • 1x  Parallax Propeller P2-Edge-Board
  • 1x  Anschlusskabel, Schaltnetzteil
  • 8x  LED
  • 4x  Widerstand, 470 Ohm
  • diverse Steckkabel
Aufgaben
  • Baue die Schaltung nach Schaltskizze auf. Die LEDs sind mit den Pins P8, P9, P10 und P11 verbunden.
  • Übertrage das Programm IO_LED_01.spin2 in den Editor und speichere es ab.
  • Starte das Programm und überprüfe, ob die entsprechenden LEDs ein- bzw. ausgeschaltet werden.

Schaltskizze

 

 

 

 

 

 

 

 

 

 

Abb. 3

Schaltskizze zu Übung 1. Jede der vier LEDs ist mit einem Vorwiderstand von 470 Ohm ausgerüstet.

Das Programm IO_LED_01.spin2

 

 

 

 

 

 

 

 

 

Abb. 4a

Die Pinfelder werden über eine binäre Zahldarstellung ausgewiesen.

 

Wie arbeitet das Programm IO_LED_01.spin2 ?

Die Methode PUB main() enthält die drei Instruktionen

  • pinh oder pinhigh
  • pinl oder pinlow
  • waitms

Die Methoden pinh und pinl setzen einen Pin bzw. ein ganzes Pinfeld aufeinanderfolgender Pins auf HIGH bzw. LOW. Die Syntax lautet:

  • pinh, pinhigh, pinl, pinlow(pin(feld))

Das Argument pin(feld) kann eine Pinzahl zwischen 0 und 63 oder ein pinfeld sein.

Pinfelder werden durch eine 11-stellige Binärzahl im Format

  • %00000_000000

angegeben. Die sechs Lower-Bits beschreiben den Bezugspin, die fünf Higher-Bits die Anzahl der zusätzlich benachbarten Pins.

In Befehlszeile 13 wird mit

  • pinh(%00011_001000)

Pin P8 und drei weitere benachbarte Pins, in diesem Fall P9, P10 und P11, auf HIGH gesetzt. Die angeschlossenen LED leuchten.

 

Anstelle der binären Schreibweise bei Pinfeldern (s. Abb. 4a), lassen sich die Pingruppen auch über die Pinnummern direkt angeben (s. Abb. 4b).

 

Die Instruktion

  • waitms

gibt die Verzögerungszeit in Millisekunden an und ist eine von zwei Verzögerungszeit-Angaben in SPIN2. Die zweite Instruktion

  • waitus

misst die Verzögerungen in Mikrosekunden.

Das Programm IO_LED_01.spin2 mit abgewandelter Pindeklaration

 

 

 

 

 

 

 

 

 

 

 

Abb. 4b

Die Pinfelder werden durch direkte Angabe der Pinnummern deklariert.

Jetzt kommst du

  1. Wie muss das Programm abgeändert werden, damit alle vier LEDs blinken?
  2. Wie muss das Programm abgeändert werden, damit nur die mittleren beiden LEDs blinken?
  3. Wie muss das Programm umgeschrieben werden, damit nur die beiden äußeren LEDs blinken?
  4. Wie muss das Programm umgeschrieben werden, damit die beiden inneren und anschließend die beiden äußeren LEDs im Wechsel angehen?

Mögliche Lösungen

 

Lösung zu 1: Der Eintrag der fünf Higher-Bytes hat sich verändert.

 

 

Lösung zu 2: Es werden nur die Pins P10 und P9 aufgerufen.

 

 

Lösung zu 3: PZ 13: alle 4 LED leuchten; PZ14: die zwei mittleren LEDs werden ausgeschaltet. Nur die beiden äußeren LEDs leuchten. PZ 16: alle LEDs ausschalten.

 

Alternativlösung zu 3: Mit den Methoden pinwrite und pinclear lässt sich ein gleiches Ergebnis erzielen.

 

 

 

Lösung zu 4: Zur Lösung aus Aufgabe 3 kommt nur eine Programmzeile 17 hinzu. Sie schaltet die LEDs an P9 und P10 ein.

Alternativlösung zu 4: Eine kürzere Programmvariante gelingt mit der Methode pinwrite.

Zusammenfassung

 

Die unter SPIN2 für I/O Pins zur Verfügung stehenden PIN-Methoden (Auswahl aus dem Datenblatt):

  • pinh(pinfeld), pinhigh(pinfeld)
  • pinl(pinfeld), pinlow(pinfeld)
  • pint(pinfeld), pintoggle(pinfeld)
  • pinw(pinfeld), pinwrite(pinfeld)
  • pinr(pinfeld), pinread(pinfeld)
  • pinc(pinfeld), pinclear(pinfeld)
  • pinf(pinfeld), pinfloat(pinfeld)
  • wrpin(pinfeld,data)

lassen sich über Pinfelder ansprechen. Allgemein gilt:

  • Mit Pinfeldern lassen sich Gruppen von I/O-Pins auswählen.
  • Pinfelder sind 11-Bit-Werte, die sich aus einer Basispin-Nummer in den 6 Lower Bits 5…0 und einer Zusatz-Pin-Nummer in den fünf Higher Bits 10...6 zusammensetzen. Die Higher-Bits beschreiben die zusätzlich zum Basispin angesprochenen benachbarten Pins.
  • Pinfelder werden von Befehlen verwendet, die eine Schnittstelle zu Pins bilden.

Beispiele

Abb. 5 - I/O Pins: Pinfeld-Adressierung

Übung 2 - Inline-Assembler (PASM2)

Wer die Programmierung mit SPIN1 beim Propeller P1 kennt, wird hier vielleicht die Registerbefehle DIRA, OUTA vermissen. Sie sind noch vorhanden, lassen sich aber nur über ein Assembler-Programm (PASM) aufrufen.

Der Vorteil bei SPIN ist, dass man in einem SPIN-Programm Inline-Assembler Aufrufe starten kann. Wie das geht, zeigt die folgende Übung.

Übung 2 - LEDs einschalten über Inline-Assembler
Material
  • 1x  Parallax Propeller P2-Edge
  • 1x  Parallax Propeller P2-Edge-Board
  • 1x  Anschlusskabel, Schaltnetzteil
  • 5x  LED an P0 ... P4
  • 5x  Widerstand, 470 Ohm
  • diverse Steckkabel
Aufgaben
  • Baue die Schaltung nach Schaltskizze auf. Die LEDs sind mit den Pins P0, P1, P2, P3 und P4 verbunden.
  • Übertrage das Programm PASM2_LED_01.spin2 in den Editor und speichere es ab.
  • Starte das Programm und überprüfe, ob die entsprechenden LEDs ein- bzw. ausgeschaltet werden.

Das Programm PASM2_LED_01.spin2

 

 

Abb. 6

Inline-PASM Programm. Der Assemblerblock wird durch ORG und END innerhalb eines SPIN2 Programms begrenzt. Die Assembler-Mnemonics sind aus "PROPELLER P1 SPIN" bekannt und können dort nachgelesen werden.

Wie genau sind eigentlich die Instruktionen waitms und waitus?

Die Vermutung liegt nahe, dass sich mit der Wahl der Taktfrequenz die Verzögerungszeiten der beiden Befehle waitms und waitus verändern. Ob da was dran ist, soll jetzt untersucht werden.

 

Um das zu überprüfen, wird über einer LED, die über die Anweisung waitms(400) 400 ms ein- bzw. ausgeschaltet wird, die Zeit gemessen. Im Normalbetrieb, ohne Angabe einer Taktfrequenz arbeitet der Propeller Controller P2 im Takt-Modus RCFAST mit einer Taktfrequenz von ca. 12 MHz.

Das Oszillogramm liefert bei einem Befehlsaufruf waitms(400) eine gemessene Verzögerungszeit von ca.325 ms.

 

Abb. 5

Bei f ~ 12 MHz entspricht waitms(400) einer Zeitspanne von 325,3 ms. Für zeitkritische Programme ist das nicht akzeptabel.

Wird die Taktfrequenz im CON-Block explizit angegeben (im gezeigten Beispiel im Taktmodus XTAL1 + PLL1X und 200 MHz), entspricht einem Befehlsaufruf von waitms(400) eine gemessene Verzögerungszeit von ca. 400,.. ms (s. Abb. 6).

 

Abb. 6

Bei f = 200 MHz entspricht waitms(400) einer gemessenen Zeitspanne von ca. 400,.. ms.

Druckversion | Sitemap
© Reinhard Rahner - Gettorf