Zitat Zitat von Gnom67 Beitrag anzeigen
In der Tat natürlich naheliegend, die Pulsbreite vom PWM machen zu lassen, statt sich ein zweites Timersignal für die zweite Flanke aufzuhalsen.
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:

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;
    }
}
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.

MfG Klebwax