Autor Thema: Programmierung WS2812  (Gelesen 24283 mal)

picalic

  • Gast
Re: Programmierung WS2812
« Antwort #15 am: November 20, 2014, 01:39:10 Vormittag »
Hi,

für Details kannst Du ja mal einen Blick in die Projekt-Dateien werfen (s.Anhang oben). Der PIC (hier: 12F1840, 12F1822 ginge aber auch, wenn man mit weniger RAM auskommt) wird mit 32MHz getaktet (interner Oszillator). Eigentlich hatte ich mal vor, alles als Webseite zu dokumentieren, was aber mal wieder im Sande verlief...
Der Comparator wird hier ja nur als Signal-Verzögerung (ein paar hundert ns) misbraucht, aber da er nunmal zwei Eingänge hat, die er miteinander vergleichen will, muss man den zweiten Eingang auf irgend eine Spannung zwischen High und Low legen. Hier bietet sich natürlich die PIC-interne Referenz an, mit ca. 1/2 Versorgungsspannung.

Kann gut sein, daß sich das auch in C realisieren lässt, evtl. mit kritischen Teilen in Assembler. Es gibt zwar kein Bitbanging, aber für ein optimales Timing habe ich bei der ISR schon mit Befehls-Zykluszeiten gearbeitet. So wird z.B. schon bei der Ausgabe des 7.Datenbits durch den Postscaler vom Timer2 (der auch das PWM-Signal für die "0" erzeugt) der Interrupt ausgelöst, so daß über die Laufzeit der Befehle in der ISR das nächste Datenbyte genau frühstmöglich nach fertiger Ausgabe des aktuellen Bytes ins SPI-Senderegister geschrieben wird. Auch für die Synchronisation von PWM und SPI muss mit Laufzeiten der Maschinenbefehle gerechnet werden - ich denke, nur in C hat man das nicht unter Kontrolle.
Ich selbst ziehe bei den kleinen PICs die Programmierung in Assembler vor, weil's mir Spass macht und ich denke, daß ich so effektiver mit den knappen Recourcen des Controllers umgehen kann. Kann mir z.B. nicht vorstellen, daß sich PICALIC in C auf einem 4MHz PIC mit 1K Programmspeicher implementieren ließe!

Zu den WS2812 bin ich letztens zufällig noch auf eine interessante Webseite gestoßen: http://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/
Also anscheinend kann man Timings auch mal ungestraft um die ein- oder andere Microsekunde verlängern, was für  eine Lösung in C hilfreich sein könnte.
 
 

Offline Darkside

  • Newbie
  • *
  • Beiträge: 45
    • Profil anzeigen
Re: Programmierung WS2812
« Antwort #16 am: November 20, 2014, 21:19:36 Nachmittag »
:)

