Hallo,
ich habe gerade ein Problem mit dem Attiny841 und der LIGHT_WS2812 Libary. Vorweg, auf dem Atmega328P ging das ganze ohne Probleme.
Der Atmega328P war ein ProMini mit 16MHz. Der Attiny841 hingegen läuft mit internem Takt bei 8MHz. (Fuses und Symbol F_CPU=8000000UL sind gesetzt).
/*
* tiny841_ws2812b.c
*
* Created: 03.12.2015 22:42:09
* Author : sschultewolter
*/
#include <avr/io.h>
#include <util/delay.h>
#include "ws2812.h"
#define GROUP_LEDS
#define NUM_LEDS 8
#define NUM_GROUP 9 // Number of consecutive LEDs with the same value
struct cRGB rgb[NUM_LEDS];
int main(void)
{
while (1)
{
for(uint8_t i = 0; i < NUM_LEDS; i++)
{
// unset last LED
if(i == 0) rgb[NUM_LEDS-1].r = 0;
else rgb[i-1].r = 0;
// Set new LED
rgb[i].r = 255;
#ifdef GROUP_LEDS
ws2812_setleds_group(rgb, NUM_LEDS, NUM_GROUP);
#else
ws2812_setleds(rgb, NUM_LEDS);
#endif
_delay_ms(500);
}
}
}
Die Libary ist von hier light_ws2812/light_ws2812_AVR/Light_WS2812 at master · cpldcpu/light_ws2812 · GitHub
Hier habe ich lediglich folgende Funktionen ergänzt,
void inline ws2812_setleds_group(struct cRGB *rgb, uint16_t numLeds, uint16_t group)
{
ws2812_setleds_group_pin(rgb, numLeds, group, (1<<ws2812_pin));
}
void inline ws2812_setleds_group_pin(struct cRGB *rgb, uint16_t numLeds, uint16_t group, uint8_t pinmask)
{
ws2812_DDRREG |= pinmask; // Enable DDR
for(uint8_t i = 0; i < numLeds; i++)
{
for(uint8_t groupLed = 0; groupLed < group; groupLed++)
ws2812_sendarray_mask((uint8_t*)rgb, 3, pinmask);
}
// wait 50µs between two ws2812_setleds
_delay_us(50);
}
Setze ich jede Led einzeln, ist das kein Problem, es läuft von 0 bis NUM_LED-1 durch. Sobald der group-Befehl kommt, spielen die Leds verrückt. Jemand eine Idee?
Das struct zu vergrößern ist nicht erwünscht. Jeweils 9 Leds sollen die gleichen Werte erhalten. Diese sind programmtechnisch zusammengeschaltet, um die Helligkeit deutlich nach oben zu setzen.
Gruß Stefan