]> mj.ucw.cz Git - home-hw.git/commitdiff
More experiments with neopixel square
authorMartin Mares <mj@ucw.cz>
Sun, 24 Mar 2024 12:50:38 +0000 (13:50 +0100)
committerMartin Mares <mj@ucw.cz>
Sun, 24 Mar 2024 12:50:38 +0000 (13:50 +0100)
test-neopixel-square/main.c

index fdfe0abdf76666991a0a96895ea6ca919922c892..3aefaf4f9f55398a3023eb2c059b51300e3258dd 100644 (file)
@@ -91,291 +91,31 @@ static void delay_ms(uint ms)
 /*** 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
@@ -426,20 +166,18 @@ int main(void)
 
        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);
        }