Glaub, über Picalic bin ich schon mal kurz gestossen, hatte mich aber nicht weiter interessiert gehabt. Hatte kein Bedürfniss LEDs in einem Bestimmten Muster leuchten zu lassen und eine einfache Lichtansteuerung kann man auch direkt programmieren...
Hab mal angefangen über eine RC-Lichtsteuerung nach zu denken und dann auch irgend wann mal angefangen, um von einem Empfänger die Kanäle auszuwerten.
Hab dann auch in einem RC-Forum gesehen, dass da auch jemand gegen Mitte des Jahres da auch langsam soetwas anfangen wollte und Überlegungen gestartet hatte etc.
Persönlich bin ich noch nicht all zu weit mit dem Projekt gekommen.
Hatte auch mal eine Platine angefertigt, um mit ihr in die Pic Materie tiefer ein zu steigen, für TQFP-64 und 80 Pics (z.B. 18F8722) mit vielen Pins, massig Speicher, damit man auch keine Probleme bekommt beim herumprobieren, mehrere Sachen anzuschliessen. Da das entwickeln aber von weiterer Zusatzhardware für z.B. 7-Segment Anzeige, LCD-Display Adapterplatine, Eingabetaster/Eingabematrix etc. sehr Zeitaufwendig ist, aber natürlich auch sehr lehrrich, wurden Teilweise Ideen angefangen aber nicht zuende gebracht, da das layouten und dann das Ätzen, bohren und bestücken noch gemacht werden muss, wurde etwas vorgefertigte Hardware meist aus China bestellt. Günstig, und wenn die Qualität nicht so ganz stimmt ist es halb so schlimm, kann man verbessern und ist nur zum herumexperimentieren...
Dupond bzw. Breedboardstecker bekommt man auch recht günstig. Hatte da auch mal angefangen mir vor paar Jahren selber Kabel zu konvektionieren (0,75mm² Leitung, Aderendhülse und Federstahldraht als Kontaktstift und alles verlötet). War günstig und robust, leider Zeitaufwendig und der 0,8mm Federstahl war etwas zu dick. Aus Zeitmangel wurde dann durch einen glücklichen Zufall ein EasyPic V7 besorgt. Mit den Dupondleitungen kann man auch gut das selbsgemachte mitverwenden. Zwacke da auch grad die 5V für das EasyPic-Board ab, da der dort sitzende Tiefsetzsteller schreckliech fiept, bzw. die Spule. Auf dem selbstgemachten ist ein normaler 7A, 5V Spannungsregler.

Wie auch immer. Hab Empfänger für 4 Kanäle getestet. Danach auch einen 5. in Software umgesetzt, aber nicht getestet, da dann wieder die Zeit fehlte. Letzten Monat ist dann noch der Vater unerwartet verstorben. Das wirft auch einen aus der Bahn und vieles ist zu erledigen. Langsam versuche ich mich aber abzulenken und bald kommt ja auch Weihnachten. Da sind paar Lichtspiele ganz passend....

Nun ja. Durch das Projekt einer Lichtsteuerung über Funke macht man sich gedanken.
Empfänger auslesen war da zunächst die größte Hürde.
Da man sich auch überlegungen macht, wie man die LEDs am besten versorgt, da die ja je nach dem verschiedene Spannungen brauchen, kam auch überlegung auf, ob man nicht RGB-LEDs verwendet. Wenn man dann z.B. LEDs in eine Karosserie von einem Modellauto verbaut, dann könnte es ganz lustig sein, wenn diese mehr als nur leuchten können. z.B. Rotes Bremslicht, das auch Blinken kann, also Amimässig. Wenn man dies nicht möchte, z.B. Rotes Bremslicht und orangenes blinken.
So bin ich zu den LEDs mit Controller gekommen. Hatte mich davor nicht so interessiert und folglich nicht gewusst, dass die einen Controller haben etc. Dachte das wird anders realisiert. Ist ja echt vieles mit denen möglich und auch recht einfach, mal abgesehen von den Problemen mit den Timings, was wirklich ein Problem ist, was aber in den Griff zu bekommen ist, wie man bei anderen Adafruit, Arduino etc sieht, und auch in dem geposteten Link (komisch, kopiere ich den Link, geht es nicht, danach gesucht gehts und mit der Adresse...!?!). Und mit den Controller muss man auch nur 5V zur Verfügung stellen..
Picalic dürfte auch so wie ich das auf den ersten Blick gesehen habe interessant sein, wenn man nicht nur Licht nach Knüppelstellung schalten möchte.


