/*** Neopixels ***/
#define NPIX_PERIOD 90 // timer runs on 72 MHz, so 90 periods = 1250 ns
+#define NPIX_RESET 128 // the chip needs longer reset pulse than documented
+#define NPIX_NUM_LEDS 64
#define B0 30
#define B1 60
-byte neopixel_buf[] = {
- // 128 cycles low: reset (has to be longer than in the datasheet)
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-
- // G7 G6 G5 G4 G3 G2 G1 G0
- // R7 R6 R5 R4 R3 R2 R1 R0
- // B7 B6 B5 B4 B3 B2 B1 B0
-
- B0, B0, B0, B0, B1, B1, B1, B1,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B1, B1, B1, B1,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B1, B1, B1, B1,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B1, B1, B1, B1,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B1, B1, B1, B1,
-
- B0, B0, B0, B0, B1, B1, B1, B1,
- B0, B0, B0, B0, B1, B1, B1, B1,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B1, B1, B1, B1,
- B0, B0, B0, B0, B1, B1, B1, B1,
-
- B0, B0, B0, B0, B1, B1, B1, B1,
- B0, B0, B0, B0, B1, B1, B1, B1,
- B0, B0, B0, B0, B1, B1, B1, B1,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B1, B1, B1, B1,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B1, B1, B1, B1,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B1, B1, B1, B1,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B1, B1, B1, B1,
-
- B0, B0, B0, B0, B1, B1, B1, B1,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
+byte neopixel_buf[NPIX_RESET + 24*NPIX_NUM_LEDS];
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
-
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
- B0, B0, B0, B0, B0, B0, B0, B0,
+static void neopixel_set(uint led, byte r, byte g, byte b)
+{
+ byte *buf = &neopixel_buf[NPIX_RESET + 24*led];
+
+ for (uint m=0x80; m; m >>= 1)
+ *buf++ = (g & m) ? B1 : B0;
+ for (uint m=0x80; m; m >>= 1)
+ *buf++ = (r & m) ? B1 : B0;
+ for (uint m=0x80; m; m >>= 1)
+ *buf++ = (b & m) ? B1 : B0;
+}
- B0, B0, B0, B0, B1, B1, B1, B1,
- B0, B0, B0, B0, B1, B1, B1, B1,
- B0, B0, B0, B0, B1, B1, B1, B1,
-};
static void neopixel_init(void)
{
+ for (uint i=0; i < NPIX_NUM_LEDS; i++)
+ neopixel_set(i, 7, 7, 7);
+
// TIM4 update is connected to DMA1 channel 7
// FIXME: Strange programming sequence as specified in manual
debug_printf("Hello, world!\n");
-#if 0
- for (int i=0; i<24*64; i++)
- neopixel_buf[128+i] = B1;
-#endif
+ uint i=63;
for (;;) {
// wait_for_interrupt();
debug_led(1);
- for (int i=4; i<8; i++)
- neopixel_buf[128+24*63+i] = B1;
+ // neopixel_set(NPIX_NUM_LEDS-1, 0, 0x7f, 0);
+ neopixel_set(i, 0, 0, 7);
+ i = (i+1) % 64;
+ neopixel_set(i, 0, 63, 0);
delay_ms(100);
debug_led(0);
- for (int i=4; i<8; i++)
- neopixel_buf[128+24*63+i] = B0;
+ // neopixel_set(NPIX_NUM_LEDS-1, 0, 0, 0x7f);
delay_ms(500);
}