Forum: Mikrocontroller und Digitale Elektronik ws2812 und andere zeitkritische Sachen


von sadf (Gast)


Lesenswert?

Hallo,

ich habe mir mal zum Spaß einen WS2812 Streifen gekauft und damit 
rumgespielt. Es gibt ja hier eine Bibliothek mit der das super 
funktioniert. Jetzt habe ich lustige Effekte programmiert und habe auch 
noch eine Fernbedienung reingehängt. Dazu habe ich auch den Code aus dem 
Forum genommen (IRMP).
Leider habe ich jetzt rießige Timingprobleme.

Beides getrennt funktioniert. Die WS2812 Ausgabe schaltet, um das Timing 
einzuhalten die Interrupts ab. Die Ausgabe muss aber recht flott 
erfolgen. Leider ließt dann die FB keine Werte mehr ein, da ihr Timing 
völlig zerstört wird.

Gibts da geschickte Lösungsmöglichkeiten? Oder braucht man einen zweiten 
Prozessor, unter der Annahme, dass die Ausgabe nicht verändert werden 
darf?

Selbst wenn die Ausgabe langsammer laufen dürfte, würde die FB doch 
Signale verpassen, wenn Sie dann kommen wenn die Ausgabe gerade läuft.

Dank & Gruß

von sadf (Gast)


Lesenswert?

Sorry der Prozessor ist ein Atmega328p

von Paul H. (powl)


Lesenswert?

Ohne, dass du deinen Code postest, werden wir hier nur vage Tipps geben 
können ;-)

Einen davon hast du ja schon genannt. Nimm einen zweiten Prozessor wenn 
du mehrere zeitkritische Sachen gleichzeitig zu erledigen hast. Der kann 
ja dann per Handshake zum richtigen Zeitpunkt Daten mit dem anderen 
austauschen.

Evtl. kannst du die Libraries die du gefunden hast aber auch mal 
analysieren und so zusammenfassen, dass du das Timing von 
LED-Stripe-Ansteuerung und FB-Empfang vereinen kannst.

Zudem gibt es noch Alternative zu den WS2812 LED-Stripes mit echtem 
SPI-Interface, das nicht so ein dämliches Timing erfordert. Leider weiß 
ich nicht mehr wie die heißen, hab sie aber mal hier im Forum gesehen, 
kann sich da noch wer erinnern?

von Ulrich F. (Gast)


Lesenswert?

z.B. APA 102

von Gerd E. (robberknight)


Lesenswert?

Nimm nen STM32 und verwende dessen DMA um die ws2812 anzusteuern. Gibts 
fertige Libs für die das genau so machen. Dann ist nebenher noch genug 
Zeit für das IRMP. Das IRMP gibt es auch für STM32.

von Timm T. (Gast)


Lesenswert?

Du mußt jetzt sehr tapfer sein: Sowas geht wunderbar mit einem Atmega8 
oder halt 328, allerdings muß man das von Hand in Asm programmieren. Nur 
werden Dir jetzt die C-Fanboys erzählen, daß Du einen ARM brauchst und 
min. 100MHz.

Die Fernbedienung ist gar nicht so kritisch, weil die Signale relativ 
langsam kommen. Allerdings muß man das Timing hier von Hand machen und 
die Sample-Slots zwischen die 2812 Ausgabe setzen. Das geht dann nicht 
mit fertigen Routinen.

von N. J. (Gast)


Lesenswert?

Die 100 MHz sind ein wenig übertrieben ;) Was aber bei einem  stm32 von 
Vorteil sein könnte, ist DMA. Mein Rat: STM32 F103 Board für 5 € aus der 
Bucht und dann nimm den Code aus dem WordClock24h Artikel als 
Grundlage, da werden auch WS2812 und IRMP genutzt. (Nach einer älteren 
Version im Repo gucken, da liefs noch auf dem 103) Der zeitliche Aufwand 
dürfte weniger als 15 Minuten betragen bis zu den ersten Ergebnissen, 
und wenn du später noch Effekte oder WLAN (ebenfalls in dem Wordclock 
Projekt schon mit dabei) dazu haben willst hast du noch fast 
"unbegrenzt" Ressourcen übrig.


Beste Grüße

N. J.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

