Eso es correcto no utilizo el pwm, es un poco difícil de explicar pero voy a resumir, yo utilizo un micro para poder procesar los datos DMX,asignar dirección etc. etc.
veras el controlador toma un máximo de 24 canales para obtener hasta 8 salidas.
La forma de generar el pwm de los leds es con un cpld,entonces lo que mi micro hace es procesar y enviar hasta 24 bytes a un cpld.
Lo que necesito es hacer el efecto rainbow pero desde "software".
Yo hice una tabla que es la siguiente:
// Tabla para generar efecto rainbow / / / / / / /
const unsigned char RAIN[8][24] = {{0xff,0x00,0x00,0xff,0x80,0x00,0x80,0xff,0x00,0x00,0xff,0x00,0x00,0x80,0xff,0x00,0x00,0xff,0x80,0x00,0xff,0xff,0x00,0xff},
{0xff,0x00,0xff,0xff,0x00,0x00,0xff,0x80,0x00,0x80,0xff,0x00,0x00,0xff,0x00,0x00,0x80,0xff,0x00,0x00,0xff,0x80,0x00,0xff},
{0x80,0x00,0xff,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0x80,0x00,0x80,0xff,0x00,0x00,0xff,0x00,0x00,0x80,0xff,0x00,0x00,0xff},
{0x00,0x00,0xff,0x80,0x00,0xff,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0x80,0x00,0x80,0xff,0x00,0x00,0xff,0x00,0x00,0x80,0xff},
{0x00,0x80,0xff,0x00,0x00,0xff,0x80,0x00,0xff,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0x80,0x00,0x80,0xff,0x00,0x00,0xff,0x00},
{0x00,0xff,0x00,0x00,0x80,0xff,0x00,0x00,0xff,0x80,0x00,0xff,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0x80,0x00,0x80,0xff,0x00},
{0x80,0xff,0x00,0x00,0xff,0x00,0x00,0x80,0xff,0x00,0x00,0xff,0x80,0x00,0xff,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0x80,0x00},
{0xff,0x80,0x00,0x80,0xff,0x00,0x00,0xff,0x00,0x00,0x80,0xff,0x00,0x00,0xff,0x80,0x00,0xff,0xff,0x00,0xff,0xff,0x00,0x00}};
La funcion realiza lo siguiente:
// Efecto rainbow en las 8 salidas
void Rainbow (unsigned char vel,unsigned char bri,unsigned char Sen)
{
unsigned char a,b;
static unsigned int Time,Comp;
static unsigned char Paso;
static unsigned char Brillo = 255;
static bit Toggle;
if (vel > 200) // Genera algoritmo de tiempo?
Comp = ((int)vel*4); // Multiplica y obtiene hasta 1 segundo de retardo
else
Comp = vel; // En caso contrario toma el valor actual
Time ++; // Contador de tiempo activo
if (Time >= Comp) // Cumple tiempo de seleccion
{
Time = 0;
for (a = 0;a <= 23;a ++)
RGB[a] = RAIN[Paso][a]; // Genera color rainbow
Paso ++;
if (Paso > 7)
Paso = 0;
Colores (24); // Envia informacion a cpld
}
}
Cada que cumple el retardo requerido entonces se incrementa el indice paso y se obtiene un nuevo valor en los 24 bytes es decir, el desplazamiento del color pero ahora requiero
por el momento los cambios son inmediatos es decir no se ve esa suavidad entre colores.
ya estuve analizando y parece que cada color se va degradando y a su vez empieza a tomar el color anterior y así sucesivamente.
esa es la parte que me interesa resolver
Gracias