From a311062ba6b17483f1470c8f5e7994f62a4c1f57 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Sun, 24 Mar 2024 13:50:38 +0100 Subject: [PATCH] More experiments with neopixel square --- test-neopixel-square/main.c | 308 +++--------------------------------- 1 file changed, 23 insertions(+), 285 deletions(-) diff --git a/test-neopixel-square/main.c b/test-neopixel-square/main.c index fdfe0ab..3aefaf4 100644 --- a/test-neopixel-square/main.c +++ b/test-neopixel-square/main.c @@ -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); } -- 2.39.2