N. J. schrieb:
> (Nach einer älteren  Version im Repo gucken, da liefs noch auf dem 103)

Eher umgekehrt: Die letzte Version nehmen. Den Port von Nucleo mit 
STM32F4xx nach STM32F103 habe ich erst in den letzten Versionen 
vorgenommen bzw. vervollständigt.

von Niels J. (niels)


Lesenswert?

Oh, Pardon.

Ich hatte nur im Kopf, dass es auf dem ST32F103 funktioniert, den aber 
im Artikel nicht gefunden, deswegen die falsche Vermutung.
Naja, kann ja morgens mal passieren ;)

Beste Grüße

N.J.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Niels J. schrieb:
> Ich hatte nur im Kopf, dass es auf dem ST32F103 funktioniert, den aber
> im Artikel nicht gefunden, deswegen die falsche Vermutung.

Der STMF32F103 wird im Artikel nicht erwähnt, weil das Projekt 
ursprünglich nicht darauf ausgelegt war. Die Portierung nach STM32F103 
war für mich eher aus "sportlichem" Ehrgeiz. Es fehlt auch noch was für 
den F103: Die LDR-Messung für die automatische Helligkeitseinstellung.

: Bearbeitet durch Moderator
von Peter D. (peda)


Lesenswert?

sadf schrieb:
> Die Ausgabe muss aber recht flott
> erfolgen.

Ja, die WS2812 sind recht giftig im Timing.
Aber es gibt eine Lösung für die AVRs.
Nimm die UART im SPI-Mode, dann hast Du einen 2 Byte Sendepuffer und Du 
kannst Interrupts verwenden.
Das Assembler nötig wäre, ist Quatsch.

von Timm T. (Gast)


Lesenswert?

Peter D. schrieb:
> Das Assembler nötig wäre, ist Quatsch.

Bei gleichzeitiger Abfrage einer Fernbedienung?

von Simon (Gast)


Lesenswert?

Peter D. schrieb:
> sadf schrieb:
>> Die Ausgabe muss aber recht flott
>> erfolgen.
>
> Ja, die WS2812 sind recht giftig im Timing.
> Aber es gibt eine Lösung für die AVRs.
> Nimm die UART im SPI-Mode, dann hast Du einen 2 Byte Sendepuffer und Du
> kannst Interrupts verwenden.
> Das Assembler nötig wäre, ist Quatsch.

Gibt es dazu einen guten Ansatz? In etwa wie mit der Light WS2812?

von c-hater (Gast)


Lesenswert?

Peter D. schrieb:

> Ja, die WS2812 sind recht giftig im Timing.
> Aber es gibt eine Lösung für die AVRs.
> Nimm die UART im SPI-Mode, dann hast Du einen 2 Byte Sendepuffer und Du
> kannst Interrupts verwenden.
> Das Assembler nötig wäre, ist Quatsch.

Ist es nicht. Es mag auch in C gerade noch so gehen, dann bleibt aber 
ganz sicher nicht mehr sehr viel Rechenzeit über. Es ist nämlich so, 
dass in ein SPI-Byte nur maximal die Info für 2,66... WS2812-Bits passt, 
weil nämlich jedes WS2812-Bit zu mindestens 3 SPI-Bits verwurstet werden 
muss, wobei die Bitrate 800kHz/3=267kBit/s beträgt. Die Interrupts 
erfolgen also mit 267/8=33kHz. Und wenn der ganze C-Overhead bei ISRs 
33.000mal pro Sekunde abgearbeitet werden muss, dann kommt alleine 
dadurch eine ganze Menge völlig nutzlos verschwendeter Rechenzeit 
zusammen, die in Asm einfach mal verfügbar wäre, um noch was Sinnvolles 
nebenbei zu tun. Z.B. um das nächste auszugebende Pattern in Echtzeit zu 
berechnen, statt es wie ein dümmlicher Nasenpopler in einer überlangen 
Reset-Pause des WS2811-Busses zu machen. Das klappt nämlich nur bei 
kurzen Bussen (=wenig LEDs) ohne deutlich sichtbare negative 
Auswirkungen auf die erzielbare Framerate der LED-Aktualisierungen.

