Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
Нужна помощь программиста Atmel AVR за деньги - протокол DMX512 |
Программирование микроконтролеров,ремонт аудио/видео/бытовой техники,полезные устройства для дома,телефония, обсуждение статей журнала Радио |
|
Опции темы |
09.05.2013, 13:27 | #1 |
Форумец
Сообщений: 88
Регистрация: 29.08.2006
Не в сети |
Нужна помощь программиста Atmel AVR за деньги - протокол DMX512
В кратце: нужно помочь научиться правильно принимать на Си или АСМ байты информации по протоколу DMX512, естественно не бесплатно. МК - AVRTiny2313, кварц 16Мгц, микросхема интерфейса RS-485 - max485. Посылка DMX с софта Freestyler+USB-DMX китайская коробочка, со дня на день прийдет DMX пульт в "железе", можно будет и на нем потренироваться. Конечная цель проекта - светодиодный RGBW диммер/стробоскоп с ШИМ регулированием и управлением по DMX.
Более подробно. Протокл DMX предназначен для управления осветительными приборами в шоу-технике. Фактически это RS-485, работающий на 250кбод/сек, в котором передаются в друг за другом байты информации о 512 каналах уровнях яркости (или иного назначения, зависит от устройства) осветительных приборов (на практике в пакете может быть и меньше каналов). Т.е. каналу номер 1 соответсвует первый байт, соотвественно, устройство с адресом 1 принимает этот байт, а остальные каналы просто пропускает, если они не используются в устростве. Каналу 2 - второй байт и т.д. до 512 каналов или до конца пакета. Чтобы маркировать начало пакета используется специальный маркер BREAK - это сигнал логического 0 на входе приемника в течении минимум 88мкс (или более, максимум не определен), дальше идут 2 стоп-бита (8мкс), и один стартовый байт (44мкс), всегда равный 0. Это и есть начало посылки, дальше линейно идет пакет с байтами-каналами (все по 44мкс, всегда с 2-мя стоп-битами). Частота посыла пакетов о всех 512 каналах около 40Гц, при посыле меньшего кол-ва каналов, частота может быть больше. Собственно, как правильно выделить этот самый стартовый сигнал BREAK и есть задачка... Сейчас собрана макетка с Tiny2313 и max485, пытаюсь наладить не один день. В отладчике AVR Studio все вроде легко и просто, а в реальности в железе ничего не работает, либо не могу вообще выделить начало пакета, либо принимается какой-то мусор. Саму DMX посылку пробовал смотреть на осцилле, кое-как разглядел, действительно есть BREAK примерно 88мкс, и первый нулевой байт, дальше полезная информация идет. Все как положено. Более того, этот же софт, и преобразователь USB-DMX прекрасно работают с заводскими лазерами и аналогичным китайским RGBW DMX диммером (собран он на МК STC12C520AD). Т.к. программил Atmel'ы редко и только в радиолюбительских целях, а с UART вообще до этого не работал, прошу помощи в реализации приема DMX. Аппаратный ШИМ запустил, проверял на осцилле, все работает нормально, как раз 4 канала в tiny2313, осталось DMX сделать. Можно давать советы и алгоритмы здесь, конечным исходным кодом, готов поделиться, если совместно решим задачу. Готов приехать к вам с отладочной платой, буком с софтом, чтобы совместно решить задачу, можно у меня дома. Я думаю для людей работавших с UART это не составит большой проблемы и не займет более одного дня... Только не надо писать, поищи в интренете, все давно придумано. Я потратил не один день в поисках готового проекта по приему DMX сигнала. Их либо нет, либо исходники не дают, либо они есть (на буржуйских сайтах), но ни фига не работают (принимают такой же мусор, как у меня), а то и вовсе ошибочны при детальном рассмотрении. Складывается ощущение, что либо они намерено не дают правильные код, либо никогда не запускали его на железе, либо у меня что-то не так с МК... Зарнее благодарю. Свзяь - тема, ЛС. |
13.05.2013, 08:10 | #2 |
Форумец
Сообщений: 523
Регистрация: 08.02.2007
Возраст: 50
Не в сети |
Вываливайте кусок кода где Вы BREAK пытаетесь выделить, только от лишнего мусора почистите. Без этого едва-ли кто что сказать сможет. Телепаты в отпуске.
Вообще, сделайте отдельный проект на своем железе, который делает только одно - определяет BREAK в посылке и в случае обнаружения зажигает светодиод. Соответственно и вся переферия лишняя должна быть диактивирована чтобы никаких лишних прерываний. Заодно опишите словами логику по которой вы пытаетесь выделить этот самый BREAK. Глядишь и что-нибудь проясниться. |
13.05.2013, 20:02 | #3 |
Форумец
Сообщений: 88
Регистрация: 29.08.2006
Не в сети |
Да я имеено BREAK и пытаюсь выделить. Все лишнее отброшено. Код уже раз 30 менялся, но по сути так:
Настраиваем UART UCSRA=0x00; UCSRB=0x90; UCSRC=0x0E; UBRRH=0x00; //здесь задаем скорость UBRRL=0x03; //250Кбод Далее в обработчике прерывания по UART: // 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; 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; }; }; } Компиллятор CodeVision. Я уже грешу на компиллятор, может он не успевает обработать прерывание за 44мкс... Просто так не охота было вспоминать ассемблер, но видимо прийдется Щас закажу логический анализатор, хочу взять LOGIC-U PLUS: http://6-lab.com/ru/logicuplus.html. С ним будет на порядок веселей и проще, тогда точно разберусь. Просто есть желание самому написать программу, ибо разбираться досконально в чужих кодах для меня еще сложнее, кто там что понапридумывал не понятно. Один из таких кодов я прошивал в МК, ни фига не работает. Причем там и ШИМы были настроены как у меня, и кварц и МК такой же. Ловит всякий мусор, на всех каналах крутиш, что-то само по себе мерцает как хочет Я почему и прошу помощи у тех кто решил эту проблему, как лучше поступить? Реально ли отловить флагом FE сигнал BREAK? Если писать все же на ассемблере. Опять таки, должен, FE быть 1 все время пока идет пауза BREAK в посылке и станет ли он в 0 автоматом после приема первого же байта? Видел один из алгоритмов, где сначала проверяли вход Rx (PD0), и если там висит пауза длинной больше 88мкс, то после прихода 1 сразу запускаем приемник UART и такми образом UART должен сразу принять первый байт = 0, если успеет конечно, запуститься за 8 мкс (сигнал MAB). Пробовал на Си писать этот отлов BREAK. Паузу считал по содержимому регистру TCNT1, то есть вычислял разницу между начальным значением регистра счетчика в момент перехода из 1 в 0 и конечным при переходе из 0 в 1. Причем, цифры полученные в отладчике на железе не прокатывают (хотя кварц в отладчике такой же как и на плате), ни разу не сработал такой отлов. Уменьшил цифры, вроде срабатывает, но ничего внятного UART не принял. Я почему сомневаюсь по поводу FE: вот представьте, что сначала у нас лог. 1, потом сменился на 0 (пришла длинная пауза), UART начал через каждые 4 мкс брать биты и пихать в UDR, настроили на 9 битный прием, т.к. стоп-битов у нас 2, но сам 9-ый бит нам не нужен будет никогда, приняли 9 тактов по 4 мкс, плюс 1 такт на стоп и старт бит, итого UART отсчитал 44 мкс (11 тактов), и выставил флаг FE, т.к. у нас все время 0 на входе и собственно принятый байт тоже 0. Вроде все хорошо, но дальше мне не ясно - будет ли аппаратно UART принимать данные, ведь на входе 0, т.е. нету старт-бита, да и в предыдущем приеме стоп-бит не пришел. Если не будет, то за сигнал BREAK запросто можно принять по ошибке нулевой байт произвольного канала. А если будет, вроде все хорошо, как раз на 88 мкс закончится прием второго байта и прийдет первый 0-вой, все ровно. А теперь предположим что BREAK длинной не 88 мкс, а 89, или что еще хуже, например, 95 мкс, ведь максимум может быть до 1 секунды! А следовательно UART может принять в произвольные моменты сигнал MAB (8мкс) следующий после BREAK, как конец/середину какого-то байта или флаг FE не сработает, т.к. MAB окажется для UART обычным стоп-битом, и получится каша при приеме данных. Возможно такое? |
13.05.2013, 21:30 | #4 |
Форумец
Сообщений: 5,631
Регистрация: 22.03.2003
Не в сети |
Ampermetr, мдя... а с теорией то у тебя полный швах, вроде и буквы правильные а результат не в дугу...
не вдаваясь в подробности, но с твоим уровнем знаний сразу надо писать полностью программный прием протокола. забудь про регистры уарта и прерывания... в лоб читаем состояние ноги rx... как только видим брейк переходим на прием... прием полностью по книжке с выдерживанием всех длительностей, начиная со стартового и кончая битом четности если такой используется... при неспешном подходе, запустишь прием за 1 вечер... |
13.05.2013, 21:58 | #5 |
Форумец
Сообщений: 88
Регистрация: 29.08.2006
Не в сети |
DimYch, я и не спорю. Я с UART никогда не работал. А нет вру на последнем курсе дипломник делал на 8051 архитектуре и UART и АЦП и ЦАП, все делал. Но блин это было 5 лет назад... С тех пор многое забылось, да и я не работаю по этой профессии. Чисто для себя занимаюсь. Разве все программеры рождаются у нас с вложенными знаниями предметной области? Мне, например, даже в иституте не рассказывали архитектуру МК и даже СИ не проходили, я самоучка с самого начала. И был единственным на курсе, кто писал, прошивал и работал с МК. Не надо так строго, я не могу все на свете знать, но могу разобраться и понять, к чему и стремлюсь. Если бы я научился принимать правильно пакеты, я бы глупые вопросы не писал, и тему не создавал. И опять таки, где описаны случаи, что происходит с UART после приема постоянного лог. 0 на линии, кроме выставления флага FE? Ни в даташитах, ни у Евстифеева (в принципе это теже даташиты на русском) нет такой инфы. И что значит прием полностью по книжке? Если не городить программный UART, то нам остается только настроить и запустить UART, a дальше считывать данные с регистра UDR. Какие тут могут быть выдерживания длительностей, кроме как успеть обработать прерывание до нового заполнения UDR? Только на Си как этот отследить? По отладчику все всегда хорошо, времени остается куча, только в жизни не работает... Программный UART это еще хуже на мой взгляд, здесь я вообще всптряпаюсь, особенно учитыватая, что все 2 таймера у меня используются для генерации ШИМ сигнала, и отмерять точные интервалы, можно только косвенно, проверяя только значение счетного регистра таймеров. Отказываться от аппаратного ШИМ не хочется, ибо очень удобно, и все прекрасно работает, проверяно на осцилле. Я думаю дождусь лог. анализатора, буду смотреть посылку и только потом двигаться дальше.
|
16.06.2013, 20:35 | #6 |
Форумец
Сообщений: 88
Регистрация: 29.08.2006
Не в сети |
Ну и все оказалось гораздо проще. И алгоритм у меня записан правильно и с теорией все нормально. А всего-то надо было заменить в панельке кристалл с ATTINY2313A-PU на ATTINY2313-20PU. Не знаю, в чем разница А и не А, но на А не работает. Толи там с UART что-то не так конфигурируется, толи на 16Мгц он нестабильно работает. Причем я уже на асьме писал, все равно не работает, так что и компиллятор не причем тут. Всем спасибо, тема закрыта.
|