Den Code muss ich mir auch mal genauer anschauen. Habe aber eher Graus vor Assembler. Hab da vor einigen Jahren mit Assembler angefangen und auch in Assembler eine Stoppuhr programmiert, bzw. Hardware mit 4 7-Segment Anzeigen im Multiplex. Die Zeit konnte man Minutenweise einstellen und wurde im eeprom gespeichert.
Finde aber Assembler sehr unübersichtlich und auch sehr aufwendig, da man alles per Hand machen muss und bei mehr als 8Bit ins schwitzen kommt. Klar, Zeitkritische Anwendungen wird anders ein Ding der Unmöglichkeit. Denke wenn man viel mit Assembler macht und dies Regelmässig, klappt das auch ganz gut. Find da aber C doch kompfortabler. Da hat man mal eben schnell was programmiert. Es ist gut lesbar und XC8 sollte da auch schon einen recht guten Code generieren (mal abgesehen von der Lite version, die extra noch Müll mit generiert, damit der Code größer und langsamer wird) Wenn man auch mal auf http://www.t4f.org/articles/optimization-of-microchip-pic-xc8-compiler-in-free-and-pro-mode/ schaut, da ist auch ein ASM crack. Programmiert kleinere Familien nur in ASM hat aber mal XC8 probiert und sagt, dass es im Pro-Mode einen super Job liefert und er auch nicht mehr herausholen kann. Klar, Pro Version für Privat lohnt sich wohl nicht. Aber dafür sich mit ASM herum zu schlagen, sehe ich auch nicht ein. Zur Not kann man schauen....

Viele Projekte sind ja auch zu Kompakt um diese in ASM zu verwirklichen. Habe mir auch mal ein Board von Sure Elektroniks bestellt mit PIC24, LCD Display, RJ45 anschluss und ENC28J60, um mit TCP/IP was zu machen. Denke man kann so schnell ein WEB Interface für Smartphones verwirklichen, um mit Smartphones Sachen zu machen und sich anzeigen zu lassen. Wollte da halt mal langsam anfangen mit Beispielen die eher schon so laufen, um sich weiter damit zu beschäftigen und zu lernen, wie man den TCP/IP-Stack von Microchip anpasst.

Aber momentan versuche ich Zeit zu finden die LED Controller möglichst einfach anzusteuern und damit etwas herum zu experimentieren.
auch wenn die LEDs eine Abweichung vom Timing von 150nS oder so zulassen, so ist diese Zeitkritische Signalfolge doch nicht ohne.
Pic-Controller werden da auch nicht so oft genommen zumindest ist es da schwieriger etwas zu finden.
Das hier gezeigte Projekt scheint das beste zu sein oder evtl mit CLC auf einer Höhe zu stehen.

so, war jetzt doch etwas viel Text.

picalic

  • Gast
Re: Programmierung WS2812
« Antwort #17 am: November 21, 2014, 02:29:23 Vormittag »
Ja, interessanter Link, Danke! Genau wie der Ramiro sehe ich das auch: die kleinen Base-Line und Mid-Range PICs sind aufgrund ihrer Architektur einfach schlecht für eine effektive Programmierung in C geeignet. Die Enhanced-Midrange gehen da vielleicht schon eher.
Wobei ich finde, daß die "C-optimierten" Erweiterungen auch bei der ASM-Programmierung nützlich sind - war jedenfalls bei meiner PIC2WS281x-Sache schon sehr hilfreich.  Im 8-Bitter Bereich werde ich aber wohl bei ASM bleiben - dicke Controller mit komplexeren Sachen programmiere ich aber auch in C.   

Offline Darkside

  • Newbie
  • *
  • Beiträge: 45
    • Profil anzeigen
Re: Programmierung WS2812
« Antwort #18 am: November 24, 2014, 19:03:43 Nachmittag »
Jo, Assembler hat ja auch paar Vorzüge. Aber heutzutage, kommt man bis auf paar Ausnahmen auch gut mit C aus. Ist halt nur ein Nachteil, dass es nicht nur den XC8 Compiler gibt, es da also auch noch unterschiede gibt, die man kennen/beachten muss. Ist ja jetzt aber etwas besser geworden, durch XC8. Davor mit C18 Konnte man ja keine 10, 12, 16er Pics programmieren und musste z.B. auf Hi-Tech ausweichen, also dort auch die Syntax beachten.
Aber sich in Assembler einzuarbeiten, so dass man damit auch gut und schnell arbieten kann, ist heute auch kein muss mehr.
Aber hat alles Vor- und Nachteile. Falls man aber doch mal etwas in Assembler braucht, dem ist ja auch super bei Sprut geholfen, auch hilfreich bei C, was die Module so leiten können...