Mal ganz davon abgesehen, dass der SPI-Mode für diese Anwendung sowieso 
nicht die beste Lösung ist. Mit der USART fährt man hier deutlich 
besser, wenn man sie auch als solche benutzt (und zwar mit 7N1), dann 
ist nämlich die Rechnerei zur Abbildung von WS2811-Bits auf USART-Bits 
prinzipiell in etwa die gleiche wie beim SPI-Ansatz, aber die 
Interruptrate ist hier nur 267/9=29,7kHz und somit wird allein durch 
diese intelligente Entscheidung schon knapp 10% weniger Rechenzeit durch 
Interrupt-Overheads nutzlos verschwendet. Dazu kommen noch Einsparungen 
(auch immerhin mindestens ca. 2%) durch die etwas einfachere 
Statusmaschine für die Re-Codierung der Datenbits.
Beides gilt übrigens ganz unabhängig davon, ob man es in C oder in 
Assembler umsetzt...

Der Unterschied ist nur: In C können diese 12% schon durchaus darüber 
entscheiden, ob die Gesamtlösung überhaupt geht. In Assembler hingegen 
hat man selbst bei einem voll belegten Bus mit 1024 LEDs noch erhebliche 
Reserven bezüglich der Rechenzeit. Genügend, um etliche Effekte in 
Echtzeit zu berechnen, statt deren Daten erst doppelt zeitfressend im 
RAM zu verwursten. Das ist inbesondere dann wichtig, wenn man diesen RAM 
erst garnicht hat, was bei praktisch jedem AVR8 (mit Ausnahme der 
kleinen Handvoll Megas ab M644 aufwärts) nunmal generell der Fall ist...

Nö, gerade die Ansteuerung dieser elenden WS2812 zeigt überdeutlich, 
WIE sehr Asm eigentlich im Vorteil ist, denn hier kommt glücklich all 
das zusammen, was C nicht so gut kann (und die meisten C-"Programmierer" 
(C&P-ler) schon garnicht). Und hier hilft es auch nicht, auf eine 
potentere MCU auszuweichen, was sonst ja die Standardlösung dieser 
unfähigen C-ler ist.

Allerdings: die größeren Eisen bieten oft viel freier konfigurierbare 
serielle Schnittstellen an und darüber hinaus DMA-Fähigkeiten. Und 
natürlich mehr RAM. Mit all diesen Goodies kann man dann auch in C das 
das erreichen, was in Asm schon auf den bescheidenen AVR8 möglich ist...

von Paul H. (powl)


Lesenswert?

Naja, du magst recht haben! Aber du musst auch sehen, was dazu führt. 
Wenn man nicht gerade superviel Lust drauf hat ist es oftmals einfach 
nicht "wirtschaftlich" ein Programm mühevoll in Assembler zu entwickeln, 
anstatt einfach einen potenteren Controller zu nehmen. Es mag ja edler 
sein, aber es dauert auch länger, vor allem für den ungeübten.

von sadf (Gast)


Lesenswert?

Moin,

danke für die vielen Antworten.
Assembler ist gerade nicht für mich, habe ich zwar auch schon machen 
dürfen, aber da kapiere ich ja nach zwei Wochen meinen Code nicht mehr 
:-)

Ich würde gerne bei C bleiben. Die Abfragen zwischen rein fummeln, mag 
ich ehr auch nicht.
Ich tendiere gerade zu der Lösung, einfach zwei Prozis zu nehmen. Es ist 
ja Hobby und nicht Großserie. Ich benutze diese Atmegasboards nur weil 
es die fast geschenkt aus China gibt. In C programmiere ich da ich das 
einigermaßen kann (mehr Gründe gibt es nicht). Ich gehöre auf jeden Fall 
zu denen die vom c-hater gehatet werden :-)

Gibts für den STM einen billigen Programmer der auch Debuggen kann? Mit 
Arduino möchte ich ehr nicht anfangen.

Noch mal vielen Dank für die spannende Diskussion.

von Gerd E. (robberknight)


Lesenswert?

sadf schrieb:
> Gibts für den STM einen billigen Programmer der auch Debuggen kann?

http://www.aliexpress.com/item/FREE-SHIPPING-ST-Link-V2-stlink-mini-STM8STM32-STLINK-simulator-download-programming-With-Cover/1950727356.html
oder
http://www.ebay.de/itm/141803544334

