
Сообщение от
kblc
Приветствую! Собрал себе комплектик с ws2801, все хорошо, только цвета в ленте перепутаны, красный с синим. Тестовый код из первого сообщения подправил, мигает правильно теперь. Получается у меня не RGB, а BGR? Не могли бы вы выложить для моих цветов программу?
Мой правильно работающий отрывок кода:
Код:
SPI.transfer(pixel[i].b);
SPI.transfer(pixel[i].g);
SPI.transfer(pixel[i].r);
Доработал скетч для ардуинки таким образом:
PHP код:
#include <CyberLib.h>
unsigned long nTime, rTime, t;
void setup()
{
UART_Init(115200);
StartSPI(0, 8, 1);//MODE0, DIV8, MSBFIRST
for(int16_t z=0; z<768; z++) SendSPI(0); //погасить все пикселы ленты
delay_ms(1); //пауза для инициализации ленты
}
uint8_t mas_data[3];
uint8_t j=0;
void loop()
{ Start
uint8_t data;
t = millis(); //получаем текущее время
UART_SendByte(170); //отправляем байт синхронизации для ПК
if (UART_ReadByte(data)) //ждем от ПК первый байт с колличеством пикселей ленты
{
uint16_t pix_num = data*3; //получаем общее колличество цветовых каналов ленты
uint16_t eTime = micros()-rTime; //получим время с момента окончания загрузки
if( eTime < 900) delay_us(eTime); //ждем полной инициализации (минус 100мкс для загрузки след. байта)
for(uint16_t i=0; i<pix_num; i++)
{
//получаем значения для всех цветов, а затем отсылаем на ленту в нужном нам порядке
if(j==2)
{
mas_data[j]=uart_read();
SendSPI(mas_data[0]); //Синий
SendSPI(mas_data[2]); //Зелёный
SendSPI(mas_data[1]); //Красный
j=0;
}
else
{
mas_data[j]=uart_read();
j++;
}
}
rTime = micros(); //стартуем счетчик времени инициализации ленты
nTime = t; // //обнулить время простоя
} else {
if((t - nTime) > 4000) ///гасим подсветку если нет потока более 2 сек
{
for(int16_t z=0; z<768; z++) SendSPI(0); //погасить все пикселы ленты
nTime = t;
}
}
End }
//***************************************************************************
unsigned char uart_read(void)
{
uint8_t val;
for (uint8_t i=0; i<255; ++i) //цикл ожидания байта данных из UART порта, время ожидания 2560мкс
{
if(UART_ReadByte(val)) break; //если байт данных получен, то цикл прерывается
delay_us(10); //время ожидания байта
}
return val;
}
Использовать на компе в таком случае надо версию на BRG из второго поста темы.