Offline Darkside

  • Newbie
  • *
  • Beiträge: 45
    • Profil anzeigen
Re: Programmierung WS2812
« Antwort #19 am: November 25, 2014, 21:43:44 Nachmittag »
so, hab jetzt mal die bestellten PICs mit CLC bekommen.
Hab mal Code in XC8 dafür geschrieben. Zum testen hatte ich jedoch noch keine Zeit.
Glücklicherweise gibt es das CLCDesignerTool. Damit kann man die CLCs schnell einstellen, bzw. man hat schnell den Code, ohne sich ewig durchs Datenblatt zu arbeiten.
Der Pic muss noch für 16MhZ konfiguriert werden. Glaub wegen SPI geht da auch keine andere Frequenz.
Da Wäre mir USART schon fast lieber. Die kann man ja für Baudraten konfigurieren, diesen Faktor kann man dann in Abhängigkeit vom Takt berechnen...
Naja, muss Checken, ob dass so wegen SPI stimmt. Konnte mich bisher etwas vor SPI drücken, und wie es in XC8 Ausschaut, ist wohl auch anders.
Und vor PPS hab ich mich auch gedrückt, haben ja aber auch nicht alle PICs, der jetzt aber schon.
Naja, gibt noch paar Punkte, die wohl nicht korrekt sein werden. Mal gucken, wann ich zum probieren und nachbessern Zeit finde.

Zwar hat der PIC einen Comparator aber kein DSM-Modul. Werd mal demnächst einen entsprechenden PIC ordern und mal versuchen heraus zu finden, wie denn PWM und der TMR konfiguriert werden muss. Warum der Delay da sein muss, ist mir grad auch nicht so klar. Gibts da nicht den Serial Analyser, mit dem man sich Signale anzeigen lassen kann?


picalic

  • Gast
Re: Programmierung WS2812
« Antwort #20 am: November 25, 2014, 23:12:08 Nachmittag »
z.B. beim 12F1840 kann man die SPI-Datenrate u.a. über das SSP1ADD-Register einstellen - ich weiß aber nicht, ob das für alle PICs gilt.

Zum Delay:
das Problem war, daß ohne Signalverzögerung Glitches am Ausgang aufgetreten sind (habe ich auch erst am Oszilloskop gesehen), und zwar bei Übertragung eines "1" Bits (langer Impuls) nach einem "0" Bit (kurzer Impuls). Der SDO, der das DSM-Modul ansteuert, ändert seinen Pegel mit der fallenden SPI-Clock Flanke (roter Pfeil im Block-Schaltbild). Durch die externe Verbindung des SCL zum zum "1"-Signaleingang des DSM ergibt sich aber eine kleine Verzögerung und der High-Pegel vom SCL liegt noch für einige ns am DSM-Eingang an, während ohne die Verzögerung durch den Comparator der Modulationseingang am DSM schon auf 1 gewechselt hätte. Ergebnis wäre ein kurzer Nadelimpuls am DSM-Ausgang. Mit der Verzögerung durch den Comparator wird die Umschaltung des Datensignals in den Zeitbereich verschoben, wo beide Signaleingänge des DSM stabil auf 0 liegen.

Offline Darkside

  • Newbie
  • *
  • Beiträge: 45
    • Profil anzeigen
Re: Programmierung WS2812
« Antwort #21 am: November 28, 2014, 21:22:27 Nachmittag »
Hm, der Pic hat auch das Register, allerdings für den I²C Mode. Hm

Ah, ok. Also quasi Laufzeitkompensation. Ja, echt gut, wenn man ein Oszi zur Verfügung hat. Danke für die Erläuterung.