wären günstige eigentständige Programmer und Debugging-Probes. Der 
ST-Link v2 ist aber auch auf allen Discovery-Boards von ST gleich mit 
drauf.

von Strubi (Gast)


Lesenswert?

Moin,

auf die Gefahr hin, dass ich alten Käse aufwärme:
Hat jemand mit einem MSP430 gute Erfahrungen gemacht?
Momentan nutze ich für den Spass noch ein FPGA, da funktioniert's mit 
den Timings prima, aber ist bisschen "Kanone auf Spatz".
Eine Voraussetzung ist, dass noch ein UART für die Kommunikation zu 
einem andern Modul verfügbar ist.

Hatte mal noch rumexperimentiert, die Zeilen auf HIGH zu halten, aber 
das scheint die Reshaping-Logik der WS2812b zu einem Latch zu zwingen 
(d.h. die bisherig reingeclockten Werte übertragen sich auf die PWMs). 
Offenbar lassen sich so aber schrittweise die LED-Werte reinclocken, 
ohne dass die ganze Kette einen Reset bekommt Hatte allerding noch 
irgendwelchen Müll in der LED an Position 1 (zuletzt reingeclockt), die 
Sache ist noch nicht so ganz geklärt.
Hier: http://wp.josh.com/2014/05/15/going-nsa-on-pixel-conversations/
hat einer schon weitergehendes erforscht, das erklärt teils einiges.

Gruss,

- Strubi

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

c-hater schrieb:
> In Assembler hingegen
> hat man selbst bei einem voll belegten Bus mit 1024 LEDs noch erhebliche
> Reserven bezüglich der Rechenzeit. Genügend, um etliche Effekte in
> Echtzeit zu berechnen, statt deren Daten erst doppelt zeitfressend im
> RAM zu verwursten. Das ist inbesondere dann wichtig, wenn man diesen RAM

 Bei 800KHz sind das 30.72ms alleine fur die Ausgabe, wie willst du da
 noch irgendetwas in Echtzeit berechnen ?
 Und wo ?
 512 LEDs / 1.5KB RAM / 6.5 Meter Stripe - das sind die Grenzwerte fur
 328p.
 Fur mehr haben die 8-bit AVRs ganz einfach nicht genugend RAM, vorallem
 da die WS2812 die ganzen Daten in einem Stuck erwarten.

von Thomas E. (picalic)


Lesenswert?

Marc V. schrieb:
> 512 LEDs / 1.5KB RAM / 6.5 Meter Stripe - das sind die Grenzwerte fur
>  328p.
>  Fur mehr haben die 8-bit AVRs ganz einfach nicht genugend RAM, vorallem
>  da die WS2812 die ganzen Daten in einem Stuck erwarten.

Na, wenn's der AVR nicht schafft, dann nimmt man halt einen PIC mit 256 
Bytes RAM - ach, eigentlich reicht auch ein 12F1822 mit 128 Bytes RAM, 
um ein nettes Lauflicht auf einen 5000er WS2812-Streifen zu zaubern... 
;)

http://www.picalic.de/PIC2WS2812/

von Timm T. (Gast)


Lesenswert?

Marc V. schrieb:
> Bei 800KHz sind das 30.72ms alleine fur die Ausgabe, wie willst du da
>  noch irgendetwas in Echtzeit berechnen ?

Man könnte z.B. 8 Streifen parallel an einen Port hängen,  mit 1/8tel 
Länge, und die Daten auf Portbreite rausschieben. Das geht dann 
natürlich nur in Asm. Und selbst wenn man dabei ein wenig langsamer ist, 
gewinnt man erheblich Zeit.

>  512 LEDs / 1.5KB RAM / 6.5 Meter Stripe - das sind die Grenzwerte fur
>  328p.
>  Fur mehr haben die 8-bit AVRs ganz einfach nicht genugend RAM

Es gibt den 644 mit 8k und und den 1284 mit 16k Ram, mit 44 Pins. Wird 
ja wohl reichen.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Thomas E. schrieb:
> Na, wenn's der AVR nicht schafft, dann nimmt man halt einen PIC mit 256
> Bytes RAM - ach, eigentlich reicht auch ein 12F1822 mit 128 Bytes RAM,
> um ein nettes Lauflicht auf einen 5000er WS2812-Streifen zu zaubern...
> ;)

 Ich habe auch ein Knight Rider mit ATTiny2313, aber das ist halt
 Spielerei, dient nur zum Vorzeigen. Mit 6 verschiedenen Farben die beim
 Zusammenstoss Farben, Richtung und Geschwindigkeit wechseln, braucht
 das Ding genau 24 Byt RAM.
 Um aber etwas sinnvolles mit WS28xx anzufangen, braucht jeder Pixel
 3 Byt RAM - SCHLUSS.

