Hey … some months ago I wanted to run some WS2811 pixels with an ATMEGA 328 at 3V3, 8MHz but FastSPI_LED2 at first didn’t want me to. I got some warnings (“no enough clock cycles available for”) and the sketch didn’t compile.
I investigated and figured out matching timing-parameters to run WS2811-pixels configured for 400kHz (SlowMode via shorting pins 7 & 8 - normally they are configured for 800kHz). I enhanced FastSPI_LED2 accordingly and here comes the patch (against RC4):
— SNIP — 8< —
diff -rupN old/FastSPI_LED2/FastSPI_LED2.h new/FastSPI_LED2/FastSPI_LED2.h
— old/FastSPI_LED2/FastSPI_LED2.h 2013-10-08 10:14:40.000000000 +0200
+++ new/FastSPI_LED2/FastSPI_LED2.h 2013-10-21 18:01:00.000000000 +0200
@@-22,6 +22,7 @@ enum EClocklessChipsets {
TM1804,
TM1803,
WS2811,
- WS2811_400,
WS2812,
WS2812B,
NEOPIXEL,
@@-100,6 +101,7 @@ public:
case WS2812B:
case NEOPIXEL:
case WS2811: return addLeds(new WS2811Controller800Khz<DATA_PIN>(), data, nLedsOrOffset, nLedsIfOffset); -
}case WS2811_400: return addLeds(new WS2811Controller400Khz<DATA_PIN>(), data, nLedsOrOffset, nLedsIfOffset); }
@@-116,6 +118,7 @@ public:
case WS2812B:
case NEOPIXEL:
case WS2811: return addLeds(new WS2811Controller800Khz<DATA_PIN, RGB_ORDER>(), data, nLedsOrOffset, nLedsIfOffset);
-
}case WS2811_400: return addLeds(new WS2811Controller400Khz<DATA_PIN, RGB_ORDER>(), data, nLedsOrOffset, nLedsIfOffset); }
diff -rupN old/FastSPI_LED2/chipsets.h new/FastSPI_LED2/chipsets.h
— old/FastSPI_LED2/chipsets.h 2013-10-09 23:30:05.000000000 +0200
+++ new/FastSPI_LED2/chipsets.h 2013-10-21 17:55:04.000000000 +0200
@@-245,6 +245,15 @@ class WS2811Controller800Khz : public Cl
#warning “No enough clock cycles available for the UCS103”
#endif
+// WS2811_400 - 640ns, 640ns, 1100ns
+template <uint8_t DATA_PIN, EOrder RGB_ORDER = RGB>
+class WS2811Controller400Mhz : public ClocklessController<DATA_PIN, NS(640), NS(640), NS(1100), RGB_ORDER> {};
+template <uint8_t DATA_PIN, EOrder RGB_ORDER = RGB>
+class WS2811Controller400Khz : public ClocklessController<DATA_PIN, NS(640), NS(640), NS(1100), RGB_ORDER> {};
+#if NO_TIME(640, 640, 1100)
+#warning “Not enough clock cycles available for the WS2811 at 400 kHz”
+#endif
+
// 750NS, 750NS, 750NS
template <uint8_t DATA_PIN, EOrder RGB_ORDER = RGB>
class TM1803Controller400Khz : public ClocklessController<DATA_PIN, NS(750), NS(750), NS(750), RGB_ORDER> {};
— SNAP — >8 —
