Estaba intentando iluminar WS2812B y funciona bien cuando se le da un código RGB similar a este (255, 145, 67). Pero cuando envío un código como (255, 67, 67) a este diodo, no se enciende. Del mismo modo, si deseo obtener un color blanco puro, no puedo enviar el código (255,255,255), sino que debo enviar (255,254,253) para que todos sean diferentes.
Esto no parece ser un problema de software para mí, pero aquí está el código del programa. Estoy usando ATmega328p mcu de Atmel a 8 MHz y el código se compila con el compilador avr-gcc. Agradecería cualquier sugerencia de cómo solucionar este problema!
#include <avr/io.h>
#include <util/delay.h>
#define DATA_PORT PORTD
#define DATA_PIN PD0
#define DATA_DDR DDRD
void fill_array(int* arr, int color)
{
for(int i = 0; i < 8; ++i)
arr[i] = color & (1 << (7 - i));
}
void set_color(int* arr, int red, int green, int blue)
{
fill_array(arr, green);
fill_array(&arr[8], red);
fill_array(&arr[16], blue);
}
int main(void)
{
int rgb_array[24];
set_color(rgb_array, 0,255,0);
DATA_DDR = (1 << DATA_PIN);
DATA_PORT &= ~(1 << DATA_PIN);
_delay_us(100);
for(int i = 0; i < 24; ++i)
if(rgb_array[i]){ //send one
//1 clock cycle is 0.125us
DATA_PORT = 1; __builtin_avr_delay_cycles(6); DATA_PORT = 0;
}
else{ //send zero
DATA_PORT = 1; __builtin_avr_delay_cycles(3); DATA_PORT = 0;
}
DATA_PORT &= ~(1 << DATA_PIN); //reset signal
}