Timm T. schrieb:
> Man könnte z.B. 8 Streifen parallel an einen Port hängen,  mit 1/8tel
> Länge, und die Daten auf Portbreite rausschieben. Das geht dann
> natürlich nur in Asm. Und selbst wenn man dabei ein wenig langsamer ist,
> gewinnt man erheblich Zeit.

 Ja, nur musste man mit dreifacher Geschwindigkeit abtasten und auch die
 Daten schon dreifach bereit haben, also 24bit * 3 RAM pro Pixel.
 Etwas ahnliches habe ich mit LPD6803 gemacht, aber die haben auch eine
 Clockleitung - WS28xx hat nur DATA - das wird so nix.

von Timm T. (Gast)


Lesenswert?

Marc V. schrieb:
> Ja, nur musste man mit dreifacher Geschwindigkeit abtasten und auch die
>  Daten schon dreifach bereit haben, also 24bit * 3 RAM pro Pixel.

Warum? Du hast einen kurzen Puls 100 oder einen langen Puls 110. Der 
erste ist immer high, der letzte immer low.

Und selbst wenn sind 16k durch 3 x 3 immer noch 1800 Werte.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Timm T. schrieb:
> Warum? Du hast einen kurzen Puls 100 oder einen langen Puls 110. Der
> erste ist immer high, der letzte immer low.

 Trotzdem, nach einem Drittel der Bitzeit muss ich prufen, was als
 nachstes kommt. Nach 2/3 muss ich zwar nichts prufen aber evtl. den
 Zustand andern. Und die Ports dementsprechend setzen. Fur 8 bits geht
 das in Echtzeit nicht - zumindest nicht mit 8-bit AVRs.
 Also 3 bit senden fur 1 bit Data.

> Und selbst wenn sind 16k durch 3 x 3 immer noch 1800 Werte.

 Hier tappe ich im dunkeln ?

von Timm T. (Gast)


Lesenswert?

Marc V. schrieb:
> Trotzdem, nach einem Drittel der Bitzeit muss ich prufen, was als
>  nachstes kommt. Nach 2/3 muss ich zwar nichts prufen aber evtl. den
>  Zustand andern. Und die Ports dementsprechend setzen. Fur 8 bits geht
>  das in Echtzeit nicht - zumindest nicht mit 8-bit AVRs.

Das mag für Arduino zutreffen, da gibts nur PinWrite. In Asm gibts sowas 
wie OUT.

Bei 16MHz und 1.25usec pro Bit haben wir 20 Takte Zeit. Wir gönnen uns 
pro Drittelbit 0.4375usec, das sind 7 Takte, damit liegen wir gut im 
erlaubten Timingbereich

ldi temp1, 0xff
ldi temp2, 0x00

ldi xl, low (daten)  ; Start bei 0xZZ00, Vielfaches von 256
ldi xh, high (daten)

ldi temp4, laenge / 256

loop_1:
  out Port, temp1  ;1 Takt, Start Bit fur 8 parallele Streifen am Port

  nop
  nop
  nop
  nop
  ld temp3, X+ ; 2 Takte, mittleres Drittel low oder high
  out Port, temp3  ;1 Takt, Mittelstück nach 0.4375usec

  nop
  nop
  nop
  nop
  nop
  nop
  out Port, temp2  ;1 Takt, hinteres Drittel low nach 0.875usec

  nop
  nop
  nop
  nop
  tst xl  ; 1 Takt
  brne loop_1  ;wiederholen, bis 256 Byte rausgeschoben

;hier IR Fernbedienung pollen.

  dec temp4
  brne loop_1  ; wiederholen, bis alle Daten rausgeschoben sind
               ; das gibt nochmal 3 Takte Verlust, aber kurz genug um 
kein Reset auszuloesen

laenge = 8 bit x 3 rgb x Anzahl LED pro Strang

