Hier geht es um Zeiten von 350ns für ein 0-Bit bzw. 700ns für ein 1-Bit. Da geht auf den üblichen µC mit Timern gar nichts. Auch die üblichen HW-PWMs kriegen einen 800kHz PWM-Takt nicht hin. Auf einem PIC16 mit 8MHz Befehlstakt hab ich das so gelöst:
Ich bin hier davon ausgegangen, daß, wie im Link oben gesagt, die Low-Zeit des Signals nicht so wichtig ist. Bisher hat das auch mit allen meinen WS geklappt. Das Ganze muß mit gesperrten Interrupten laufen. Entsprechendes sollte man auf jedem µC hinkriegen. Für viele Pixel mit hoher Framerate taugt das natürlich nicht, aber 4 mal für drei Pixel wird das kein Problem sein.Code:#define NEOPIX LATCbits.LATC4 void SetPIX(uint8_t red, uint8_t green, uint8_t blue) { uint8_t colorbit; for (colorbit = 8; colorbit; colorbit--) { if (green & 0x80) { NEOPIX = 1; NEOPIX = 1; NEOPIX = 1; NEOPIX = 1; } else { NEOPIX = 1; NEOPIX = 1; NEOPIX = 0; // ! NEOPIX = 0; // ! } NEOPIX = 0; green <<= 1; } for (colorbit = 8; colorbit; colorbit--) { if (red & 0x80) { NEOPIX = 1; NEOPIX = 1; NEOPIX = 1; NEOPIX = 1; } else { NEOPIX = 1; NEOPIX = 1; NEOPIX = 0; NEOPIX = 0; } NEOPIX = 0; red <<= 1; } for (colorbit = 8; colorbit; colorbit--) { if (blue & 0x80) { NEOPIX = 1; NEOPIX = 1; NEOPIX = 1; NEOPIX = 1; } else { NEOPIX = 1; NEOPIX = 1; NEOPIX = 0; NEOPIX = 0; } NEOPIX = 0; blue <<= 1; } }
MfG Klebwax
Lesezeichen