PIC2WS2812 Steuerung von WS2812-LEDs mit 8-Bit PIC Microcontroller
Grundlagen
PIC Lösung
Software-Module:
Basis
Patternprozessor
Patternmover
Microstep
Timer
Demo
Defines

Demo- und Test-Routinen

Diese Programmteile dienen zu Test- und Demonstrationszwecken. Der Code kann auch als Beispiel oder Grundlage für eigene Entwicklungen verwendet werden. In "demo.asm" sind verschiedene Anwendungen enthalten, die über eine seriellen Schnittstelle ausgewählt werden können. Ist keine solche Schnittstelle angeschlossen, dann sollte beim Reset der UART-Rx Pin am PIC (Pin 2) auf Low-Pegel gezogen werden, damit das Beispiel "Regenbogen" gestartet wird.

Kommunikation PC --> PIC

Wenn der PC noch über einen entsprechenden Hardware COM-Port verfügt, kann dieser verwendet werden. Jedoch muss der Spannungspegel von RS232-Pegel (+/-12V) auf PIC-verträgliche 0..5V reduziert werden!
Alternativ kann man auch einen USB-zu-Seriell-Adapter verwenden (als "virtuellen COM-Port"). Auch hier muss man ggf. den Pegel auf 0..5V wandeln.
Als Single-Chip USB->serial Lösung gibt es z.B. den FT232 von FTDI. An dessen Tx-Ausgang kann man natürlich den PIC direkt anschließen, da der Chip nur 0..5V ausgibt.
Ich verwende hier einen RX2SIM Adapter (RC WARE) im "USB2SYS"-Modus. Auch hier kann der Rx-Eingang direkt angeschlossen werden.

Zum Senden von Daten an den PIC braucht man noch ein geeignetes Terminal-Programm auf dem PC, wo man Daten in hexadezimaler Form eingeben kann, die dann an den PIC gesendet werden. Ich verwende hier das Programm "HTerm".
Bitte das Terminalprogramm so einstellen, daß es es nur die eingegebenen Daten an den COM-Port sendet, also nicht etwa "CR-LF" oder ähnliches sendet beim Drücken der ENTER-Taste! Und natürlich nicht vergessen, die Eingabe auf "hexadezimal" einzustellen!
 
Protokoll

Nach dem Reset bzw. Einschalten der Versorgungsspannung erwartet der PIC zunächst ein Byte zur automatischen Einstellung der Baudrate. Daher muss als erstes Byte unbedingt ein Byte mit dem Wert "55" gesendet werden!
Das zweite Byte dient zur Auswahl des gewünschten Test/Demo-Programms:

00: Seriell auf WS2812 Schnittstellenwandler
Alle Daten, die danach über die serielle Schnittstelle empfangen werden, gibt der PIC direkt an die LEDs weiter. Um auf diese Art mehr als nur die erste LED steuern zu können, muss die Übertragungsrate auf 1 MBaud eingestellt werden (schon vor dem Senden von "55")!
Außerdem müssen die Daten für alle anzusteuernden LEDs "am Stück", ohne Pause zwischen den Bytes, gesendet werden, sonst ist das FIFO gleich leer und die "Pause" wird als Ende der Übertragung interpretiert.
01: LEDs einzeln steuern
Die ersten 80 LEDs können durch einfache Steuerdaten direkt angesprochen werden. Ein Datenpaket besteht aus 4 Bytes:
<LED-Nummer> <Grün> <Rot> <Blau>
Wenn als <LED-Nummer> der Wert "FF" gesendet wird, werden alle 80 LEDs gleichzeitig angesprochen.
Diese Daten dürfen auch mit kleiner Baudrate gesendet werden, aber ohne lange Pausen zwischen den Bytes innerhalb eines Datenpakets!
02: Regenbogen Farbmuster
Es laufen Regenbogen-Farbmuster auf 1..3 Ebenen über den LED-Streifen.
03: Blaue Wellen
Experiment für eine Effektbeleuchtung - vielleicht wenn man noch akustisch etwas Plätschersound einspielen würde...? Da ist noch Spielraum für Parameter-Tuning oder Verbesserung der Patterns...
04: (für Testzwecke)

Bei den Demos 02 und höher können über kurze, jeweils 2 Byte lange "Kommandos" die Parameter geändert werden, während das Programm läuft. Das erste Byte wählt den Parameter aus, der eingestellt werden soll. Dabei definiert das higher Nibble (Bits 4..7) die Parameter-Auswahl, das lower-Nibble (Bits 0..3, "x" in der Tabelle) gibt i.Allg. die Ebene an, für die der Befehl gilt. Also, z.B. "21" ist der Befehlscode für "Modus" für die zweite Ebene (Zählung beginnt bei 0!).
Das zweite Byte des Kommandos enthält den neuen Datenwert.

0x Patternmover: Geschwindigkeit einstellen (x=Ebene)
Parameter:
01..7F = vorwärts, FF..80 = rückwärts, 0 = stop
1x Pattern-Auswahl (x=Ebene)
Parameter:
0: Regenbogen
1: Testpattern
2: blaue Welle 1
3: blaue Welle 2
4: kurzes RGB-Muster
 
Um evtl. selbst angelegte Patterns hier nutzen zu können, müssen deren Start- und Endadressen in die "retlw"-Tabelle (nach Label: pt_addrtb) eingetragen werden!
2x Modus einstellen (x=Ebene)
Parameter:
0: normal
1: wrapping
2: tiling
3: tiling + wrapping
3x Startposition des Patterns setzen, relativ zur ersten LED (x=Ebene)
Parameter:
0..7F = positiver Wert,
FF..80 = negativer Wert, d.h. Patternanfang wird vor der ersten LED, d.h. außerhalb des LED-Streifens positioniert. 
4x Startposition des Patterns setzen, relativ zum Ende der LED-Kette (x=Ebene)
Parameter:
0..7F = positiver Wert, d.h. Patternanfang wird hinter der letzten LED, d.h. außerhalb des LED-Streifens positioniert. 
FF..80 = negativer Wert, d.h. Patternanfang wird vor der letzten LED positioniert. 
5x Blendmode einstellen (x=Ebene)
Parameter:
0: opaque
1: mix
2: add
3: subtract,
4: microstep-opaque,
5: microstep-add,
6: multiply
6x Lücke zwischen Pattern-Wiederholungen im Tile-Mode (x=Ebene)
Parameter:
0..FF: Größe der Lücke (0..255 Pixels)
Fx Hintergrund setzen (x= Farbe, 0:Grün, 1:Rot, 2:Blau)
Parameter:
0..FF: Helligkeit der jeweiligen Farbe (x).



Weiter geht's mit "Defines".


Kontakt