WS2812 Timing

OP #3473045
Lesenswert?

Ich bin gerade dabei mit eine Funktion für WS2812 LEDs zu scheiben. Ich 
mache es auf einem PIC12 indem ich das SPI Module verwende. Ich bin auf 
eine High Time von 750ns/375ns und eine Bitdauer von 1375ns gekommen. 
Das ist alles noch innerhalb der Toleranzen, aber zwischen dem Anfang 
vom letzten Bit und dem Anfang vom ersten Bit des nächsten Byte vergehen 
3.125µs.
Ist das ein Problem oder muss ich schauen ob ich beim Laden des neuen 
Bytes noch ein paar Taktzyklen sparen kann?

Vielen Dank.
OP #3473670
Lesenswert?

Das Problem hat sich jetzt erübrigt. Ich habe einen Weg gefunden um die 
Zeit zwischen dem Anfang vom letzten Bit und dem Anfang vom ersten Bit 
des nächsten Byte auf 1.75µs zu verkürzen. Laut Datenblatt ist die 
Bitzeit 1.25μs±600ns, also passt es jetzt.
Ich teste es momentan auf einem PIC18, weil die Post meinen PIC12 noch 
hat.
Wenn ich es dann auf dem PIC12 mache und den "MOVIW ++FSRn" Befehl 
benutzen kann komme ich runter auf 1.625µs. Das dürfte dann überhaut 
kein Problem mehr sein.
OP #3473911
Lesenswert?

Das verwirrt mich auch ein bisschen:
Im Datenblatt steht für
T0H:0.35us±150ns
T0L:0.8us±150ns
Das ergibt zusammen eine Bitzeit von 1.15µs±300ns.
Im Datenblatt steht aber auch Datatransfertime(TH+TL=1.25μs±600ns) und 
das passt irgendwie nicht zusammen. Hat jemand eine Erklärung dafür?
#3474021
Lesenswert?

http://www.mikrocontroller.net/articles/WS2812_Ansteuerung

Das Protokoll ist asnychron, es ist hauptsächlich die Länge der 
"1"-Phase relevant. Die Gesamtlänge eines Bits hat keinen großen 
Einfluss. Wichtig ist dass die Länge der "0"-Phase nicht so lang wird, 
dass sie als Reset interpretiert wird. Das ist bei einigen LEDs schon 
bei wenigen µs der Fall, obwohl 50µs spezifiziert sind.

Wenn Du eine funktionsfähige Lösung für den PIC hast, kannst Du sie ja 
zum Wikiartikel hinzufügen.
OP #3474332
Lesenswert?

Icke ®. schrieb:
> Welches Datenblatt hast du?
http://www.adafruit.com/datasheets/WS2812.pdf
Auf S. 4 zwischen den beiden Tabellen.

Tim    schrieb:
> Das Protokoll ist asnychron, es ist hauptsächlich die Länge der
> "1"-Phase relevant. Die Gesamtlänge eines Bits hat keinen großen
> Einfluss. Wichtig ist dass die Länge der "0"-Phase nicht so lang wird,
> dass sie als Reset interpretiert wird.
Das wird bei den 1.75µs wohl nicht das Problem sein.

Tim    schrieb:
> Wenn Du eine funktionsfähige Lösung für den PIC hast, kannst Du sie ja
> zum Wikiartikel hinzufügen.
Ich weiß noch nicht ob es funktioniert, weil ich die LEDs noch nicht 
habe. Auf dem Oszi sieht's aber gut aus. Ich werde ihn dann in der 
Codesammlung posten, wenn ich weiß, dass es funktioniert.

@Mod: Ich habe den Beitrag von "Tim" nur aus Versehen gemeldet, ich 
wollte ihn eigentlich zitieren. Sry
OP #3474594
Lesenswert?

Icke ®. schrieb:
> Jetzt seh ich es auch, echt gut versteckt zwischen den Tabellen.
> Aber siehe Tim, das Timing ist nicht sooo kritisch.

Also müsste das Programm theoretisch funktionieren. Wenn ich es getestet 
und eventuell verbessert habe kommt es in die Codesammlung. Erst für 
PIC18, dann für PIC12.

Und die Werte sollten auch für WS2812B LEDs passen:

    | WS2812 | WS2812B | Programm
T1H | 0.7µs  |  0.8µs  | 0.75µs
T1L | 0.6µs  |  0.45µs | 0.625µs
    |        |         |
T0H | 0.35µs |  0.4µs  | 0.375µs
T0L | 0.8µs  |  0.85µs | 1µs

Tim    schrieb:
> es ist hauptsächlich die Länge der "1"-Phase relevant.
Vor allem die hat die richtige länge.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren