Hallo zusammen,
ich habe mich in den letzten Monaten stärker mit dem Micropython-Board
und ein paar anderen Boards beschäftigt. Dies als Erweiterung, um 8-12
Jährige, die zuvor über Scratch und Python erste Programmiererfahrungen
am PC gemacht haben, an die Programmierung von "Hardware" heranzuführen.
Hier soll einfach im Vordergrund stehen, dass mit wenigen Zeilen
Programmcode Lämpchen leuchten, Servos sich bewegen, ....
Bitte hier keine Diskussion über das Für und Wider solcher Boards, der
Programmiersprachen etc. Dies diente nur der Einführung in das Thema
meiner Frage.
Eine erste Sache, die günstig ist und viel Effekte ermöglicht, ist die
Ansteuerung von WS2812LED. Die derzeitige Implementation auf dem PyBoard
(STM32F405) sieht allerdings heftig aus: Hier wird SPI verwendet, das
jedoch nicht auf die entsprechende Frequenz der WS2812 Strips
heruntergeregelt werden kann. Daher werden die Byte-Werte für die
Farben dreifach hintereinandergesetzt, um die einzelnen Bits zu
verdreifachen.
Statt 3Byte pro LED sind so nun 9 Byte im Puffer. Wenn nun länger
LED-Streifen mit vorbereiteten Mustern angesteuert werden sollen, ist
dies ein erheblicher Speicherverbrauch.
Nun kam ich auf die Idee, ob hier nicht ein Attiny85 mit ins Spiel
kommen kann, der das Umsetzen auf das WS2812-Protokoll übernimmt.
Dieser müsste (vermutlich per Bit-banging) per I2C vom PyBoard (oder
auch Raspberry PI etc...) per I2C die RGB-Bitwerte gesendet bekommen und
würde diese im korrekten Takt auf die WS2812-Kette schicken.
Per Clock-Stretching sollte er in der Lage sein, den Sender auf die
korrekte Geschwindigkeit einzubremsen.
Stellt sich nun die Frage, ob der attiny85 bei 16MHz genügend Taktzyklen
dafür freihat. Bei 8MHz ist der ja komplett beschäftigt, ein in seinem
Speicher vorliegendes Bit-Muster mit 800kHz auf den WS2812 String zu
schicken.
Bei 16MHz stünden somit 10 weitere Zyklen pro bit zur Verfügung.
Kann die Idee hinhauen oder braucht man weitaus mehr Code für den
I2C/TWI SlaveBetrieb?
Meiner gegenwärtigen Idee nach, wäre der Attiny (oder ein anderer
günstiger µC) dann einfach so eine Art Treiber, der am Beginn der WS2812
Kette sitzt, und vom Programmierer der Applikation dahinter als Blackbox
wahrgenommen wird.
Damit könnten dan zahlreiche andere µC oder Kleincomputer, die kein
entsprechendes BitBanging beherrschen (Interrupts, ..) dann doch ohne
großen Aufwand und ohne große Verrenkungen WS2812 Ketten ansteuern.
Und ja: Ich weiss, dass auch APA102 im Kommen sind, die sind aber
derzeit noch etwa doppelt so teuer, wie die 2812er Ketten....
Danke schon mal für Weiterführende Tips
Hallo,
das sollte doch von der RAM-Größe unabhängig sein. Meiner Idee nach
würden die Bits einfach durchlaufen: per TWI rein, und per bitbanging
wieder raus.
Per Clock Stretching wird der Master auf die korrekte Geschwindigkeit
gedrosselt.
Wenn ich das jeweils erst in den Speicher des Attiny (oder was auch
immer) lade und dann ausgebe, bremse ich die Ausgabe insbesondere für
lange LED-Strings enorm ab.
Gruß
rgbled-bastler
Schau Dir mal diese AppNote an:
http://ww1.microchip.com/downloads/en/AppNotes/00001606A.pdf
Hier wird ein PIC16F1509 verwendet. Der hat konfigurierbare Logikblöcke
(CLB), und damit und mit der SPI-Schnittstelle wird das Timing quasi
hardwaremäßig erzeugt, was keine Rechenleistung braucht. Eine ziemlich
geniale Lösung also. Es gibt noch andere PIC16 mit CLB - such Dir den
passenden aus.
fchk
Frank K. schrieb:> Schau Dir mal diese AppNote an:>> http://ww1.microchip.com/downloads/en/AppNotes/00001606A.pdf>> Hier wird ein PIC16F1509 verwendet. Der hat konfigurierbare Logikblöcke> (CLB), und damit und mit der SPI-Schnittstelle wird das Timing quasi> hardwaremäßig erzeugt, was keine Rechenleistung braucht. Eine ziemlich> geniale Lösung also. Es gibt noch andere PIC16 mit CLB - such Dir den> passenden aus.>> fchk
OK, dies sieht nach einer netten Sache aus, wie der PIC nativ WS2812
spricht. Also mit wenig CPU-Leistung den WS2812 füttert.
Jetzt brauche ich immer noch den Uplink und die Synchronisation.
D.h. ich will ja ein bestimmtes Bytemuster synchron auf die WS2812
bringen, ohne dass dies zuvor komplett auf dem Treiber gespeichert wird.
Ich habe bislang leider noch gar nichts mit den PICs gemacht, auch wenn
ich gelesen habe, dass diese sehr einfach zu programmieren seien.
Liese sich in Kombination mit der CLB-Ausgabe ein Ringpuffer für die zu
sendenden Daten implementieren, der von einem Uplink I2C gefüttert wird?
D. h. der I2C Slave würde den Ringpuffer füllen, sobald dieser gefüllt
ist, per Clock-Stretching den Sender bremsen.
Der Pic würde den Inhalt des Ringpuffers per CLB-maskiertem SPI auf den
WS2812 schicken, dadurch im Ringpuffer Plaz schaffen, den der I2C-Client
wirder füllt.
Sobald der Rinpuffer leer ist, hört das CLB_SPI Senden auf, und die
Kette leuchtet.
???
rgbled-bastler schrieb:> Stellt sich nun die Frage, ob der attiny85 bei 16MHz genügend Taktzyklen> dafür freihat.
Soweit ich das sehe, kann man beim WS2812 beliebig lange Pausen zwischen
den Paketen lassen. Der ATtiny kann also sein I2C bequem nach einem
Paket machen.
Überträgt er gerade ein Paket an den WS, kann er entweder SCL strecken
oder mit NACK antworten.
rgbled-bastler schrieb:> Bei 16MHz stünden somit 10 weitere Zyklen pro bit zur Verfügung.>> Kann die Idee hinhauen oder braucht man weitaus mehr Code für den> I2C/TWI SlaveBetrieb?
verstehe ich nicht, warum nicht bit banging direkt aus dem
rgbled-bastler schrieb:> (STM32F405)
benötigt nur 3 Byte pro LED
im Atmel brauchst du doch buffer entsprechend der LED Tiefe x 3
also 900 Byte bei 300 LEDs, da bietet sich eher ein atmega an mit mehr
RAM, z.B. atmega1284p mit 16kB Ram für vieles mehr.
Peter D. schrieb:> Soweit ich das sehe, kann man beim WS2812 beliebig lange Pausen zwischen> den Paketen lassen. Der ATtiny kann also sein I2C bequem nach einem> Paket machen.> Überträgt er gerade ein Paket an den WS, kann er entweder SCL strecken> oder mit NACK antworten.
Hmm, nach allem, was ich ausprobiert habe, und was auch hier steht:
http://www.mikrocontroller.net/articles/WS2812_Ansteuerung
wird eine Pause länger als 50µs als Reset erkannt, und führt dazu, dass
die LED den gegenwärtigen Speicherinhalt anzeigen.
Wenn es hier einen Trick gäbe, eine Pause zu machen, die nicht als Reset
interpretiert wird, wären alle Probleme gelöst.
rgbled-bastler schrieb:> wird eine Pause länger als 50µs als Reset erkannt, und führt dazu, dass> die LED den gegenwärtigen Speicherinhalt anzeigen.
Ich dachte, das sollen sie auch.
Warum sonst schickt man was an den WS?
Joachim B. schrieb:> verstehe ich nicht, warum nicht bit banging direkt aus dem STM32F405>> benötigt nur 3 Byte pro LED>
Weil ich z.B. auf dem pyBoard keinen direkten Zugriff auf Bitbanging
habe.
Es gibt zwar rudimentäre Inline-Assembler-Möglichkeiten, ich müsste aber
z.B. Interrupts abschalten, was andere Bibliotheken für so lange Zeit
gar nicht gerne sehen.
Die Lösung wäre zudem auch wieder nicht so universell, wie das, was ich
mir vorstelle. Ich mag ja wegen meiner geringen Erfahrung im µC Bereich
hier zu naiv sein, aber ich stelle mir halt immer noch ein Modul vor,
dass per I2C mit einer Geschwindigkeit > 800kHz angesprochen wird, und
das per Clock-Stretching auf 800kHz eingepegelt wird.
> im Atmel brauchst du doch buffer entsprechend der LED Tiefe x 3> also 900 Byte bei 300 LEDs, da bietet sich eher ein atmega an mit mehr> RAM, z.B. atmega1284p mit 16kB Ram für vieles mehr.
Dann brauche ich eben auch keinen Puffer im Atmel, den ich auch nicht
haben will. Sondern die bytes laufen einfach durch, per I2C rein und per
WS2812 raus. Der Baustein in der Mitte (ob nun Atmel oder Pic oder
...) sorgt einfach durch Clock-Stretching dafür, dass die WS2812 nicht
überfahren werden.
Somit brauche ich auf dem eigentlichen Device nur eine Standard
I2C-master Implementierung, die in der Lage ist mit mehr als 800kHz zu
senden und die auf Clock-Stretchung reagiert.
Die LED Daten sind dann nur auf diesem Gerät im Puffer, der µC
dazwischen ist nur ein Synchronisationsglied.
Peter D. schrieb:> Ich dachte, das sollen sie auch.> Warum sonst schickt man was an den WS?
Ja natürlich, aber ich will ja nicht nur eine LED sondern 100 oder 200
LED zum Leuchten bringen.
D.h. ich muss die Bytes für alle LEDs innerhalb der erlaubten
Spezifikation ohne Pause raushauen. Sobald ich eine Pause mache, wird
das angezeigt, was aktuell in den Puffern ist.
D.h. während ich der ersten LED die ersten drei Byte reintakte, sendet
diese drei Null-Bytes an die Zweite, diese sendet drei Null-bytes an die
Dritte usw.
Beim nächsten Triple sendet die erste LED die zuvor erhaltenen Daten an
die Zweite, diese jedoch die zuvor erhaltenen Nullbytes an die
Dritte....
Sobald nun eine Pause eintritt, wird angezeigt, was in den Puffern ist.
Wenn die Pause nach zwei bytes erfolgen würde, gibt es sogar ganz
falsche Farben....
rgbled-bastler schrieb:> Sobald nun eine Pause eintritt, wird angezeigt, was in den Puffern ist.
Dann entlastet der ATtiny ja nicht sonderlich den Master, der muß dann
weiterhin in Echtzeit senden.
Besser, der ATtiny puffert die I2C-Daten und schiebt sie komplett raus.
Bei 512Byte SRAM sind ~150 LEDs möglich.
Insbesondere kann dann der Master nur die Daten senden, die sich
wirklich ändern.
Peter D. schrieb:> Soweit ich das sehe, kann man beim WS2812 beliebig lange Pausen zwischen> den Paketen lassen.
wo hast du das denn her?
rgbled-bastler schrieb:> Sobald nun eine Pause eintritt, wird angezeigt, was in den Puffern ist.
Pause von 50µs
rgbled-bastler schrieb:> Kann die Idee hinhauen oder braucht man weitaus mehr Code für den> I2C/TWI SlaveBetrieb?
nö, I2C clock 100 bis 400 kHz, aber nicht als Avr Slave? und ein WS hat
800kHz bremst schon mal aus und 3 Byte pro LED muss man am Atmel
buffern, -> RAM
Peter D. schrieb:> rgbled-bastler schrieb:>> Sobald nun eine Pause eintritt, wird angezeigt, was in den Puffern ist.>> Dann entlastet der ATtiny ja nicht sonderlich den Master, der muß dann> weiterhin in Echtzeit senden.>> Besser, der ATtiny puffert die I2C-Daten und schiebt sie komplett raus.> Bei 512Byte SRAM sind ~150 LEDs möglich.> Insbesondere kann dann der Master nur die Daten senden, die sich> wirklich ändern.
Der Attiny soll ja in erster Linie nicht den Master entlasten, sondern
nur dafür sorgen, dass ich auf dem Master keine Klimmzüge machen muss.
Wenn der Attiny puffert, verdoppelt sich im besten Fall die
Ausgabegeschwindigkeit, was für Spiele etc. schon nicht mehr so toll
ist.
Das Ausgangsproblem ist, dass auf etlichen schnelleren Minicomputern und
µC je nach Implementierung des dort laufenden Systems, ein einfaches
Bitbanging etc. nicht mehr möglich ist.
Ich will hier nun von der Implementierung weg, dass ich das dreifache an
RGB-Daten auf dem Master allozieren muss, da ich dort den Takt nicht
langsam genug bekomme, um di eeinfach Datenmane rauszuschieben.
Das alleine dürfte schon eine Entlastung des Master sein. Je nach dem,
wie der Master sein I2C implementiert, läuft das vermutlich ohnehin dann
parallel zu den anderen dort laufenden Tasks.
Joachim B. schrieb:> nö, I2C clock 100 bis 400 kHz, aber nicht als Avr Slave? und ein WS hat> 800kHz bremst schon mal aus und 3 Byte pro LED muss man am Atmel> buffern, -> RAM
Klar, ich muss je nach Implementierung 1-3 Byte puffern. Aber immer nur
die.
Weil ich ja das Senden weiterer Bytes per Clock-Stretching verhindere.
Das ich auf die 800kHz vom WS runtergehe, ist klar. Das macht die
derzeitige Implementation auch, allerdings dadurch, das das dreifache an
Daten in einem dreifach höheren Takt gesendet wird ;-)
rgbled-bastler schrieb:> Das ich auf die 800kHz vom WS runtergehe, ist klar.
offensichtlich nicht klar wenn du von I2C schreibst, ich kenne nur
100kHz und 400kHz und selbst wenn I2C schneller gehen sollte, auf dem
Atmel?
rgbled-bastler schrieb:> D. h. der I2C Slave würde den Ringpuffer füllen, sobald dieser gefüllt> ist, per Clock-Stretching den Sender bremsen.> Der Pic würde den Inhalt des Ringpuffers per CLB-maskiertem SPI auf den> WS2812 schicken, dadurch im Ringpuffer Plaz schaffen, den der I2C-Client> wirder füllt.
Dieser PIC hat nur eine MSSP-Einheit, die entweder SPI oder I2C machen
kann. Diese wird bereits benutzt. Es bliebe der UART über. Wenn Du
schnell genug bist und die Daten unter allen (!) möglichen
Betriebszuständen schneller liefern kannst als der WS2812 sie braucht,
dann ginge das. Du bräuchtest dann einen UART mit Hardware Handshake.
Wenn Du diese Echtzeitbedingung nicht garantieren kannst, brauchst Du
einen Puffer am PIC. Ein 23K256 mit 32k RAM, vom PIC per Bit-Banging
angesteuert, wäre die Lösung der Wahl.
Wenn Du die Kommunikation unbedingt per I2C machen musst, brauchst Du
einen anderen PIC, mit zwei MSSP-Einheiten und CLB. Diese Bedingungen
erfüllen die PIC16F18325/18345. Die CLBs sind hier ein wenig anders
verschaltet, d.h. Du musst den Code anpassen und kannst ihn nicht 1:1
übernehmen.
fchk
Ich würde 8 Bit Farben verwenden. Damit kann der i2c langsamer takten.
-> 200 led buffer passt in den ram des tiny.
Und die Daten per spi an dir leds senden. Bei 3,2mhz spi Takt. Wären das
"1000" für eine 0 und "1110" für eine 1. Und man hätte 0,3125:0,9375µs
passt also.
Bleibt nützlich dir frage, wann gesendet wird. Und das hängt von der i2c
Traktate ab. Den nur weil 8mhz möglich sind. Heißt das noch lange nicht,
das es auch funktioniert.
Robin schrieb:> Und die Daten per spi an dir leds senden. Bei 3,2mhz spi Takt. Wären das> "1000" für eine 0 und "1110" für eine 1. Und man hätte 0,3125:0,9375µs> passt also.
Das ist ja gerade, was ich NICHT möchte, dass ich anstelle eines bits
mehrere Bits senden muss, und so den Speicherverbrauch auf dem Master
hochschraube.
Ich zitiere aus einer den Micropython Bibliotheken:
https://github.com/JanBednarik/micropython-ws2812/blob/master/ws2812.py
1
def update_buf(self, data, start=0):
2
"""
3
Fill a part of the buffer with RGB data.
4
Order of colors in buffer is changed from RGB to GRB because WS2812 LED
5
has GRB order of colors. Each color is represented by 4 bytes in buffer
6
(1 byte for each 2 bits).
Da wird genau das gemacht, und ich brauche noch dreimal mehr Speicher,
als wenn ich nur die 8 bit pro Farbe verwende.
Hier werden nochmals 3 Byte pro Farbe, also 12 Byte pro LED zusätzlich
im Puffer abgelegt, nur dass der Takt passt.
Joachim B. schrieb:> offensichtlich nicht klar wenn du von I2C schreibst, ich kenne nur> 100kHz und 400kHz und selbst wenn I2C schneller gehen sollte, auf dem> Atmel?
Der STM32 kann auch jeden Fall HighSpeed I2C, das ist 1MHz. Das wäre die
gewählte Geschwindigkeit, die dann durch Clock-Stretching auf 800kHz
gesenkt würde.
rgbled-bastler schrieb:> Der STM32 kann auch jeden Fall HighSpeed I2C, das ist 1MHz. Das wäre die> gewählte Geschwindigkeit,
hast du deine Frage vergessen?
rgbled-bastler schrieb:> Nun kam ich auf die Idee, ob hier nicht ein Attiny85 mit ins Spiel> kommen kann, der das Umsetzen auf das WS2812-Protokoll übernimmt.
der tiny kann der 800kHz I2C?
wenn nicht wozu dann Clock Stretching? ich denke da war auch was mit
Clockstrechting was am AVR nicht klappte wenn ich mich recht erinnere.
rgbled-bastler schrieb:> Robin schrieb:>> Und die Daten per spi an dir leds senden. Bei 3,2mhz spi Takt. Wären das>> "1000" für eine 0 und "1110" für eine 1. Und man hätte 0,3125:0,9375µs>> passt also.>> Das ist ja gerade, was ich NICHT möchte, dass ich anstelle eines bits> mehrere Bits senden muss, und so den Speicherverbrauch auf dem Master> hochschraube.
Eben nicht. Du kannst das ganze erst beim laden ins Senderegister
umwandeln. Und da musst du nur einen von 4 möglichen werten laden.
Abhängig davon, wie die nächsten 2 Bits aussehen.
Robin schrieb:> Eben nicht. Du kannst das ganze erst beim laden ins Senderegister> umwandeln. Und da musst du nur einen von 4 möglichen werten laden.> Abhängig davon, wie die nächsten 2 Bits aussehen.
Bekomme ich da dann nicht Probleme, die 800kHz zu halten, ohne Pausen >
50µs einzulegen? Wenn ich vor dem Senden einer 2bit_gruppe festlegen
muss, welches Byte ich schicke?
Du hast 40 Takte um den Wert zu laden. Das sollte locker ausreichen und
zur not kannst du ja auch etwas länger brauchen. Im wiki steht etwas von
maximal 5µs, also maximal 120 Takte. Da kannst du idr. auch noch das I2C
abarbeiten.
rgbled-bastler schrieb:> Robin schrieb:>> Und die Daten per spi an dir leds senden. Bei 3,2mhz spi Takt. Wären das>> "1000" für eine 0 und "1110" für eine 1. Und man hätte 0,3125:0,9375µs>> passt also.>> Das ist ja gerade, was ich NICHT möchte, dass ich anstelle eines bits> mehrere Bits senden muss, und so den Speicherverbrauch auf dem Master> hochschraube.
Ich denke, Du hast Dich ein wenig verrannt. Du bist auf I2C fixiert, das
bei den erforderlichen Geschwindigkeiten spezielle Rahmenbedingungen
braucht (lies mal die Infos über FM+ auf den NXP-Seiten, da sind die 1.7
MHz und 3.4 MHz I2C-Modi beschrieben; und ja es gibt sie, aber die
meisten Bausteine können sie nicht), und Du bist auf AVR fixiert.
Vergiss das mal alles komplett.
Schau Dir mal die Microchip-Lösung nochmal an. Und zwar genau. Und
versuche, sie zu verstehen. Wenn Du verstanden hast, warum das dort
funktioniert, sollte es für Dich kein Problem sein, das ganze mit etwas
externer Logik nachzubauen. Du brauchst von irgendwo her einen Takt, der
ein ganzes Vielfaches der WS2812 Bitrate ist, Du musst Deine
SPI-Schnittstelle als Slave betreiben, damit SCLK ein Eingang ist, und
die Logik, die bei Microchip in den CLBs realisiert wird, musst Du
entweder mit einzelnen Gattern diskret aufbauen oder ein kleines CPLD
dafür verwenden.
Wenn Du zu dieser Transferleistung fähig bist, bekommst Du ein System,
das keine weiteren Puffer und Latenzen hat und trotzdem die WS2812 mit
minimalem CPU-Aufwand (oder sogar per DMA) ansteuern kann.
fchk
>Statt 3Byte pro LED sind so nun 9 Byte im Puffer.
Na und? Das sind immer noch 12000 LEDs die du ansteuern kannst.
Für unbenutztes RAM gibt es kein Geld zurück;)
Hi rgbled-bastler,
Variante 1:
die Sourcen für das MicroPython sind doch offen bei github.
Was spricht dagegen, einen eigenen Treiber zu schreiben, der die
WS2812-Daten per TIMER, ISR und DMA direkt auf einen GPIO schreibt?
Keine Hardwarekosten, nur ein bisserl ISR-Last, die das Mikropython
sicher wegstecken kann.
Variante 1a:
das Ganze mit einer SPI Schnittstelle auf dem F405.
Variante 2:
Viele Microcontroller können die diese Protokoll-Umsetzung machen, auf
einem kleinen Atmel ist das ggf. eine Assemblerübung. Da Du aber schon
bei den STM32 bist - für eine ähnliche Aufgabe und weil mein Kunde keine
Last im RTOS haben wollte, haben wir einen Protokollumsetzer mit
STM32F030 unter GCC gemacht. Kostet sogar bei Farnell nur einen Euro.
Grüße,
Marcus
Marcus H. schrieb:> Viele Microcontroller können die diese Protokoll-Umsetzung machen
Servus,
ich habe damit auch schon mal experimentiert und es auf einem PIC12F1840
implementiert: http://www.picalic.de/PIC2WS2812/
Der schafft mit seinen läppischen 256 Bytes RAM eine Umsetzung von UART
(1MBit/s) auf WS2812 rechnerisch für ca. 1500 LEDs, bis u.U. der Puffer
überlaufen kann.
Der xmega32e5 hat ebenso die integrierte Logik Blöcke wie der pic und
zusätzlich noch einen DMA, was eine WS2812 Ansteuerung mit sehr wenig
CPU Last ermöglicht. In den 4kb RAM kann man also einen großen
Framebuffer erstellen (eventuell mit double Buffering) und hier die
Daten zwischenspeichern. Dadurch müssen die Daten vom PC nicht in
Echtzeit geliefert werden, was er sowieso nicht kann.
Joachim B. schrieb:> Peter D. schrieb:>> Soweit ich das sehe, kann man beim WS2812 beliebig lange Pausen zwischen>> den Paketen lassen.>> wo hast du das denn her?
Das ergibt sich aus der Logik der Sache. Ein "Paket" = ein Frame =
einmal Werte für alle LEDs am Bus. Die Pause löst für alle LEDs am Bus
die Übernahme der empfangenen Daten aus. Die Mindestlänge einer dazu
führenden Pause ist definiert. Aber natürlich kann man die Pause auch um
so viel länger machen, wie man will. Das ändert rein garnix an der
Funktion, sondern senkt nur die mögliche Framerate.
> 3 Byte pro LED muss man am Atmel> buffern, -> RAM
Das ist das einzige echte Problem. Alles andere ist nur der
Hilfeschrei eines C-"C&P"-Programmierers...
Ja klar, wenn die Source wesentlich langsamer ist als der Sink, dann
kommt man natürlich nicht drum herum, alle Daten zu buffern. Und die
leider immer im Vergleich zum Rest des Systems überaus knappe
Ausstattung der AVR-µC mit SRAM setzt hier die Grenzen für das, was
geht.
Schließlich will Atmel lieber die großen teuren Geschosse verkaufen,
daran verdienen sie doch schließlich auch viel mehr, dafür muß man doch
Verständnis haben...
Also ist die primäre Größe für dieses Problem die Größe des verfügbaren
SRAM. Näherungsweise braucht man dessen Größe nur durch drei teilen und
etwas abrunden, um die Zahl der durch einen AVR8 autark ansteuerbaren
WS2812-Teile herauszubekommen.
Die große Ausnahme von dieser Regel ist: Parametrisch generierte
Inhalte. Also gerade nicht der stupide Ansatz, die Inhalte jeder
einzelnen verschissenen LED speichern und strunzdumm rauszukloppen,
sondern sie statt dessen in Echtzeit berechnen. Ausreichend Zeit dafür
ist für sehr viele Muster. Jedenfalls für Asm-Programmierer...
Vielleicht kann c-hater den von piedpiper.com entwickelten Algorithmus
in die Maschinensprache des 85ers portieren? Wäre doch mal ein würdiger
Job für einen echten Programmierer wie ihn.
das müsste es sein, was du suchst:
"picopixel" <- basiert auf "light_ws2812".
https://github.com/usedbytes/neopixel_i2c
This is an AVR-based neopixel driver. It accepts commands over i2c to
drive a a number of ws2812 LED pixels. Talks i2c on one side, and
neopixel 1-wire on the other.
Optional/removable i2c level shifter, for 5V LED drive and 3v3 i2c bus.
The actual neopixel driving is done by a slightly modified copy of
[cpldcpu]'s light_ws2812 library