Offline Darkside

  • Newbie
  • *
  • Beiträge: 45
    • Profil anzeigen
Re: Programmierung WS2812
« Antwort #22 am: November 28, 2014, 22:31:51 Nachmittag »
So, bin auch schon wieder bedient.

Dachte, ich schau mal, ob das Programm irgend etwas macht.
Also MicroProg Suit gestartet. Der Pic ist aber nicht drin, das EasyPic V7 kann also erst einmal nicht mal eben programmiert werden. Auch auf der Webseite ist der Pic nicht als unterstützt aufgeführt. Evtl mal bei Gelegenheit MikroElektronika anschreiben. Außerdem, warum haben die nur den billigsten 40Pol IC-Sockel? Breche mir irgenwann wirklich Beinchen ab. Vielleicht läuft aber auch der mit Buchsenleiten angeschlossener Nullkraftsockel.
Naja, ok. Dann Sprut Brenner 8. und eine Testversion von USBurn für Win8 gestartet, aber leider auch keine Unterstützung von dem Pic. Muss man wohl mal Sprut noch mal gut zureden, ob er nicht ein USBurn fürn Win8 weiterentwickelt/ofiziell herausbringt und ihm evtl einen Pic zur implementierung schicken.

Gut., also Pickit 3 ausgepackt. Auch Fehlermeldung....
...Stimmt da war etwas...
Direkt an USB-Port am PC angeschlossen. Noch immer nicht.
Stimmt, da war noch was...
... Option vom Pickit 3 auf power target geändert.
Wieder Fehlermeldung. USB hat statt 5V nur 4,75.
Warum gibts nur Probleme.
Noch was umgestellt.
-Geht doch!
Problem, Config muss jetzt noch angepasst werden, konnte woanders so schnell vor dem Brennen konfiguriert werden...
und schon kein Bock mehr. Ist echt übel! naja, dafür kann ich schauen, ob für 16MhZ internen Takt PLL aktiviert sein muss...

Offline Darkside

  • Newbie
  • *
  • Beiträge: 45
    • Profil anzeigen
Re: Programmierung WS2812
« Antwort #23 am: Dezember 04, 2014, 21:00:08 Nachmittag »
Hi,

so, glaub der Anfang ist geschafft.
Irgendwie hat SPI Probleme gemacht. Clock war da, aber nichts auf der Datenleitung, habe dafür Extra diese SPI-Signale mit PPS auf Pins gelegt.
Als ich dann nur mit SPI herumexperimentieren wollte, hatte es nocht immer nicht geklappt. Schon dies und das ausprobiert, doch dann ging es plötzlich. Woran dies wieder gelegen hat, keine Ahnung. Habe auch mittels PPS die Signale auf andere Pins gelegt, Wackelkontakt sollte es also auch nicht gewesen sein. Denke eher, Problem von mplabx bzw. XC8, da hatte ich auch diverse Probleme mit USART.
Den Pic dann noch für 8Mhz intern und 4xPLL konfiguriert und noch mal die CLC überdacht. Da hatte ich mich noch nicht genug mit auseinander gesetzt.
Ich denke aber, jetzt sollte es passen. Wird ein Byte an SSPBUF übergeben, so Leuchtet die erste LED grün, und die Intensität ist vom Wert abhängig.
Die Frage ist aber, wie man die anderen Farben bzw. LEDs ansteuert. SSPBUF ist nur ein Byte groß, oder sehe ich das falsch?
Müsste also so die Bytes rein schieben, dass weder pausen entstehen, noch SSPBUF verändert wird, während SPI die Daten am ausgeben ist. Ist die Frage, wie man dies geschickt bewerkstelligt.

picalic

  • Gast
