Forum: Mikrocontroller und Digitale Elektronik ws2812b und hw-uart auf attiny


von Meier (Gast)


Lesenswert?

Hallo,
welchen Ansatz sollte man in Richtung Attiny (zB 841) am besten 
verfolgen, wenn man mit WS2812b und UART arbeitet.

Das senden an die WS2812b dauert bei mir etwas unter 3ms. Die Leds 
sollen mit 50 - 100Hz beschrieben werden. Nun würden mir dafür knapp 
7ms(17ms) in etwa immer zu Verfügung stehen.

Gesendet wird immer nur 1 String a 12 Zeichen + 1 NL.

Die Kommunikation soll über ein BluetoothModul geschehen. Das, was ich 
da habe, arbeitet leider ohne Handshake oder ähnliches. Des weiteren 
soll auch über UART gesendet werden. Das sehe ich vielleicht noch als 
kleinest Problem. Einfach immer nach dem senden der WS2812b den String 
raushauen.

Wie soll das Auslesen erfolgen? Einfach Pollen oder über Interrupt 
auslesen und in einen String schreiben. Sobald der String erfolgreich 
('\n') angekommen ist, auswerten.

von holger (Gast)


Lesenswert?

>Die Leds sollen mit 50 - 100Hz beschrieben werden.

Warum? Die behalten ihren letzten Zustand auch ohne
das man was reinschiebt.

von Meier (Gast)


Lesenswert?

Ja, wenn eine Änderung erfolgt, soll es sich halt ändern. Bis hin zu der 
Datenrate. Geht hauptsächtlich um Effekte (keine statischen Farben oder 
einfache Fades).

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Meier schrieb:
> Wie soll das Auslesen erfolgen?

Welches "Auslesen"? WS2812 ist ein reiner Empfänger.

von Stefan S. (sschultewolter)


Lesenswert?

Auslesen auf der UART Seite.

Ich schiebe Konfigurationsdateien vom PC in den Attiny. Auf diese 
reagiert der Attiny und ändert die WS2812 entsprechend ab.

Die Frage ist, was ich hier am besten zum "reinschieben" nutzen kann.

1)
Einlesen über ISR und Fifo Buffer mit hoher Baudrate

2)
eine bestimmte Anzahl von Chars senden, damit die Ledausgabe gestoppt 
wird.
Erkennt der AVR eines der Chars, stoppt er und sendet ein kurzes 
Feedback zurück- Nun werden die Ledkonfigurationen gesendet. Danach 
folgen wieder bestimmte Chars, die signalisieren, alles angekommen, es 
kann weitergehen.

von holger (Gast)


Lesenswert?

Aus Meier wird Stefan S.;)

>Die Frage ist, was ich hier am besten zum "reinschieben" nutzen kann.
>
>1) Einlesen über ISR und Fifo Buffer mit hoher Baudrate

Das wird dazu führen das die Übertragung zu den LEDs
gestört wird und merkwürdige Farben auftauchen.

>2) eine bestimmte Anzahl von Chars senden, damit die Ledausgabe gestoppt
>wird.

Das düfen dann aber nicht mehr als zwei sein. Beim Atmega jedenfalls.

Meine Vorschläge:

3) Einen Controller verwenden der die Daten per DMA an die
LEDs schicken kann.

4) Vernünftige LEDs nehmen die synchron gefüttert werden und
keinerlei Timing erfordern (außer zu schnell).
Zum Beispiel mit LPD8806 Controller oder APA102. Dann kann
man gnadenlos per Interrupt Daten empfangen ohne das das
auch nur irgendwie stört.

von Stefan S. (sschultewolter)


Lesenswert?

holger schrieb:
> Aus Meier wird Stefan S.;)
Nicht ganz ;) Ich habe ein solches Teil am Laufen mit den WS2812 und C# 
Programm. Das ganze läuft aber nicht zu 100% störungsfrei aus dem mehr 
oder weniger gleichen Grund.
Habe es mit unterschiedlichen Baudraten versucht. Wobei bei mir eher das 
C# Programm die Werte verwurstet. Das ist aber eine andere Baustelle in 
einem Thread.
Die Ws2812b fliegen bei mir raus. Warte nur noch auf die PCBs aus China, 
um meine APA102C zu verlöten. Das ganze dient dazu später, das ganze 
auch auf andere Controller (hauptsächlich Atmel ARM M0+) zu portieren 
über die SPI Schnittstelle.

1) Das Einlesen erfolgte bei mir in der ISR und dem Buffer (siehe im 
AVR-Tutorial). Das empfangen war nicht einmal das größte Problem. Es 
musste aber ein paar Mal die Werte erneut gesendet werdet. Siehe deinen 
Einwand. Falsche Werte habe ich relativ simpel abgefangen.
Der String sah immer in etwa so aus "ff,33,00,33\n". Bevor diese auf die 
Leds geschoben werden, habe ich mit strtol die chars in 4 Bytes 
aufgeteilt. Lieferte meine strtol den Counterwert < 4, so habe ich Werte 
verworfen.

2) Die Variante hatte ich selber nicht getestet. Theoretisch müsste der 
Attiny einen Puffer von 1Byte haben ?

3) Fällt für mich bedingt weg, siehe 4).

4) Inzwischen sind die APA102 recht günstig geworden. Minimal 
schwieriger zu löten als die WS2812b. Aber machbar. Vorteil ist hier 
aufjedenfall, dass es eine synchrone Übertragung ist.
Spart in meinen Fall auch einiges an Speicher. Es sind immer 9 Leds 
zusammengeschaltet (Software). Möchte mir so das unnötige 
Zwischenspeichern der Werte ersparen und Speicher freischaufeln.

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

> WS2812 ist ein reiner Empfänger.

Sorry für das Posting. "-1" passt schon. ;-)

BT SPP scheint nur bis 1382400 Bd zu gehen.

Hier noch ein Hinweis zur Timing-Optimierung:

Thomas F. schrieb im 
Beitrag "Re: WS2812B über USB-UART ansteuern"
> Ich hab noch eine UART Konfiguration gefunden mit der die WS2812B
> Signale besser abgebildet werden können.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.