Beiträge von lizard.king

    Hallo


    Nun bin ich endlich dazugekommen meine Versuche fortzusetzen und habe nun eine funktionierende Lösung zusammengebaut. Dazu habe ich einen Arduino Mega 2560 (ein kleinerer Chip würde auch reichen) mit einem FT245RL (USB to 8 bit Parallel IO Chip) kombiniert. Auf diese Weise kriege ich einen hohen Datendurchsatz zum AVR (mit dem ersten Bascom gewurstel sinds schon ca. 48kbyte Sekunde) und habe immer noch genügend Rechnungsleistung übrig um per Bitbang (dies allerdings in Assembler) das Signal für den Stripe zu erzeugen. Da im Bitbangcode noch diverse NOPs vorhanden sind, hoffe diese durch Befahle für den Datenempfang ersetzen zu können und so gleichzeitig den Stripe zu bedienen und den Puffer mit dem nächsten Frame füllen zu können. Mal sehen obs klappt.


    Das ganze läuft bis jetzt stabil, ohne Geflacker und sonstige Aussetzer. :)


    Im Moment hängt die Geschichte am PC, aber ab dem Raspi müsste die Sache wohl auch funktionieren.


    Hier noch ein Bild des aktuellen Gebastels (werde nächstens eine Platine zeichnen die alle Komponenten vereinigt).



    Viele Grüsse


    Tom


    PS:
    Mit der blauen Klemme mit der Nadel nehme ich das Signal für den Stripe ab. Klappt bestens. ;)

    Hallo


    Die Flackerprobleme in meinem Aufbau sind sicher durch mein übles Gebastel (mit)verursacht. Bis jetzt ist ist alles auf dem Steckbrett, teils mit, teils ohne Entkopplungskondensatoren und auch die Leitungen zwischen den verschiedenen Teilen des Aufbau (Raspi - Steckbrett, Steckbrett Stripe, Verbindungen zum Oszi) sind einfache Messleitungen. D.h. ein wunderbar unübersichtliches Durcheinander auf dem Arbeitstisch. ;)


    Sobald mir klar ist wie die Schaltung zwischen Raspi und Stripe aussehen muss um ein wirklich stabiles und sauberes Signal zu kriegen, werde ich eine Platine layouten. Dann kehrt wohl auch wieder etwas Ordnung ein.
    Für Nachhilfe bei entsprechenden Schaltungsentwurf bin ich natürlich immer dankbar (Alles was nicht rein Digital ist verstehe ich leider nur halb).


    Die Stromversorgung aller Komponenten kommt aus dem gleichen Netzteil. Auch der Raspi wird so versorgt. Anstelle des Usb-Anschlusses für die Stromversorgung verwende ich den GPIO Stecker um die Spannung einzuspeisen.


    Bezüglich anderer Datenraten habe ich bereits einige Versuche unternommen. Es gibt von der Sollfrequenz durchaus etwas Spielraum nach oben und unten (weiss leider nicht mehr was wirklich funktioniert hat), allerdings haben bei mir stark abweichende Frequenzen nicht funktioniert.


    Viele Grüsse


    Tom

    Ja, die Oszibilder darf man natürlich gerne sehen.


    Hier als erstes das Signal an MOSI bei 800khz wenn immerzu 255 ausgegeben wird. Die Pausen zwischen den Bytes sind schön sichtbar.


    Signal an MOSI bei der erwähnten 4bit Variante mit 3.2mhz


    Und last but no least die 8bit Variante mit 7mhz. Das Timming passt recht gut. Der 0 Pulse ist mit 0.28us etwas zu lang, der 1 Puls mit 0.57us geringfühig zu kurz.


    Das Flackern meiner Leds hat vermutlich nur beschränkt mit dem Signal zu tun. Wie schon erwähnt, es flackert sogar wenn jemand an der Haustüre klingelt.

    Hallo


    Hier einige neue Testresultate mit dem Raspi.


    Die Signalgenerierung liegt nun vollständig beim Raspi. D.h. ich habe am MOSI lediglich ein einzelnes Gatter um auf den 5V Pegel zu kommen, abgesehen davon wird nun alle Arbeit vom Pi gemacht.


    Dazu lasse ich auf dem SPI vorproduzierte Frames ausgeben bei denen die Länge der Pulse durch die Anzahl aufeinanderfolgernder 1 Bits definiert ist.


    Den Versuch habe ich sowohl mit einer 4 bit Variante (d.h. 0 Bit =1000, 1 Bit=1100), wie auch mit einer 8 bit Variante (0 bit=11000000, 1 bit=11110000) durchgeführt. Damit ist das Timing nicht perfekt, aber der Stripe ist in der Lage die Leds korrekt zu schalten. :)
    Anzumerken ist allerdings, dass mein Kabelverhau natürlich auch jetzt immer wieder zu Störungen führt (auch wenn an der Haustüre geklingelt wird flackern die Leds wie wild).


    Den Übergang zwischen den Bytes am SPI habe ich ebenfalls analysiert. Zwischen jedem Byte wird eine Pause in der Länge von einem Bit eingeschoben (nehme an da holt sich das DMA vom SPI das nächste Byte ab). Während dieser Pause liegt MOSI auf Low.
    Aus diesem Grund ist es nicht möglich 5 Bits pro Bit auszugeben (damit hätte man ein sehr schönes Timing hingekriegt), da die Pausen in den Pulsen liegen würden
    Bei oben beschriebenen 4bit Variante ist die Pause nach jedem zweiten Puls etwas länger (normal ca. 0.6us, länger ca. 0.9us). Dies scheint den Strip allerdings nicht zu stören.
    Bei der 8 Bit Variante fällt die Extrapause nach jedem Puls an. Trotzdem fällt sie weniger ins Gewicht da die Pausendauer im Vergleich zur 4bit Variante halbiert ist.


    Auf die Pause zwischen den Bits ist wohl auch zurückzuführen, dass SPI Frequnzen etwas höher als der rechnerisch korrekte Wert liegen zuverlässiger zu funktionieren scheinen. D.h. bei 4bit habe ich mit 4mhz gute Resultate gehabt, bei 8bit haben 7mhz gut funktioniert.


    Der Overhead für die Generierung der vorbrechneten Frames ist aus meiner Optik vertretbar. Der Raspi hat genügend Speicher und auch die Rechnungsleistung sollte kein Problem sein.


    Als nächstes werde ich nun versuchen einen etwas gescheiterrn Treiber für den Bus zum Strip auf eine kleine Platine zu bringen. Damit hoffe ich die Aussetzer ?( die im Moment manchmal auftreten in den Griff zu kriegen.

    Wenn man das Signal direkt ab SPI erzeugen will, wäre es ev einen Versuch wert das direkt mit dem Raspi zu machen. Mit 4mhz SPI Frequenz könnte das ev hinkommen. Muss morgen mal überprüfen ob der Raspi auf MOSI nach jedem Byte zwingend kurz auf low schaltet oder ob zwischen den Bytes auch ein High Status möglich ist.
    Falls ja, sollte es möglich sein jedes zu übertragende Byte auf 5 Bytes aufzublasen, diese mit 4mhz auszugeben und so ein passendes Signal zu erhalten.


    Wurde sowas schon mal versucht?

    Hier noch ein kleiner Nachtrag zu meinem Versuchsaufbau (siehe Beitrag weiter oben)
    :
    Heute habe ich den 74HCT123 erhalten und natürlich sofort einige Versuche unternommen.


    Mit dem HCT Typ müssen die Timmingkomponenten angepasst werden. Die Wiederstandswerte habe ich beibehalten und statt den 100pF Cs solche mit 220pF verwendet. Damit passen die Pulsweiten recht genau.


    Leider wird der Betrieb dadurch nicht stabiler. Es kommt bei der Ausgabe auf dem Stripe immer noch zu Fehlern. Auf den ersten bilck scheinen die ersten Bytes verschluckt zu werden. Muss ich aber noch genauer rausfinden.

    Nochmals Hallo


    @Neni:
    Die Variante mit dem übrigen XOR als zusätzlicher Puffer habe ich auch getestet. Hat aber nix gebracht.
    Die Anmerkung zum Thema HCT ist einleuchtend. Habe den Chip schon bestellt und bin gespannt was passiert.
    By the way: Ich bin tatsächlich in der Nähe von Zürich zuhause


    Irrlicht:
    Mit ist klar, dass die Steckbrettgeschicht doch sehr suboptimal ist. ;) Ist ja auch nur ein Versuch.
    Sobald klar ist, dass sich die Schaltung wie gewünscht verhält werde ich natürlich eine Platine ätzen. Wird sicher wieder eine längere Übung bis ich ein halbwegs brauchbares, einseitiges Platinenlayout gezeichnet habe.
    Den Tipp mit der Stromversorgung habe ich begriffen, aber den Hinweis auf die Terminierung der Datenleitung vom Raspi verstehe ich nicht ganz (Bin halt eher der Software als der Hardware Mensch). Kannst Du mir einen Tipp geben was Du da genau machen würdest? Danke.


    Viele Grüsse


    Tom

    Hallo


    Mittlerweile habe ich die Schaltung mit dem 74123 auf dem Breadboard nachgebaut. Allerdings musste ich auf den 74HC123 satt des 74HCT123 ausweichen, da der HCT-Typ auf die schnelle nicht erhältlich war. Fürs Timming habe ich bei den C jeweils 100pF eingesetzt und für die zugehörigen Wiederstände 2.2k für 0, sowie 10k und 8.2k parallel (ergibt ca. 4.5k) für 1 verbaut. Damit passen die Impulslängen recht genau.



    Für die Lieferung der Daten an die Schaltung benutze ich einen Raspberry PI. Der SPI Driver ist gepatcht um die 800khz Outputfrequenz zu ermöglichen (siehe http://www.raspberrypi.org/phpBB3/viewtopic.php?f=44&t=43442).
    Mit dieser Kombination ist es nun möglich einen WS2811 resp. WS2812 basierten Ledstreifen anzusteuern. :D8)


    Im Oszi sieht das Ausgangsignal wie folgt aus (Grün=Ausgangssignal, Gelb=MOSI):


    Anzumerken bleibt noch, dass das Monoflop für den 0-Impuls (0.25us) zum Teil dazu neigt nach der Generierung des ersten Pulses noch einen zweiten Puls zu produzieren.

    Da diese Problem meist nur auftritt, wenn noch ein Oszi am Ausgang hängt, nehme ich mal an, dass der Aufbau auf dem Breadboard und der zugehörige Kabelverhau (siehe unten folgendes Bild) zwischen Raspi, Schaltung Oszi und Ledstripe sich ungünstig auswirkt.


    Um die Schaltung noch etwas praxistauglicher zu machen, wäre eine kleine Verstärkerstufe am Ausgang ev. eine Überlegung wert. Damit wären auch etwas längere Leitungen von der Schaltung zum Ledstripe weniger problematisch.


    Viele Grüsse


    Tom

    Ich habe meine Versuche mit einem Attiny13 gemacht. Bei 9.6mhz Taktfrequenz stehen pro Bit welches ausgegeben werden soll 12 Taktyklen zur Verfügung bevor das nächste Bit beginnt. D.h. der Puls für 1 müsste etwa 6 Taktzyklen umfassen, jener für 0 etwa 2.4 Taktzyklen (nehme an 3 Zyklen würde auch funktionieren).


    Ich habe ein kleines Assemblerschnipssel poduziert (siehe unten)welche diese Vorgaben in etwa einhalten sollte und das Ausgangsgnal per Bitbanging produziert, aber irgendwie hat das nicht richtig geklappt. Die Taktzyklen sind abgezählt und in jeder Zeile im Kommentar vermerkt. Hoffe ich habe nichts wichtiges übersehen.


    Die Idee den PWM Ausgang zu "missbrauchen" scheint mir reizvoll, bin aber nicht sicher ob man dies Timingmässig unterkriegt. Wäre ein interessantes Experiment.


    Hier der Code meines Versuchs. PIN.B wäre das SPI Taktsignal, PINB.3 die SPI Datenleitung und PORTB.0 der Datenausgang für den WS2811 LedStrip.

    Bin ebenfalls am warten bis der 4538 als HCT eintrifft. Mal sehen was das bringt.


    Beim Nachdenken über Alternativen, ist mir noch aufgefallen, dass das Taktsignal des SPI genau die nötige Dauer für ein 1 Bit hat. Dafür muss also nicht aml unbedingt eine eigene Timerschaltung eingsetzt werden, sondern es kann einfach das Taktsignal via Logikgatter ausgegeben werden. Für die 0 Bits mit den 0.25uS muss allerdings trotzdem noch eine lösung gefunden werden.

    Hallo Irrlicht


    Die Schaltung ist nicht auf einem Steckbrett. Habe eine kleine Platine hergestellt. Werde ich sofern das irgenwann funktioniert auch gerne hier zur Verfügung stellen.


    Die Idee mit dem Tiny ist mir auch gekommen und ich habe auch schon einige Versuche in diese Richtung angestellt. Es hat sicher allerdings schnell gezeigt, dass der Weg nicht funktioniert. Der Tiny ist nicht schnell genug. Bei der Anzahl Taktzyklen die pro Bit zur Verfügung stehen, kriegt mann das Timing nicht sauber hin (Habs mit Assembler probiert).. Ich denke für diesen Weg müsste man min. 10-20mhz Taktfrequenz (besser noch etwas mehr) haben.


    Gruss


    Tom

    Hallo Neni


    Mit 100pF und einem anderen Trimmer (auf ca. 3.5k eingestellt) habe ich es mittlerweile auch ausprobiert. Leider auch wieder ohne brauchbares Resultat. Eingangssignale am Monoflop wunderbar, Ausgang nix verwertbares.


    Ev. liegt das Problem wirklich daran, dass ich den HC und nicht den HCT Typen verwendet habe. Leider war der HCT Type auf die schnelle nicht erhältlich, ist jetzt aber bestellt (mal sehen wie lange Distrelec braucht den Chip aufzutreiben). Mal sehen ob das was bringt.



    Merci für die Hilfe


    Tom

    Hallo


    Zurück zum ursprünglichen Thema:


    Ich habe versucht die Treiberschaltung nachzubauen. Leider bis jetzt ohne Erfolg.


    Meine WS2811 Strips brauchen 800khz, d.h. die Impulse ab dem Monoflop müssen 0.6uS resp. 0.25uS lang sein. Leider klappt die bei mir nicht. Für die C-Werte habe ich jeweils 1nF eingesetzt und für die zugehörigen Widerstände jeweils 1k-Ohm Trimmer (auf 680Ohm und 360Ohm) eingestellt. Mit dieser Bauteilauswahl kommt leider kein Signal ab dem Monoflop. Ich kann mit die Signale bis zum Monoflop nachvollziehen, aber anschliessend ist leider nichts mehr zu sehen :(


    Heute habe ich nun einige Versuche mit dem Monoflopbaustein 74HC4538 unternommen. Mit etwas höheren Widerstandswerten als jenen die ich in der Schaltung verwendet habe, klappt die Signalgenerierung ab dem Baustein wunderbar. Wenn ich aber Widerstände <1k-Ohm verwende, da ist wieder tote Hose am Ausgang.


    Was kann ich unternehmen um den 74HC4538 zu Zusammenarbeit sprich zu generierung der Pulse mit korrekter Länge zu bewegen? Gibt es einen alternativen Monoflopbaustein welcher Pulse in der richtigen Länge, d.h. 0.6uS und 0.25uS erzeugen kann?


    Danke und Gruss


    Tom

    Mittlerweile bin ich dabei Versuche mit dem Raspbeery Pi anzustellen. Das Problem dabei ist, dass der Raspi per Default nur SPI Frequenzen unterstützt die mit einem Teiler der eine Potenz von 2 ist aus dem Systemtakt (250mhz) gebildet werden können. 800khz oder etwas in der nähe sind so nicht möglich.


    In folgendem Artikel habe ich eine Lösung für dieses Problem gefunden:
    http://www.raspberrypi.org/php…0586&f=44&t=43442&start=0


    Der Raspi unterstützt Hardwareseitig auch andere Teiler und die Zweierpotenz ist nur Softwareseitig verankert. Mit einem angepassten Treiber stehen daher wesentlich mehr verschidenen SPI Frequenzen zu Verfügung. Habe die Frequenz bereits per Oszi geprüft und konnte eine Frequenz nahe an 800khz ausgeben.


    Werde nun die Monoflopschaltung nachbauen und anschliessend prüfen ob der WS2811 Led Stripe sich kooperativ zeigt.

    Hallo


    Hier eine Eaglelib mit dem WS2803. Meine Layouts damit haben gut funktioniert, aber ich kann natürlich für nichts garantieren.


    Gruss


    Tom

    Dateien

    • WorldSemi.zip

      (2,52 kB, 319 Mal heruntergeladen, zuletzt: )

    Habe in den letzten Tagen mal mit den WS2803 etwas rumgespielt. Die Ansteuerung arbeitet wie erwartet mit den Codebespielen zum WS2801 bestens. :)


    Allerdings ist mir ein Unterschied zum Verhalten des WS 2801 (Wissen aus Forum und Datenblatt, habe den Chip nicht) aufgefallen. Nach meinem Wissen schluckt der WS2801 die ersten 24 Bit welche er empfängt und reicht alle folgenden Daten an die folgenden ICs weiter.


    Zumindest in meinem Aufbau scheint sich der WS2803 wie ein klassisches Schieberegister zu verhalten. D.h. die Daten werden offensichtlich laufend weitergeschoben. Mit 2 hintereinandergeschalteten WS2803 werden die ersten 18 Bytes auf dem 2 IC in der Reihe ausgegeben und die zweiten 18 Bytes auf dem ersten IC. Dieses Verhalten wiederspricht aus meiner Optik auch der Beschreibung im Datenblatt im Abschnitt "2 Wire Control Mode".


    Hat schon jemand die gleichen Erfahrungen gemacht oder stehe ich mal wieder auf dem Schlauch :?:


    Gruss


    Tom



    Kleiner Nachtrag:
    Falls jemand etwas damit Anfangen kann, ist meine Eagle lib mit dem WS2801 (aus Turis lib kopiert) und nun zusätzlich dem WS2803 angehängt.

    Dateien

    • WorldSemi.zip

      (2,48 kB, 385 Mal heruntergeladen, zuletzt: )

    Hallo


    Hoffe ich habe das richtige Forum für diese Frage erwischt.


    Das Datenblatt zum WS2803 (http://www.scribd.com/doc/52240262/WS2803-preliminary-En ) ist leider weniger ausführlich als jenes zum WS2801 und Beispiele mit dem IC sind leider auch sehr rar. Bin daher nicht sicher ob ich das Prizip der Stromregelung richtig begriffen habe.


    Im Datenblatt steht: "The output current can be set by connect a resistor at IREF pin to set the output current of each channel". Ausserdem findet man da auch eine schöne Formel um diesen Widerstand zu berechnen.


    Heisst das, dass ich für die LEDs keine Vorwiderstände benötige, wenn ich den richtigen Widerstand in IREF (bei 5V Spannung 5k für etwa 20ma) anschliesse? Oder liege ich da falsch?


    Als Beispiel habe ich eine kleine Zeichnung aus Eagle angehängt.


    Wäre für Erfahrungen und Tips zu dem Chip und seiner Beschaltung dankbar.


    Danke und Gruss


    Tom