Re: Programmierung WS2812
« Antwort #24 am: Dezember 05, 2014, 01:35:04 Vormittag »
Ja, das Timing ist wichtig! Die LEDs setzen die die Kommunikation zurück und übernehmen die Daten, wenn zwischendrin ein paar (6-7?) Mikrosekunden Pause sind. Im Datenblatt steht 50µs, aber in der Praxis schlägt der "Reset" schon nach viel kürzerer Zeit zu!
Das Einfachste ist hier wohl die Auswertung des "BF"-Flags (Buffer Full) im Statusregister der SPI-Schnittstelle. Denn SPI empfängt ja auch immer gleichzeitig ein Byte, während ein Byte gesendet wird, auch wenn's hier nicht benutzt wird. "BF" zeigt also an, daß 8 Bits komplett empfangen (und daher eben auch gesendet) wurden.

Offline Darkside

  • Newbie
  • *
  • Beiträge: 45
    • Profil anzeigen
Re: Programmierung WS2812
« Antwort #25 am: Dezember 05, 2014, 19:58:49 Nachmittag »
Danke.

Läuft jetzt ganz gut.
Hab hier 2 Streifen.
Der eine läuft, der andere spinnt rum. Leider ist mir dass zu spät aufgefallen, dass die Stützkondensatoren nicht ordentlich aufgelötet sind. Teilweise falsch angelötet, teilweise fehlen welche etc. . Dachte zuerst die LEDs könnten einen anderen Controller besitzen, dem ist aber nicht so. Meine habe auch irgendwo gelesen, dass die Kondensatoren sehr wichtig für den Controller sind. Deshalb denke ich, liegt es daran. Naja, weiss ich schon mal, wo ich sowas nicht mehr ordere, falls er die noch überhaupt verkauft. Naja, gut, dass ich hier noch den funktionierenden Streifen habe.
Irgendwie geht da alles schief, was da schief laufen kann.
Naja, wenigstens hatte ich ein Analoges Oszilloskop mal vor paar Wochen geschenkt bekommen, sonst würde noch immer nichts laufen. Ohne vernünftiges Speicheroszilloskop werden aber solche Sachen mit Timings wirklich unrealisierbar.
Jetzt würde noch eine elegante Lösung fehlen, die Daten über ein Interrupt nachschiebt und in der Zwischenzeit sich um andere Operationen kümmert...
Die momentane Lösung ist da sehr einfach gehalten. Es werden 8Bit zum SPI geschoben und gewartet, bis diese gesendet wurden, um die nächsten ins SPI zu schieben.

Hier mal der Code für den PIC16F1719:

#include <stdio.h>
#include <stdlib.h>
#include <htc.h>
#include <xc.h>
#define _XTAL_FREQ 32000000                  // Fosc  frequency for _delay()  library

// CONFIG1
#pragma config FOSC = INTOSC    // Oscillator Selection Bits (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = ON       // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
#pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config BOREN = OFF      // Brown-out Reset Enable (Brown-out Reset disabled)
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON        // Internal/External Switchover Mode (Internal/External Switchover Mode is enabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)

// CONFIG2
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
#pragma config PPS1WAY = ON     // Peripheral Pin Select one-way control (The PPSLOCK bit cannot be cleared once it is set by software)
#pragma config ZCDDIS = ON      // Zero-cross detect disable (Zero-cross detect circuit is disabled at POR and can be enabled with ZCDSEN bit.)
#pragma config PLLEN = ON       // Phase Lock Loop enable (4x PLL is always enabled)
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LPBOR = OFF      // Low-Power Brown Out Reset (Low-Power BOR is disabled)
#pragma config LVP = OFF         // Low-Voltage Programming Enable (Low-voltage programming enabled)