Ergibt bei 16kByte Ram 680 LEDs pro Strang und 5400 LED in 8 parallelen 
Strängen. Das Ganze reduziert sich naturlich auf 1/3, wenn Du 
Uberblenden willst und dafür noch Zielwert und Istwert im Ram ablegen 
mußt, Nimmst Du dagegen nur fertige Muster aus dem Flash, ist das 
deutlich entspannter.

Ergibt bei 680 LED pro Strang x 3 Byte x 8 bit x 1.3usec pro bit eine 
Dauer von 7msec pro Durchlauf. Ergibt ergo 140 Hz. Beschränkt man sich 
auf 100 Hz, kann man zwischendurch gut Daten aufbereiten.

Zwischen innerer und äußerer Schleife kann man noch gut den IR Eingang 
oder die RS232 pollen, sollte das zu langsam sein, kann man die innere 
Schleife abkürzen. Das Pollen darf halt nicht länger als 3usec dauern.

Die Daten müssen natürlich für die Ausgabe aufbereitet werden, aber 
dafür ist zwischendurch Zeit.

von Timm T. (Gast)


Lesenswert?

Da der 1284 genug Pins hat, kannst Du auch 16 Stränge parallel bedienen. 
Die Anzahl der LED wird dabei nicht größer, weil Ram beschränkt, aber Du 
bist für 16 x 340 LED in 4msec fertig und kannst mit 200 Hz updaten. 
Oder halt mit 100 Hz, und nebenbei noch Seti rechnen.

von c-hater (Gast)


Lesenswert?

Marc V. schrieb:

>  Bei 800KHz sind das 30.72ms alleine fur die Ausgabe, wie willst du da
>  noch irgendetwas in Echtzeit berechnen ?

Ganz einfach dadurch, dass die Hardware (USART) die Ausgabe erledigt. 
Genau das ist doch die Grundidee. Genau dadurch hat die MCU die Zeit, 
das zu tun, was eine MCU tun sollte: Rechnen, statt blödes stupides 
Bitbanging zu betreiben.

>  512 LEDs / 1.5KB RAM / 6.5 Meter Stripe - das sind die Grenzwerte fur
>  328p.

Das sagst du, aber frag' mal einen geistig Gesunden! Bei mir steuert ein 
Tiny2313A 1024 WS2812B. Und der hat nebenbei noch locker genug Zeit 
dafür, Befehle via IR-FB oder I2C entgegen zu nehmen.

>  Fur mehr haben die 8-bit AVRs ganz einfach nicht genugend RAM, vorallem
>  da die WS2812 die ganzen Daten in einem Stuck erwarten.

Du hast definitiv garnix begriffen. Es ging ja genau darum, dass es 
möglich ist, die Ausgabe (weitestgehend) unabhängig von der MCU zu 
betreiben, wodurch es möglich wird, die MCU statt dessen mit dem zu 
beschäftigen, was sie eigentlich tun sollte: rechnen.

Und wenn genug freie Rechenzeit verbleibt, um einen Effekt in ECHTZEIT 
zu berechnen, dann braucht man für die allermeisten Effekte schlicht 
keinen Framebuffer (also kein RAM), weil all diese Effekte sich 
funktional beschreiben lassen auf Grund der Position der aktuellen LED 
in der Kette und der aktuellen Framenummer bezüglich des 
Startzeitpunktes des Effektes.

Trivialste Logik und trivialste Mathematik. Ja, ganz sicher nix für 
Arduino-Fans. Und für die allermeisten C-Programmierer (die ja nicht 
wirkliche Programmierer sind, sondern Lib-Nutzer mit minimaler 
Eigen-Intelligenz) wohl auch much to much.

Richtige Programmierer hingegen (selbst wenn sie sich aus unerfindlichen 
Gründen freiwillig auf die Anwendung von C kastrieren) haben eine echte 
Chance, dieses Konzept auch in C umzusetzen, müssen sich dann aber auf 
relativ triviale Effekte beschränken, weil halt leider der Compiler viel 
zu viele Takte in den ISR-Frames völlig nutzlos versenkt. Mit dem IAR 
ist hier schon deutlich mehr möglich als mit dem gcc. Aber gegen eine 
optimale Asm-Umsetzung kann auch der IAR nicht annähernd anstinken...

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

