В Китае приобрел ленту на светодиодах ws2812b. Подключил ее через SPI к Atmega8. К Atmege8 также подключил кварц на 10 Мгц (фьюзы выставил), чтобы выставить частоту работы SPI - 2,5 Мгц. На такой частоте один бит передается за 0,4 us (микросекунды). Все интервалы для ws2812b получаются верными.
Что имеем:
- В ленте 36 светодиодов.
- Питание ленты и МК от компьютерного БП 5V 20А
- Собрано все на макетной плате.
В основном цикле написал простую программу
while (1)
{
for(i=1; i<=108; i++) //передаем по SPI один байт для каждого светодиода 3(RGB) x 36(LED) = 108
{
SPDR=0b10010010; // 100 три этих бита передают лог. 0 на ws2812b
while(!(SPSR & (1<<SPIF)));
SPDR=0b01001001;
while(!(SPSR & (1<<SPIF)));
SPDR=0b00100100;
while(!(SPSR & (1<<SPIF)));
}
delay_ms (300); // завершаем передачу паузой >50us, и все светодиоды должны потухнуть
for(i=1; i<=99; i++) // снова начинаем передавать данные
{
SPDR=0b11011011; // последовательность 110 = лог. 1 для ws2812b
while(!(SPSR & (1<<SPIF)));
SPDR=0b01101101;
while(!(SPSR & (1<<SPIF)));
SPDR=0b10110110;
while(!(SPSR & (1<<SPIF)));
}
delay_ms (300); // завершаем передачу паузой >50us, и все светодиоды должны гореть белым
}
}
В итоге все работает не так(( Светодиоды светятся бледным розоватым цветом 300 миллисекунд, а потом вспыхивают ярким белым на 300 миллисекунд. Первый светодиод (не важно к какому именно подключать MOSI) не реагирует вообще (либо просто горит либо просто не горит) В чем может быть проблема.
Прикладываю фото, видео, даташит и файл с прошивкой (все по ссылке на Яндекс диске). Очень рассчитываю на вашу помощь)
https://yadi.sk/d/q4UJD3P3wXyYv