void WS2811_Init(void)
{
OSCCON=0b11111001;      //Internal Clock, 8Mhz 4xPLL

// (SPI SDO & SPI CLK) || (nSPI SDO & SPI CLK & PWM1) all over CLC1

   CLC1GLS0  = 0x02;
   CLC1GLS1  = 0x08;
   CLC1GLS2  = 0x14;
   CLC1GLS3  = 0x01;
   CLC1SEL0  = 0x11;
   CLC1SEL1  = 0x10;
   CLC1SEL2  = 0x0E;
   CLC1SEL3  = 0x00;
   CLC1POL   = 0x04;
   CLC1CON   = 0x80;
   CLCIN0PPS = 0x08;
   CLCIN1PPS = 0x08;
   CLCIN2PPS = 0x00;
   CLCIN3PPS = 0x00;


// Adjust Timer2 period for desired baud rate
// One bit period is two Timer2 periods
T2CON = 0x04;
PR2 = 5;

// Adjust PWM3 duty cycle for desired "0" data-bit duty cycle
// 1 data-bit duty cycle is automatically 50%

PWM3CON = 0xE0;
PWM3DCH = 2;
PWM3DCL = 0;

SSP1CON1 = 0x23;        //SPI Config
TRISA = 0x00;               //Port A output
TRISB = 0x00;               //Port B output
RA1PPS = 0x04;              //WS281x outputpin
RB0PPS = 0b00010001;        //SPI clock Output for development
RB1PPS = 0b00010000;        //SPI data Output for development
RB2PPS = 0b00001110;        //PWM3 Output for development
}

int main(int argc, char** argv) {
WS2811_Init();

while(1)
   {
        SSPBUF=0x00;
        while(!PIR1bits.SSP1IF) {};
        PIR1bits.SSP1IF=0;
        //_delay(9);
        SSPBUF=0x30;
        while(!PIR1bits.SSP1IF) {};
        PIR1bits.SSP1IF=0;
        //_delay(9);
        SSPBUF=0x00;
        while(!PIR1bits.SSP1IF) {};
        PIR1bits.SSP1IF=0;
_delay(19);             //longer Delay, shows end to WS281x
 }
return (EXIT_SUCCESS);
}

picalic

  • Gast
Re: Programmierung WS2812
« Antwort #26 am: Dezember 08, 2014, 01:57:15 Vormittag »
Meine habe auch irgendwo gelesen, dass die Kondensatoren sehr wichtig für den Controller sind. Deshalb denke ich, liegt es daran.
Eine saubere Versorgungsspannung (u.a.durch Stützkondis) ist eigentlich allgemein bei jeder Digitalschaltung für eine zuverlässige Funktion wichtig.
Zitat
Jetzt würde noch eine elegante Lösung fehlen, die Daten über ein Interrupt nachschiebt und in der Zwischenzeit sich um andere Operationen kümmert...
Da gibt es diverse Ansätze, ja nach Anwendung:
- Pixelspeicher im RAM, der von der ISR regelmäßig an die LEDs gesendet wird. Vorteil: Das Hauptprogramm kann in aller Ruhe und in beliebiger Reihenfolge LED-Daten ändern. Nachteil: max.Anzahl der LEDs hängt von der vorhandenen RAM-Größe ab.
- Pixelspeicher im ROM: geht i.A. für mehr LEDs, da mehr ROM als RAM da ist, aber Daten sind halt statisch, evtl. verschiedene "Bilder"?
- Ringpuffer(FIFO): kleiner Puffer für beliebig viele LEDs, Programm kann etwas unregelmäßig Daten zur Verfügung stellen, solange die Reihenfolge und die mittlere Datenmenge pro Zeit, die das Hauptprogramm liefert, passt.   
- RGB-Daten direkt in der ISR errechnen: geht nur, wenn die Zeit in der ISR zur Berechnung der Pixeldaten ausreicht.   

