Forum: Projekte & Code AVR ASM ws2811 / ws2812 Ansteuerung mit FastPWM


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Markus M. (adrock)


Angehängte Dateien:

Lesenswert?

Hi,

anbei mal meine Version der ws2811 (Controller) / ws2812 (RGB LED mit 
eingebautem Controller) Ansteuerung im schnellen 800KHz Modus.

Ich habe FastPWM mit dem Timer 0 verwendet. Getestet mit einem ATtiny45 
bei 16MHz.

Es gibt zwei Versionen der Ausgabefunktion, mit/ohne Gammakorrektur per 
Lookuptabelle.

Das Timing für die High-und Lowzeiten des seriellen Protokolls kann 
durch ändern der entsprechenden Definitionen (in Grenzen) geändert 
werden.

Files:

ws2812.h : Headerfile
ws2812.s : ASM Source
ws2812test.c : Kleines C Testprogramm
gammacorrection.h : Ein paar Makros für Gammakorrektur
asmdefs.h : Ein paar nützliche Makros...

(Build mit Atmel Studio 6)

Grüße
Markus

von Markus M. (adrock)


Angehängte Dateien:

Lesenswert?

Hi,

anbei eine neue Version. Unterstützte Controller:

- ATtiny 45/85 (ATtiny 45 getestet)
- ATmega 48/88/168/328 (ATmega 168 getestet)
- ATxmega xA3, xA3U (DMA support) (192A3 getestet)

Zu verwenden von C und ASM.

Grüße
Markus

von Tibor S. (cc1337)


Lesenswert?

Hi,

ich bin seit gestern auch im Besitz von WS2811 LED Stripes. Habe jetzt 
mal 1m an einen Atmega88-20PU angeschlossen und verwende einen 20MHz 
Quarz, das ganze steckt auf dem Pollin AVR Evaluationsboard.
Ausgabeport ist an die Stripes angeschlossen, und GND vom 
Evaluationsboard mit GND des Stripes verbunden.

nach einigem Hin und her habe ich nun die Fuses auf "Ext. Full Swing 
Crystal, 16K CK / 14CK + 0ms" gesetzt. Stimmt das?

Die 2 Compiler Flags im AVR Studio (das ich heute installiert habe) 
stehen auf "F_CPU=20000000UL" bzw. "-DF_CPU=20000000" (Hinweis: In der 
Readme steht einmal DF_CPU und einmal DC_CPU, ich denke letzteres ist 
ein Fehler? )

Ich weiß nicht wie das Ergebnis aussehen soll, aber ich glaube bei mir 
ist es nicht richtig :)
Beim Programmstart läuft schwaches Rot von LED 1 bis ca. 20-25, sort 
flackert es herum, danach ist dunkel. Habe 400000 und 800000 als stripe 
timing getestet, gleiches Ergebnis?!

Ich habe noch nie mit dem AVR Studio gearbeitet, und auch wenig Ahnung 
von dem ASM dort. Habe nur mal etwas MIPS gelernt aber das ist lange 
her.

Daher fällt mir die Fehlersuche gerade etwas schwer, über einen Tipp 
würde ich mich sehr freuen :)
Vielleicht wie ich das testprogramm dazu bewege einfach mal alles "grün" 
zu machen oder so. Ich habe hier RAND durch 255 bei Grün ersetzt, aber 
das hatte nicht den gewünschten Effekt. Denke es gibt hier zu viele 
Variablen für mich an denen es liegen könnte:)

Viele Grüße,

CC1337

von Tibor S. (cc1337)


Lesenswert?

Hi,

ich nochmal.

Ist mir etwas peinlich, aber wollte mal einfach nen anderen Strip 
probieren und mit dem gehts :) Es stellte sich heraus, dass sich in der 
Zwischenzeit ein Pin im Stecker löste...

Also, super Programm, kann ich nur empfehlen zum Einstieg!

CC1337

von Markus M. (adrock)


Lesenswert?

...sehr schön, dann ist das ja geklärt :-)

Ja, das muss natürlich immer F_CPU sein, da habe ich mich wohl an einer 
Stelle vertippt.

Viele Grüße
Markus

von chris (Gast)


Lesenswert?

Vielleicht sollte man diese Library noch erwähnen:
Beitrag "Lightweight WS2811/WS2812 Library"

von adrock (Gast)


Lesenswert?

Jo, ist halt ein anderer Ansatz... vlt. schreibt ja jmd. mal einen 
Artikel im Wiki oder verlinkt die Themen zu dem Bauteil-Eintrag im Wiki 
:-)

Viele Grüße
Markus

von Axel R. (axelroro)


Lesenswert?

Sehr schön, bei mir blinkt es nun auch schon hinter mir in allen Farben 
mit Deinem Program.Danke auch dafür.

Eine Frage: Verstehe ich richtig, die Helligkeit in MyData darf max. 127 
sein und wird dann über die Gamma Funktion auf die max 255 pro Farbe des 
WS2812 gemappt?

Grüsse

von Stephan B. (matrixstorm)


Lesenswert?

Hallo Alle.

Gaebe es von eurer Seite aus Bedarf fuer eine WS2812 Ansteuerung, die 
lediglich den internen 8MHz benoetigen wuerde?

Ich haette eine Roh-Implementierung und wuerde gern wissen ob sich 
aufraeumen lohnt, ob es jemand anderes gebrauchen koennte?

Klarer Vorteil duerfte wohl sein, das man preiswerte "ATmegas" ohne 
grossartig externe Komponenten verwenden koennte...


MfG

von Markus M. (adrock)


Lesenswert?

@Axel: Ja genau. Das ist aber willkürlich, man kann natürlich auch eine 
eigene Tabelle für die Gammakorrektur mit 8 Bit -> 8 Bit verwenden.

Mit den 256 Stufen die die WS2812 anbieten wird das aber nicht viel 
bringen. Gerade im unteren Helligkeitsbereich ist ja die Abstufung 
kritisch, und da nützen einem die 8 Bit dann auch nichts.

So hat man das Bit 7 dann noch frei um irgendwas für die interne 
Verarbeitung zu signalisieren, z.B. Effekte auf "Pixelbasis" 
an/ausschalten etc.

Grüße
Markus

von Markus M. (adrock)


Lesenswert?

Hi Stephan,

soweit ich weiß gibt es da ja schon Lösungen mit "Bit Banging".

Meine Intention hinter der Lösung war ein möglichst präzises Timing 
durch verwenden der FastPWM bzw. sogar eine Ausgabe im "Hintergrund" 
durch verwenden von DMA des XMega.

In Sachen "Sparsamkeit" ist die Methode zu Fuß sicherlich am 
effektivsten. Wirklich cool wäre Code, der sich der entsprechenden 
CPU-Frequenz (F_CPU) anpasst, also dann per Makro o.ä. zusätzliche NOPs 
einfügt, damit auch bei anderer Frequenz das Timing stimmt (gibt es aber 
vlt. auch schon?)

Grüße
Markus

von Stephan B. (matrixstorm)


Lesenswert?

Markus M. schrieb:
> Wirklich cool wäre Code, der sich der entsprechenden
> CPU-Frequenz (F_CPU) anpasst, also dann per Makro o.ä. zusätzliche NOPs
> einfügt, damit auch bei anderer Frequenz das Timing stimmt

Hallo Markus M.

Ja genau so ist es geplant.
Per "#if F_CPU" werden entsprechende Header included.

Derzeit werden 8MHz und 16MHz unterstuetzt.
Die Timings sind dabei (Annahme: clock stabil) bis auf 0.05 uS genau.

Das bei 8MHz zu erreichen ist nicht ganz einfach. Ich musste dazu eine 
Funktion schreiben die ein RGB-Array in eine spezielle Bytecodesquenz 
konvertiert. Spezielle im Flash aligned Funktionen nutzen dann die 
unteren 8Bit des Z-Registers um per "ijump" den Bytecode zu 
interpretieren...
..die Funktionen selbst geizen dann um jeden cycle ;-)
(z.B. wird "out" mit 2 verschiedenen Registern benutzt um "sbi" zu 
vermeiden)

Aber andere Loesungen zu sehen ist immer wieder interessant...

MfG Stephan

von Tim  . (cpldcpu)


Lesenswert?

>
> In Sachen "Sparsamkeit" ist die Methode zu Fuß sicherlich am
> effektivsten. Wirklich cool wäre Code, der sich der entsprechenden
> CPU-Frequenz (F_CPU) anpasst, also dann per Makro o.ä. zusätzliche NOPs
> einfügt, damit auch bei anderer Frequenz das Timing stimmt (gibt es aber
> vlt. auch schon?)

Das kann meine Library für AVR von 4-20MHz. In der ARM-Version wird die 
Anzahl der notwendigen NOPS sogar während die compilierung berechnet, so 
dass optimales Timing von 8-60MHz erreicht wird. Wenn ich mal Zeit 
finde, werde ich dieses auch noch für die AVR-Variante umsetzen.

Code hier:

https://github.com/cpldcpu/light_ws2812

Exakteres Timing scheint für die WS2812 nicht notwendig zu sein. Ich 
vermute dass eine Implementierung per PWM und SPI hier keine Vorteile 
bringt, insbesondere da die benötigt CPU-Zeit ja die gleiche ist. Aber 
es ist halt etwas interesssanter :)

von Tim  . (cpldcpu)


Lesenswert?

Stephan B. schrieb:
> Das bei 8MHz zu erreichen ist nicht ganz einfach. Ich musste dazu eine
> Funktion schreiben die ein RGB-Array in eine spezielle Bytecodesquenz
> konvertiert. Spezielle im Flash aligned Funktionen nutzen dann die
> unteren 8Bit des Z-Registers um per "ijump" den Bytecode zu
> interpretieren...

Hm... also 8 Mhz ist kein Problem. 4 Mhz geht auch. Dafür muss man 
keinen extremen Aufwand betreiben.

von Stephan B. (matrixstorm)


Lesenswert?

Tim .  schrieb:
> m... also 8 Mhz ist kein Problem. 4 Mhz geht auch. Dafür muss man
> keinen extremen Aufwand betreiben.

Vielen Dank Tim.

Das wundert mich jetzt auch ;-). Ich werde mir definitiv mal deinen Code 
detaillierter ansehen.

Auf den ersten Blick wuerde ich aber sagen: Mein Code kann das Array 
immer wieder periodisch (wie einen 1D-Torus) auslesen und so auch mit 
kleineren Arrays mehr LEDs (mehr als 256) ansteuern.

Bei deiner Lib ist alles 8-Bit Code und laeuft daher schneller...

...ich kann ja meinen bisherigen Code demnaechst einmal posten damit ein 
besserer Vergleich moeglich ist.
Fuer manche Strips koennte ich mir aber durchaus mehr als 256 LED von 
praktischer Relevanz vorstellen.

MfG Stephan

von Tim  . (cpldcpu)


Lesenswert?

Ich verstehe leider nicht alle von Deinen Anmerkungen, da ich Deinen 
Code nicht sehen kann :)

>Auf den ersten Blick wuerde ich aber sagen: Mein Code kann das Array
>immer wieder periodisch (wie einen 1D-Torus) auslesen und so auch mit
>kleineren Arrays mehr LEDs (mehr als 256) ansteuern.

Das Protokoll reagiert auf kurze Pausen zwischen den LEDs relativ 
tolerant. Die Daten werden erst nach der "Reset"-Bedingung übernommen. 
Es ist daher kein Problem, zwischendruch den Array-Pointer neu zu 
initialisieren und so mit einem kleinen Array lange Strings zu 
beschreiben.

von Stephan B. (matrixstorm)


Angehängte Dateien:

Lesenswert?

Tim .  schrieb:
> Ich verstehe leider nicht alle von Deinen Anmerkungen, da ich Deinen
> Code nicht sehen kann :)

Hier die Vorabversion meines Codes, welcher sicherlich noch aufgeraeumt 
werden muss...

Ich gebe zu, das sogesehen ueber eine RGB-Sequenz hinaus, ein 100% 
korrektes Timing nicht erforderlich ist...

...ggf. nuetzt es ja dennoch jemanden...

MfG Stephan

von Tim  . (cpldcpu)


Lesenswert?

Danke für Deinen Code. Sehr interessante Lösung, dafür aber ziemlich 
kompliziert!

von Marcel J. (marceljung)


Lesenswert?

Hi
Ich bin neu(...) und wollte diese LEDs über ein ATMega328 machen. Kann 
mir da Jemand helfen und Tipps oder der gleichen geben wie ich das 
anstellen muss?
Vielen Dank
mit freundlichen Grüßen
Marcel

von axelroro (Gast)


Lesenswert?

Marcel, such halt mal in der Codesammlung nach ws2812 - da findet sich 
einiges. AvrStudio und Programmer natürlich vorausgesetzt als 
Minimalausstattung.

von Stephan B. (matrixstorm)


Lesenswert?

Hi.

Marcel Jung schrieb:
> Ich bin neu(...) und wollte diese LEDs über ein ATMega328 machen. Kann
> mir da Jemand helfen

Na z.B. in der Makefile von oben DEVICE auf atmega328p umstellen?

MfG

von Marcel J. (marceljung)


Lesenswert?

Es sind einfach fragen wie:
Brauch ich ein externen Quarz, und wo dieser dann angeschlossen wird?
Brauche ich für jede LED die ich mit einer anderen Farbe ansteuern will 
ich ein neuen PWM "Pin"?
-->Kann ich aus anderer Pins durch Sw. zu PWM Pins machen?
Wenn ich sie Parallel schalten will(wie in der PDF) sind  r1 und c1 
vorhanden, welche werte brauche ich da oder gibt es einen besseren Weg?
Ist R1 der vorwiederstand welcher die LED schützt?

(AW: Habe den avr Dragon als Programme)

Vielen dank für die schnellen Antworten!
MfG Marcel

von Stephan B. (matrixstorm)


Lesenswert?

Hallo

Marcel Jung schrieb:
> Brauch ich ein externen Quarz
Bis 8MHz nein. Wenn man zusaetzlich die interne Taktkalibrierung benutzt 
(OSCCAL), sollten die Timings der WS2812 kein Problem sein.

Marcel Jung schrieb:
> Brauche ich für jede LED die ich mit einer anderen Farbe ansteuern will
> ich ein neuen PWM "Pin"?

Nein, bitte lese das Datenblatt! Es ist ja gerade die Besonderheit da 
WS2812 kaskadiert werden kann. Egal wie viele man ansteuern will, man 
brauch nur eine Datenleitung!

Marcel Jung schrieb:
> -->Kann ich aus anderer Pins durch Sw. zu PWM Pins machen?

Je nach Implementierung des WS2812 Ansteuerung reicht sowieso ein 
gewoehnlicer GPIO aus. (z.B. fuer meinen Code: 
Beitrag "Re: AVR ASM ws2811 / ws2812 Ansteuerung mit FastPWM" )

Marcel Jung schrieb:
> Wenn ich sie Parallel schalten will(wie in der PDF) sind  r1 und c1
> vorhanden, welche werte brauche ich da oder gibt es einen besseren Weg?
> Ist R1 der vorwiederstand welcher die LED schützt?

WS2812 braucht im 5V Betrieb keinen Vorwiderstand (sie hate einen 
eingebauten Konstantstromtreiber). Jede WS2812 LED braucht laut 
Datenblatt ihren eigenen 0.1uF Kondensator moeglichst nahe bei der LED 
zwischen VCC und GND.


MfG

von Marcel J. (marceljung)


Lesenswert?

Vielen vielen dank für die tolle Informaton und auh die unglaublich 
schnelle Reaktion. Noch eine tolle Woche!
Mfg Marcel

von Marcel J. (marceljung)


Lesenswert?

In habe leider das falsche Datenblatt und finde leider keine genauen 
Angaben.
Was für ein Kondensator ist den genau nötig?
Viel Spaß beim basteln
Marcel

von Stephan B. (matrixstorm)


Lesenswert?

Hallo

Marcel Jung schrieb:
> Was für ein Kondensator ist den genau nötig?

http://www.mikrocontroller.net/attachment/180459/WS2812B_preliminary.pdf

Seite 5: Typical Application.
Wobei C 104 einem 0.1uF Kerko entspricht.

MfG

von Marcel J. (marceljung)


Lesenswert?

und bei wie viel Volt der schaltet ist egal?
ich weiß nicht wie ich mich bedanken soll aber ich wäre auf jeden Fall 
ohne die Hilfe aufgeschmissen...
MfG Marcel

von Marcel J. (marceljung)


Lesenswert?

Ich habe auch gemerkt, dass ich 6 smd pins habe. Nicht 4 wie in der 
Pdf--> WS2812b habe ich leider nicht bekommen (obwohl sie besser währen)

von Marcel J. (marceljung)


Lesenswert?

Ich nehme jetzt einfach 0,1uf bei 50v. Hätte jemand zufällig die 
Eaglecad lib für die ws2812?
Mfg Marcel

von Stephan B. (matrixstorm)


Lesenswert?

Marcel Jung schrieb:
> Ich nehme jetzt einfach 0,1uf bei 50v.

Bissel was ueber 5V reicht. Mehr liegt an dem Ding doch eh nicht an.

Eaglelib wuerde mich auch interessieren.

MfG

: Bearbeitet durch User
von Marcel J. (marceljung)


Lesenswert?

Wo find ich die mit 5v???
Finde zur zeit nur die von oben im 500 Pack!

http://www.mikrocontroller.net/articles/Datei:WS2812.lbr geht leider 
nicht

Mfg Marcel

von Stephan B. (matrixstorm)


Lesenswert?

Marcel Jung schrieb:
> Wo find ich die mit 5v???

Du kannst natuerlich auch Spannungsfestere nehmen, wenn die billiger 
sind.

Ich verwende u.A. die hier: 
http://www.aliexpress.com/item/Free-Shipping1000PCS-Ceramic-Disc-Capacitors-50V-100nF-0-1uF-104pF/738637530.html

MfG

von Marcel J. (marceljung)


Lesenswert?

Auf Sparkfun gibts ein Eagle cad Schaltplan. Den kann man verändern ( 
ist aber leider keine Lib datei zu finden)
Brauche ich ein jumper zwischen Vcc und Vdd?--> verstehe nicht wieso
MfG Marcel

: Bearbeitet durch User
von marixstorm (Gast)


Lesenswert?

Ich habe mich nur mit der WS2812B beschaeftigt.

Zu der WS2812 kann ich nichts konkretes sagen. Da wurde aber wohl noch 
die LED und der Controller separat versorgt. Ggf. brauchst du dann auch 
mehr Kondensatoren und ggf. auch verschiedene Spannungen.

MfG

von Marcel J. (marceljung)


Lesenswert?

Dennoch vielen Dank! Wo bekomme ich denn die B Version?

MfG

: Bearbeitet durch User
von Stephan B. (matrixstorm)


Lesenswert?

Hi.
Aliexpress? Ebay?

Wie viele benoetist du denn?

Ggf. hab ich noch ein paar (genug) uebrig...

MfG

von Marcel J. (marceljung)


Lesenswert?

Vielen dank für die schnellen antworten! Hatte leider keine zeit zum 
antworten:( Ich versuch nun erst einmal die WS2812 zum laufen 
zubekommen.
Leider verstehe ich den Code von oben nicht ganz... Wie kann ich die 
denn zum laufen bekommen?
Mfg

von Stephan B. (matrixstorm)


Lesenswert?

Marcel Jung schrieb:
> Leider verstehe ich den Code von oben nicht ganz

Hallo Marcel

Ein zur WS2812 gesendeter Bitwert wird durch die Zeit eines Wechsels vom 
5V-Pegel zum GND-Pegel codiert. Wenn keine Daten uebertragen werden 
liegt die Signalleitung auf GND.

0: 0.4us 5V und dann Wechsel zu GND fuer min. 0.85us
1: 0.8us 5V und dann Wechsel zu GND fuer min. 0.45us

(Ein Bit dauert also 1.25us)

Es werden immer 24Bit von einer LED gespeichert und alle darauffolgenden 
Bits an die naechste LED weitergeleitet. (Die davon auch wieder 24Bit 
fuer sich speichert und dann weiterleitet...)

Wenn laenger als 50us die Sinalleitung auf GND liegt - somit nichts 
weiter uebertragen wurde - werden die zuvor gesendeten Daten von allen 
LEDs uebernommen und die entsprechende Farbe angezeigt.

Eine neue Uebertragung startet dann wieder bei der ersten LED welche 24 
Bits fuer sich speichert bevor sie wieder weiterleitet...

Da diese Zeiten relativ genau eingehalten werden muessen, gibt es 
verschiedene Moeglichkeiten diese Pegel mit einem AVR zu generieren.
Die oben eingesetzte Möglichkeit ist via GPIO mittels Assemblercode.

Bei kalibrierten 8MHz entspricht der Uebertragungsdauer von einem Bit 
(1.25 us) also genau 10 Takten. 10 Takte in denen man zwischen GND zu 5V 
mit einer Zeitaufloesung von theoretisch einem Takt den GPIO umschalten 
muss. Da die Maschienenbefehle vom AVR fest definierte 
Ausfuehrungszeiten haben (mache 1 Takte, manche mehr) verwenet man 
ueblicherweise Assemblercode um die Zeiten indirekt (ueber die Wahl des 
Befehls) genau zu definieren.

MfG

von Tim  . (cpldcpu)


Lesenswert?

Marcel Jung schrieb:
> Leider verstehe ich den Code von oben nicht ganz... Wie kann ich die
> denn zum laufen bekommen?
> Mfg

Der code oben ist unnötig kompliziert. Der Wiki-Artikel könnte hilfreich 
sein:

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

von Stephan B. (matrixstorm)


Angehängte Dateien:

Lesenswert?

Hallo!

Vielleicht ist es fuer jemanden von euch von Nutzen:

Basierend auf https://github.com/adafruit/Adafruit-Eagle-Library habe 
ich mir erlaubt eine Eagle-Library fuer die WS2812B (Nachfolger der 
WS2812) zu erstellen.

Feedback ist dringend erwuenscht.

von Marcel J. (marceljung)


Lesenswert?

Hi
Tolle Eagle-Library! Kann man wirklich gut gebrauchen danke!!!
Noch eine Frage: Ich hab irgendwie einen Denkfehler also wollte ich den 
Code von Oben anschauen.... Welchen brauche ich da? --> Ich brauche 
dringend ein Erfolgserlebnis;)
Danke für die Library --> Ich bin gerade am entwickeln

