Здравствуйте, друзья. Возникла необходимость создания светодиодного
RGBW диммера/стробоскопа, управляемого по протоколу DMX. Светодиоды
управляются с аппаратного шИМа. В ATTINY2313 их как раз 4 канала. С ШИМом
разобрался, вопросов нет. А вот как правильно принять DMX сигнал пока не
понятно. Дня 4 весь интернет перерыл, нигде нет какого-либо практического совета,
как принять DMX пакет. Все на форумах пишут типа "все давно известно и просто,
поищи в интернет, найде массу устройств, алгоритмов, готовых кодов и т.п.", либо
везде стоит одна и та же ссылка на сайт с описанием самого протокала. Находились
некоторые буржуйские проекты, но код ихний не работает, а то и вовсе ошибочный
(может специально ). На физическом уровне - MAX485, подключен на вход USART
приемника, сам приемник настраиваем на асинхронный режим 250кГЦ, 8-ми битные
данные, кварц 16МГц:
UCSRA=0x00;
UCSRB=0x90;
//UCSRB = 0x94; 9-ти битный формат
UCSRC=0x0E; //UCSRC = 0x8e; // 8 data bits, 2 stop bits
UBRRH=0x00; //здесь задаем скорость
UBRRL=0x03; //250Кбод
К приемнику подключена китайская коробочка USB-DMX (определяется как uDMX),
софт Freestyler. C коробочкой и софтом опробован лазер и аналогичный RGB декодер,
китайского производста, все нормально работает.
Далее во многих чужих кодах проверяется флаг FE (ошибка стоп-бита), регистра
UCSRA, это будет сигналом BREAK в DMX. Если ошибка была, значит ждем, что
следующий байт придет нулевым, это стартовый байт. Если так, то следующие
512 байт (или меньше) байты данных о состоянии внутренних каналах устройства,
фиксируем их начиная со стартового адреса. Для простоты, начинаем с 1 адреса брать.
Вот так на Си выглядит (работаю в CodeVisionAvr):
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
status = UCSRA; //считываем состояние регистра USART
data = UDR; //и пришедший байт
//сначала надо получить метку пакета данных
if (status&0x10) //0x10 проверяем флаг ошибки стоп бита FE
{
dmx_state = 1;
// UCSRA=0x20;
return;
};
//получили BREAK, ждем первый нулевой байт
if (dmx_state == 1)
{
if (data == 0)
{
dmx_state = 2;
dmxcount=0;
return;
}
else
{
dmx_state=0;
};
};
//если метка получена, значит дальше идут данные о каналах
if (dmx_state==2)
{
++dmxcount;
if(dmxcount==0x01)
{ R=data;
};
if(dmxcount==0x02)
{ G=data;
};
if(dmxcount==0x03)
{ B=data;
};
};
}
Все вроде бы просто, и при отладке в AVRStudio тоже все просто и должно работать,
только в железе ни фига не работает. Пробовал разные уже варианты и кодов и алгоритмов,
либо приходит какая-то бяка, все моргает как хочет, и когда хочет, либо вообще ничего
не приходит, и все светодиоды молчат. На аппаратном уровне данные приходят, пробовал
просто выводить принятые байты на порт B и восемь светодиодов. Все моргает/бегает,
в том числе и при кручении ручек каналов во Freestyler. Пробовал в каждое условие
воткнуть команду зажечь 1-ый, 2-ой и т.д. светодиод, чтобы увидеть куда программа
заходит, а куда нет, т.к. нет никаких аппаратных отладчиков или логического
анализатора, чтобы увидеть DMX посылку в живую (буду щас искать у знакомых). Короче,
выяснилось, что программа не заходит в третье условие, где должен быть нулевой байт.
Т.е. FE срабатывает, а нулевой байт нет. Уже у меня закрались сомнения а есть ли он
вообще? Может его не шлет программа или коробочка USB-DMX. Но с другой стороны если
все регуляторы в софте стоят на ноль, значит должны прибежать нулевые байты, но и
этого не происходит. Либо я что-то делаю не так, либо я вообще ничего не понимаю в
DMX. Пробовал не проверять этот байт, и сразу вывести три полученных байта на уровень
яркости светодиодов. Все моргает как хочет, и при кручении одной ручки начинается
непонятная светомузыка на остальных каналах. И даже если не крутить, то все само
куда-то зажигается/гаснет.
Собвственно, вопрос: может кто-то практически работал с DMX приемниками и может
подсказать что не так? Как правильно принять посылку DMX?
Я не прошу готового кода, как часто видел на форумах, просто совет/алгоритм от
знающих людей...
Заранее благодарю всех откликнувшихся.
Страница 1 из 1
Приемник Dmx512 На Attiny - Как Принять Сигнал Dmx
Поделиться темой:
Страница 1 из 1