Así que estoy tratando de ejecutar algunos SK6812 (clones WS2812) en un ATMega328p independiente.
¡La señal de salida es demasiado lenta! Defino F_CPU como 8000000 (8Mhz), tanto en el código como en los símbolos de Atmel Studio, pero mi señal es lenta por un factor de 10. El LED siempre es blanco, en lugar de rojo como pretende el código.
#ifndef F_CPU
#define F_CPU 8000000UL // 8 MHz clock speed
#endif
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include "light_ws2812.h"
struct cRGB led[1];
int main(void)
{
while(1)
{
led[0].r=25;led[0].g=00;led[0].b=0; // Write red to array
ws2812_setleds(led,1);
_delay_ms(500); // wait for 500ms.
//led[0].r=0;led[0].g=25;led[0].b=0; // green
//ws2812_setleds(led,1);
//_delay_ms(500);
//led[0].r=0;led[0].g=00;led[0].b=25; // blue
//ws2812_setleds(led,1);
//_delay_ms(500);
}
}
Los fusibles son l:0xA2, h:0xD9, e:0x07 . Esto debería corresponder a un reloj interno de 8Mhz (verificado en B0 con osciloscopio). Esto es lo que obtengo para una señal de datos en B4:
Los datos se ven bien (00000000 para verde, luego 00011001 (25d) para rojo). Sin embargo, el período es de unos 12 µs, pero según la hoja de datos SK6812, el período debe ser de 1,25 µs ± 150 ns:
No hay mucho que mostrar en el esquema, pero para ser exhaustivo:
Y como dije antes, el encabezado previsto para los datos (D6) no generó nada, así que tuve que usar B4 ya que también se dividió en un encabezado. (Problema de conectividad, lo descubrí)
¡Cualquier ayuda es apreciada!
En Atmel Studio, hacer un
#define F_CPU 8000000UL
al principio main.c
no fue suficiente. Me deshice de ese código y creé un símbolo definido
F_CPU=8000000UL
en
Cadena de herramientas>Compilador AVR/GNU C>Símbolos.
Todavía no estoy seguro de por qué definir F_CPU
antes incluso de llamar a las bibliotecas fue erróneo; incluso util/delay lanzó algunas advertencias a veces (si tuviera F_CPU
un símbolo Indefinido, creo).
#define A B
significa "De ahora en adelante, reemplace cualquier A por B en el siguiente código". Dado que #include foo
significa "Pegar el contenido del archivo foo aquí", a define
también es válido en los archivos incluidos después, y defines
los archivos incluidos dentro son válidos en el archivo actual debajo de la include
directiva.
broma
Orotavia
Janka
Orotavia
M2C8
Pedro Smith