MfG

von Stephan B. (matrixstorm)


Lesenswert?

Hallo.
Welchen Mikrocontroller planst du zu benutzen?

Codetechnisch funktionieren beide. Sowohl mein Beispiel (was ja bereits 
als kompliziert vermerkt ist), als auch 
https://github.com/cpldcpu/light_ws2812

Fuer tinyUSBboard (http://matrixstorm.com/avr/tinyusbboard/) kann ich 
dir eine vorkompilierte Firmware (laufender Regenbogen) zukommen lassen.

MfG

: Bearbeitet durch User
von Marcel J. (marceljung)


Lesenswert?

Hi
Sorry für die Verspätung! Ich habe vor ein Atmega 328p-pu und will die 
LEDS per Display ansteuern. Da das nicht läuft habe ich es mit Tastern 
versucht aber es will auch nicht...

MfG

von Stephan B. (matrixstorm)


Lesenswert?

Hi Marcel

Marcel Jung schrieb:
> Ich habe vor ein Atmega 328p-pu und will die
> LEDS per Display ansteuern. Da das nicht läuft habe ich es mit Tastern
> versucht aber es will auch nicht...

Kannst du das bitte genauer ausfuehren. Ich kann dir mit den bisherigen 
Text leider nicht folgen.

MfG

von Marcel J. (marceljung)


Lesenswert?

Ich habe einen touch Panel, welcher über ein Atmega32 die WS2812 LED 
ansteuern sollte(Farbe usw). Da dieser Ansatz zur Zeit nicht läuft, habe 
ich es erst einmal über Poti oder einen Taster zu versuchen. Leider geht 
das auch nicht! Ich glaube also, dass ein fehler in meinem Code ist. Um 
diesen auszubessern bzw einen neuen code zu erstellen wollte ich ein 
beispiel.
Vielen dank für die genommene Zeit.
MfG

von Stephan B. (matrixstorm)


Lesenswert?

Hallo Marcel.

Haenge doch deinen Code einfach mal mit an.


MfG

von Marcel J. (marceljung)


Lesenswert?

Hi
Da mein Code noch mit einem Bootloader und noch mit teilen des Codes für 
die Display Ansteuerung versehen ist, ist das ganze ziemlich 
unübersichtlich...
Ich muss also wohle neu anfangen:( Gibt es dazu ein "effizienten" Code?
Frohes Fest

von Stephan B. (matrixstorm)


Lesenswert?

Marcel Jung schrieb:
> Gibt es dazu ein "effizienten" Code?

Beschreibe doch einfach moeglichst genau, was du machen willst - und wir 
koennen dann weiter sehen.

Dir auch ein Frohes Fest.

MfG

von o_O (Gast)


Lesenswert?

Stephan, ich bewundere Deine Geduld.

Lade doch Deine Eagle-Lib mal ins Wiki hoch, damit sich auf der WS2812 
Bauteileseite auftaucht.

von Stephan B. (matrixstorm)


Lesenswert?

Hallo

o_O schrieb:
> Lade doch Deine Eagle-Lib mal ins Wiki hoch

Ich wollte jetzt nicht gleich einen eigenen Artikel schreiben - wuerde 
es also irgendworan anhaengen wollen. Irgendwelche Vorschlaege welchen 
Artikel ich nehmen soll?


MfG

von o_O (Gast)


Lesenswert?

Ich glaube, es reicht die Datei mit WS2812 im Namen hochzuladen. Schaue 
Dir doch mal an, was schon da ist. Hier --->> WS2812 klicken

von Stephan B. (matrixstorm)


Lesenswert?


von Michael (Gast)


Lesenswert?

Hallo Markus,

ich habe gerade mal deine WS2812 lib auf meinem XMega32A4 testen wollen, 
bekomme aber leider kein gültiges Datensignal aus meinem Port raus, 
komischerweise nur konstante 1,6V statt der gewünschten 5V.
Ich shifte die datenlevel mit einem MAX3002 auf 5V hoch, bei normalen 
Triggern der Ports liegt auch ein 5V level an.
Muss in deinem ASM Source noch etwas für den xm32a4 angepasst werden?
Bin nicht so ASM affin so das ich die anpassungen leider nicht selber 
vornehmen könnte falls welche nötig sein sollten.

Eventuell hast du oder jemand anderes ja eine Idee wodran es liegen 
könnte.


Gruß Michael

von Markus M. (adrock)


Lesenswert?

Hi,

bitte beachten, dass der Test-Sourcecode davon ausgeht, dass ein 
externer Quarzoszillator (16 MHz) am XMega hängt für den Takt.

Um den internen Takt zu verwenden, muss die entsprechende Stelle 
geändert werden wo der Taktgenerator konfiguriert wird.

Grüße
Markus

von Michael S. (michael_s98)


Lesenswert?

Das mit dem externen 16 MHz Quarz ist gegeben. Ich habe lediglich den 
Port auf Port D0 gesetzt.

von Markus M. (adrock)


Lesenswert?

Port D0... D.h. Du hast statt dem TCC0 Timer den TCD0 Timer verwendet?

Im ws2812.h im Abschnitt zum "WS_ARCH_XMEGA" müssten folgende Änderungen 
gemacht sein:

#define     WS_TCC          TCD0        // Timer/Counter to use
...
#define     WS_EVSYS_MUXVAL 0b11010000  // Event selection == TCC0OVF
...
#define     WS_OUTPORT      PORTD       // output port
...

Grüße
Markus

von Michael S. (michael_s98)


Lesenswert?

Habs nun nochmal mit deinen Angaben probiert (Bin noch nicht so fit in 
den xMega Registern) aber bekomme immernoch dasselbe Ergebnis.
Nur ein Maximallevel von 1,7V auf den Datenleitungen. Bekomme zwar ein 
Signal am Oszilloskop angezeigt, wird aber immer überlagert durch 
langatmige Noises.
Versuche nun mit nem DSO mal rauszufinden was das sein könnte.

von Markus M. (adrock)


Lesenswert?

...Du könntest ja als ganz einfachen Test anstatt der LED-Daten erstmal 
programmatisch ein Rechteck-Signal ausgeben.

Also nach der Initialisierung mit WS_Init() im C-Code dann sowas wie:

while(1) {
   PORTD.OUT = 0xff;
   PORTD.OUT = 0x00;
};

Hier ist übrigens ein ganz nettes (wie ich finde) Tutorial zum XMega:

http://www.stromflo.de/dokuwiki/doku.php?id=xmega-c-tutorial

Grüße
Markus

von Michael S. (michael_s98)


Lesenswert?

Ich tausche nochmal den MAX3002 auf meiner Platine... das ganze Schwingt 
wie sau und ich denke das es dadran liegt....

von Michael S. (michael_s98)


Lesenswert?

So ich habe nun nochmal alles Hardwaretechnisch überarbeitet, der 
Levelshifter funktioniert soweit nun auch und deine Library insoweit 
auch.
Nur hab ich noch 2 kleinere Probleme. Und zwar laeuft die Library nicht 
wenn ich mit dem PLL arbeite wie in deinem Beispiel auf 32MHz 
verdopplet.
Nur wenn ich den normalen 16MHz Quarztakt nehme geht die Library.
Das andere ist das wenn ich Farbwerte über 200 oder auch 255 nehme wird 
statt der vollen Helligkeit der Farbe eine sehr sehr abgeschwächte 
Helligkeit angezeigt. Liegt das an der Gammatable?
Edit: Und bei mehr als 32 bzw 32 LEDS bleibt es haengen

: Bearbeitet durch User
von Markus M. (adrock)


Lesenswert?

Hi,

zu den Problemen...

TAKT

das mit dem Takt ist merkwürdig. Hast Du auch F_CPU im Makefile bzw. im 
AtmelStudio Projekt an den zwei(!) Stellen entsprechend auf 32000000 
gesetzt dann?

GAMMA TABELLE

Das mit der Gammatabelle ist korrekt. Die Tabelle ist nur für 7 Bit 
(0...127) ausgelegt bzw. berechnet. Wobei 127 dann auf die max. 
Helligkeit 255 übersetzt wird. Größere Werte zu übergeben führt also 
definitiv zu falschen Helligkeiten bzw. den von Dir beschriebenen 
Effekt.

Du kannst natürlich auch auf die Helligkeitsnpassung verzichten (oder 
selbst eine Tabelle berechnen...) und mit 8 Bits arbeiten. Ich habe sie 
nur für 7 Bit berechnet, da die 8-Bit PWM von den LEDs kaum die Dynamik 
hergibt, so dass sich eine 8 Bit Tabelle lohnen würde.

LED ANZAHL

Ich habe den Code mit 320 LEDs getestet, es sollte also grundsätzlich 
funktionieren. Hast Du es mit dem Beispielcode getestet?

Grüße
Markus

: Bearbeitet durch User
von Markus M. (adrock)


Angehängte Dateien:

Lesenswert?

Hier mal die Exceltabelle die ich für die Berechnung der 
Gammakorrekturwerte genommen habe.

Wenn Du die Indexanzahl auf 256 setzt, bekommst Du die Werte für eine 8 
Bit Tabelle.

Grüße
Markus

von Michael S. (michael_s98)


Lesenswert?

Hi,

sorry für die späte Antwort, aber nun geht es.
Nun hab ich mal die Frage ob man das irgendwie so implementieren kann 
das ich auch den Ausgabeport bzw das man evtl mehrere Ausgabeports 
definieren kann.
Ich habe auf meiner Platine 4 Ausgaenge die ich nutzen wollte und daher 
auch auf den xMEGA gesetzt habe.
Da deine Routine aber auf Double Buffering aufbaut wird wahrscheinlich 
mit deiner Routine max. 2 Ausgaenge möglich sein oder?

Michael

von Markus M. (adrock)


Lesenswert?

Hi,

also mit 4 Ausgängen ist das so erst einmal nicht möglich, eben wg. dem 
Double-Buffering.

Es sollte gehen, dass man das ganze für zwei Ausgänge programmiert. Dazu 
müsste man den Code aber quasi einmal duplizieren und dann entsprechend 
die anderen beiden DMA-Kanäle, anderen Timer etc. nehmen.

Wenn man ganz viel Speicher übrig hat, könnte man natürlich die 
RGB-Daten komplett im voraus in die Timerwerte umrechnen, dann kann 
der DMA vom Anfang bis zum Ende durchlaufen. Die Programmierung dafür 
wäre recht einfach:

1. RGB Daten in Timerwerte umrechnen und in Buffer schreiben
2. Timer und DMA entsprechend konfigurieren
3. Timer und DMA starten

Aber dafür benötigt man Anzahl_LEDS x 3 x 8 Bytes im Speicher. Für 1000 
LEDs also dann z.B. 24 kByte.

Dafür ist die Lösung natürlich recht elegant und benötigt überhaupt 
keine CPU-Zeit mehr während der Ausgabe (ein paar Zyklen für die 
Speicherzugriffe).

Ciao...
Markus

von MichaelS98 (Gast)


Lesenswert?

Hi Markus,

entschuldige die späte Antwort aber ich war durch das Tagesgeschaeft 
etwas ausgelastet :)
Das Problem ist nur das ich mich mit den xMega's eigentlich so gut wie 
garnicht auskenne, hab zwar viel mit ATMega's und PICs gemacht aber mit 
xMEGA und den extremen aenderungen und der vielen peripherie bin ich 
etwas überfordert ;P
Evtl hast du ja einen kleinen Ansatz für mich auf dem ich aufbauen kann

Gruß
Michael

von MichaelS98 (Gast)


Lesenswert?

Hallo Markus,

sagmal ist es möglich die Routine OHNE die GammaTable zu nutzen?

Gruß Michael

von MichaelS98 (Gast)


Lesenswert?

Habs selbst hinbekommen :) Hast ja sogar quasi mit eingebaut :) Wer 
lesen kann....

von MichaelS (Gast)


Lesenswert?

Hi Markus,

ich habs nun nach langer Zeit nochmal versucht deine Routine auf 2 
Kanäle umzubauen aber irgendwie bin ich bisher nicht so weit gekommen 
das ich eine Ausgabe bekomme. Meine Assemblerkenntnisse sind leider auch 
immernoch nicht besser geworden :(

Ich hab mal den Source von der ASM File hochgeladen. Evtl siehst du ja 
wo ich meinen Fehler habe das der Kram nicht geht. Der eine Kanal geht 
ja wunderbar auch auf Port D0....

http://pastebin.com/rTx4Rd8s

Vielen Dank schonmal

Gruß Michael

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.