c-hater schrieb:
> Du hast definitiv garnix begriffen. Es ging ja genau darum, dass es
> möglich ist, die Ausgabe (weitestgehend) unabhängig von der MCU zu
> betreiben, wodurch es möglich wird, die MCU statt dessen mit dem zu
> beschäftigen, was sie eigentlich tun sollte: rechnen.
>
> Und wenn genug freie Rechenzeit verbleibt, um einen Effekt in ECHTZEIT
> zu berechnen, dann braucht man für die allermeisten Effekte schlicht
> keinen Framebuffer (also kein RAM), weil all diese Effekte sich
> funktional beschreiben lassen auf Grund der Position der aktuellen LED
> in der Kette und der aktuellen Framenummer bezüglich des
> Startzeitpunktes des Effektes.

 Jajaja, nur reden wir hier von 2 verschiedenen Sachen:
 Ich rede von Ansteuern und du redest von Blinken und Spielerei.
 Irgendetwas "berechnen" ohne die entsprechenden Daten im RAM zu
 haben, ist ganz einfach Blödsinn. Und dumme Farbwechselei ist
 dasselbe wie LED blinken lassen, also lass es lieber sein.

> Das sagst du, aber frag' mal einen geistig Gesunden! Bei mir steuert ein
> Tiny2313A 1024 WS2812B. Und der hat nebenbei noch locker genug Zeit
> dafür, Befehle via IR-FB oder I2C entgegen zu nehmen.

 Wetten, dass mein Knight Rider älter als deiner ist, weniger RAM
 braucht und viel besser aussieht ?

von Ulrich F. (Gast)


Lesenswert?

c-hater schrieb:
> Ja, ganz sicher nix für
> Arduino-Fans
Hey, kannste mal bitte damit aufhören, mich zu beleidigen?

Wenn du die ganze abwertende Sche*ße aus deinen Texten raus lassen 
würdest, dann ist wirklich einiges davon lesenswert.
Aber so ergibt das Gesamtbild: Gequirlte Sche*ße, mit Rosinen!
Bäh..

von Joachim B. (jar)


Lesenswert?

Marc V. schrieb:
> Fur mehr haben die 8-bit AVRs ganz einfach nicht genugend RAM, vorallem
>  da die WS2812 die ganzen Daten in einem Stuck erwarten.

der atmega 1284p hat 16 KB SRAM gibts auch als mighty Arduino fertig

die IRMP benötigt nur 1-2µs im IRQ das stört die Ausgabe kaum, 
jedenfalls habe ich da noch nix bemerkt, aber evtl. ist denn Berechnung 
nicht mehr möglich.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Timm T. schrieb:
> Da der 1284 genug Pins hat, kannst Du auch 16 Stränge parallel bedienen.
> Die Anzahl der LED wird dabei nicht größer, weil Ram beschränkt, aber Du
> bist für 16 x 340 LED in 4msec fertig und kannst mit 200 Hz updaten.
> Oder halt mit 100 Hz, und nebenbei noch Seti rechnen.


 Muss ich dir absolut Recht geben. Habe nicht viel daruber nachgedacht,
 vor allem weil die Muster schon am PC aufbereitet sind und AVRs
 brauchen diese nur von der SD zu lesen. Irgendwie schien es leichter
 und einfacher die AVRs zu vernetzen und nur die Framenummer zu senden.
 Werde mir das Ganze nochmal uberlegen, aber ob wir jemals wieder einen
 Auftrag mit mehr als 600 LEDs haben werden, ist fraglich.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Joachim B. schrieb:
> der atmega 1284p hat 16 KB SRAM gibts auch als mighty Arduino fertig

 Es gibt auch relativ billige Mega2560, aber wir haben nun mal jede
 Menge Motherboards mit entsprechend rausgefuhrten Steckern fur Arduino
 PRO machen lassen und es ist immer leichter nur zu stecken, als das
 Gehirn ein bisschen einzuschalten.

 P.S.
 Arduino-PRO weil es ganz einfach billiger ist als einzelne 328p.

von Joachim B. (jar)


Lesenswert?

Marc V. schrieb:
> Es gibt auch relativ billige Mega2560,

die haben weniger SRAM als der 1284p und sind als Arduino fetter von der 
Platine

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.