Für optimales Timing müsste das nächste, zu sendende Byte sofort am Anfang der ISR zur Verfügung stehen, denn da der SPI-Port leider keinen Hardware-Puffer hat, wird der Interrupt erst nach dem fertigen Senden des aktuellen Bytes ausgelöst, und bis das nächste Byte dann per ISR im TX-Register steht, herrscht erstmal Sendepause! Ich würde evtl. direkt am Anfang der ISR das zu sendende Byte aus einer Variablen holen und ausgeben (geht am schnellsten) und dann das nächste Byte aus dem FIFO holen oder berechnen lassen und für den nächsten IRQ in die Variable schreiben.

Offline Darkside

  • Newbie
  • *
  • Beiträge: 45
    • Profil anzeigen
Re: Programmierung WS2812
« Antwort #27 am: Dezember 08, 2014, 21:09:55 Nachmittag »
Hm,

das mit dem anderen LED-Streifen will irgendwie nicht. Auch wenn die Kondensatoren wie aufgestreut aussehen, erfüllen sie ihren Zweck, soweit vorhanden, da sie an "+" und "-" liegen. Entweder ist da wirklich ein anderer Controller verbaut, auch wenn es der WS2812 sein soll oder die haben einen Hau weg. Irgendwie verhält sich der Streifen komisch und anders, wie der andere, der sich normal verhält. Naja, wird ein Projekt für die Zukunft, bzw. wenn man mit den LEDs einen konkreten Anwendungsfall hat. Schade und ärgerlich, aber geht momentan nicht anders. Hab da schon etwas Zeit verschwendet.

Ja, das wird noch richtig Arbeit, dementsprechend Farbmuster zu berechnen/ändern.

Wie sieht es denn aus, wenn man z.B. Farbmuster in ein serial eeprom speichern möchte, um diese dann auszulesen um definierte Farbmuster auszugeben?
Spi ist ja quasi belegt. Müsste man also z.B. abstellen, dass die Signale richtig für die LEDs ausgegeben werden, das serial eeprom aktivieren und Daten lesen...

Hm, man könnte den Eindruck bekommen, es sei vorteilhafter USART statt SPI für die LED-Ansteuerung zu verwenden.

Offline Darkside

  • Newbie
  • *
  • Beiträge: 45
    • Profil anzeigen
Re: Programmierung WS2812
« Antwort #28 am: Dezember 21, 2014, 21:55:13 Nachmittag »
Hi,

bin mal wieder dazu gekommen etwas zu machen und da auch etwas weitergekommen.
Ist alles etwas heikel, da nach dem Interrupt der SPI direkt Daten nachgeschoben braucht.
Auch dies ist heikel.
Aber mittlerweile hat dies auch geklappt.
Jetzt würden noch Funktionen fehlen, die dem ganzen Leben einhauchen und entsprechend Farbmuster berechnen o.ä..
Wenigstens klappt soweit schon die Anzeige unter C.

picalic

  • Gast
Re: Programmierung WS2812
« Antwort #29 am: Dezember 22, 2014, 12:21:59 Nachmittag »
Servus,

Hi,

bin mal wieder dazu gekommen etwas zu machen und da auch etwas weitergekommen.
Ist alles etwas heikel, da nach dem Interrupt der SPI direkt Daten nachgeschoben braucht.
Auch dies ist heikel.
Aber mittlerweile hat dies auch geklappt.

Wäre doch auch langweilig, wenn man nichts zum Tüfteln hätte... ;)
Bei meinem Controller wird ja der Interrupt nicht vom SPI, sondern per Timer ausgelöst, so komme ich bei maximaler Ausgabegeschwindigkeit (800kBd) auf nur 0,5µs zuviel "Pause" zwischen den Bytes, und das auch nur, weil der SPI einfach nicht schneller kann.
Inzwischen kann ich bei meinem Code per #define auch niedrigere Bitraten einstellen, um ggf. mehr Zeit für komplexere Berechnungen zu haben. Und habe eine 8x8 Bit Multiplikation (mit 8 Bit Ergebnis) in nur 16 Befehls-Zyklen hinbekommen! (kann man z.B. für eine Modulation der Helligkeit benutzen).


 


* Recent Topics