Estoy tratando de controlar algunas tiras de LED WS2812 5050 RGB desde un microcontrolador. He jugado con éxito con la biblioteca Adafruit Neopixel y he escrito un código en un PIC18F2455 en el que también he empezado a trabajar para algunas cosas simples (cambian progresivamente de color de rojo a verde, y de nuevo, etc.). p>
Sin embargo, todo eso fue para una sola cadena. Idealmente, ya que estoy usando PORTB en el PIC micro, sería genial usar los 8 bits para manejar hasta 8 cadenas desde un chip.
Sí, sé que me estoy volviendo codicioso :)
Mi pregunta es, qué enfoque recomendaría tomar, dado que a lo sumo tengo el tiempo necesario para enviar un 1 o un 0 en cualquier canal individual; algunos ciclos de instrucción y el protocolo de señalización no es estándar de 1 cable. escriba el protocolo para que el PIC no tenga un periférico dedicado para descargar el trabajo (enviar un 1 implica 'escribir 1, nop, escribir 0' y enviar un 0 implica 'escribir 1, escribir 0, nop').
Además, es probable que solo haya como máximo cien ciclos de instrucción entre el final de un bit al comienzo del siguiente antes de que llegue al "código final" de los 50us y todo lo que ha estado escribiendo se engancha a los LED y al el protocolo de datos vuelve a esperar al primer bit de nuevo.
Para una sola cadena, acabo de tomar los tres bytes para verde, rojo y azul (ese es el orden en que se usan estas cosas) y hacer 24 "si (verde y 0x80) write1 (); else write0 () " declaraciones etc. Pero claramente ese mismo enfoque no funcionará para 8 bits a la vez.
Algunas opciones que consideré:
-
Calcular un byte basado en el primer bit del valor verde, luego usar un ensamblaje cuidadosamente diseñado para (a) escribir 0xff en el puerto, (b) escribir el byte calculado en el puerto, y luego (c) escribe un 0x00 en el puerto. Enjuague y repita 23 veces más para el primer LED en cada una de las 8 cadenas, luego repítalo nuevamente por el tiempo que demore la salida de toda la cadena. El único problema es que la computación toma una buena cantidad de ciclos y es muy posible que demore tanto que termine interfiriendo con su salida.
-
En lugar de almacenar cada uno de los datos de la cadena de led como una matriz de valores de bytes GRB y luego calcularlos en el tiempo de salida, almacénelos como una matriz de bits "manchada" (por ejemplo, los datos del LED 1 de la primera cadena se almacenan en 24 bytes de memoria en el primer bit de cada byte, la segunda cadena en el segundo bit de cada byte, etc. La ventaja es que la salida es fácil y rápida, la desventaja es que la carga de trabajo se transfiere a la parte de creación del proceso y ahora necesita funciones para obtener o establecer valores individuales.
¿Pensamientos? ¿Alguien tiene alguna razón por la que harías o no harías algo de lo anterior? ¿Alguien sabe de algún truco inteligente para "voltear" rápidamente una matriz de 8 bytes para que el byte 1 se convierta en el primer bit de los 8 bytes en el resultado? :)