vutang
Dec 10 2009, 08:53
Доброго времени суток.
Вобщем проблема у меня такая. Не знаю как отследить Break протокола DMX-512. Если кто знает как, помогите.
M_Andrey
Dec 10 2009, 09:33
Всегда, еще с АВР-ок, определял по Frame Error.
vutang
Dec 10 2009, 09:40
Т.е. мне нужно постоянно читать и если frame без ошибок, то это то что мне нужно?
M_Andrey
Dec 10 2009, 09:49
УАРТ вешаем на прерывание и по приему с ошибкой FE разрешаем сохранение последующих байт, я еще проверяю этот и следующий байт должны быть = 0, далее сохраняем столько сколько требуется и опять переходим на ожидание следующего FE.
vutang
Dec 10 2009, 10:18
Вот мой код
И чего-то он не правильно работает...Данные в массиве появляются в рандомных местах
while(1)
{
unsigned int status;
status = m_pUSART0->US_CSR;
m=0;
m_pUSART0->US_CR = AT91C_US_RSTSTA; //сброс битов Frame , Pare и т.д
if((m_pUSART0->US_CSR&AT91C_US_FRAME)==0) //Если Frame=0, то
// стоповых битов в низком уровне не детектировано
{
while(m<513)
{
input1=read_char_USART0(); // Читаем с UART
buff2[m]=input1; // Запись в массив
m++;
}
}
}
aaarrr
Dec 10 2009, 10:56
Не нужно пытаться ловить break по Framing Error - у USART'а для этого есть событие RXBRK. И еррату почитайте.
vutang
Dec 10 2009, 11:13
Ну если вы на AVR делали, то напишите что хоть в алгоритме неправильно.
Ок aaarrr, я так пробовал и у меня тоже самое получалось, но сейчас еще раз попробую.
unsigned int status;
status = m_pUSART0->US_CSR;
m=0;
m_pUSART0->US_CR = AT91C_US_RSTSTA; //ñáðîñ áèòîâ RXBRK , Pare è ò.ä
if((m_pUSART0->US_CSR&AT91C_US_RXBRK)!=0) //Åñëè RXBRK=1, òî íàéäåí îáðûâ ïðèåìà ò.å. Break
{
input1=read_char_USART0();
if(input1==0)
{
input1=read_char_USART0();
if(input1==0)
{
while(m<513)
{
input1=read_char_USART0(); // ×èòàåì ñ UART
buff2[m]=input1; // Çàïèñü â ìàññèâ
m++;
}
}
}
}
Ну вот как-то так.... и такая же ситуация
aaarrr
Dec 10 2009, 11:22
Цитата(vutang @ Dec 10 2009, 14:13)

Ну вот как-то так.... и такая же ситуация
Замечательно:
Код
m_pUSART0->US_CR = AT91C_US_RSTSTA; // Сначала сбросили статусы
if((m_pUSART0->US_CSR&AT91C_US_RXBRK)!=0) // А теперь пытаемся их проверить
vutang
Dec 10 2009, 11:26
Увы....но даже если убрать m_pUSART0->US_CR = AT91C_US_RSTSTA;
То ничего не меняется((( Данные принимаются, и в массиве записываются по порядку но начало записи всегда разное.(
aaarrr
Dec 10 2009, 11:38
Цитата(vutang @ Dec 10 2009, 14:26)

Увы....но даже если убрать m_pUSART0->US_CR = AT91C_US_RSTSTA;
То ничего не меняется(((
Да не надо убирать (как тогда статусы сбрасываться будут?), надо сделать грамотно, т.е.:
1. Прочитать один абзац о работе Receive Break (31.6.3.11). Обратить внимание на то, что на один break RXBRK генерируется два раза.
2. Почитать еррату. Убедится, что в timeguard не пишется 0.
3. Воспользоваться полученными знаниями для написания программы.
vutang
Dec 10 2009, 12:21
Спасибо всем кто давал советы. Все заработало вот так:
m_pUSART0->US_CR = AT91C_US_RSTSTA;
while(!(m_pUSART0->US_CSR&AT91C_US_RXBRK)==1)
{
while(!(m_pUSART0->US_CSR&AT91C_US_RXBRK)==1)
{
count++;
if(count==2420)
break;
}
if(count==2420)
break;
while(m<40)
{
Delay(55*4);
input1=read_char_USART0();
buff2[m]=input1;
m++;
}
aaarrr
Dec 10 2009, 17:02
Цитата(vutang @ Dec 10 2009, 15:21)

Все заработало вот так
Случайно.
Такой код работать не должен.
vutang
Dec 15 2009, 06:53
Но он работает)
sergeeff
Dec 15 2009, 07:18
Код, построенный с программными задержками Delay(55*4) вызывает большие сомнения.
aaarrr
Dec 15 2009, 11:41
Цитата(vutang @ Dec 15 2009, 09:53)

Но он работает)
Это его не оправдывает нисколько.
vutang
Dec 15 2009, 12:34
Цитата(sergeeff @ Dec 15 2009, 10:18)

Код, построенный с программными задержками Delay(55*4) вызывает большие сомнения.
Delay(55*4) это задержки между димерами = 4 мкс, но вообще и без нее тоже работает.
Цитата(aaarrr @ Dec 10 2009, 13:56)

Не нужно пытаться ловить break по Framing Error - у USART'а для этого есть событие RXBRK. И еррату почитайте.
Еррату читать всегда полезно, особенно свежую.

В даташите ревизии J, выложенном на сайте атмела 15 декабря добавлена errata USART: RXBRK Flag error. Там описан случай, когда вместо RXBRK устанавливается framing error.
P.S. Сам с этим случаем не сталкивался, так что не могу судить, подходит ли она под описанный случай или нет.
aaarrr
Dec 16 2009, 15:21
Цитата(vmp @ Dec 16 2009, 18:17)

Еррату читать всегда полезно, особенно свежую.

Сообщения в топике тоже.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.