реклама на сайте
подробности

 
 
> Прием DMX пакетов по UART на at91sam7s128
vutang
сообщение Dec 10 2009, 08:53
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 10-12-09
Из: Томск
Пользователь №: 54 174



Доброго времени суток.
Вобщем проблема у меня такая. Не знаю как отследить Break протокола DMX-512. Если кто знает как, помогите.
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
M_Andrey
сообщение Dec 10 2009, 09:33
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 158
Регистрация: 15-10-07
Из: Й-Ола
Пользователь №: 31 376



Всегда, еще с АВР-ок, определял по Frame Error.
Go to the top of the page
 
+Quote Post
vutang
сообщение Dec 10 2009, 09:40
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 10-12-09
Из: Томск
Пользователь №: 54 174



Т.е. мне нужно постоянно читать и если frame без ошибок, то это то что мне нужно?
Go to the top of the page
 
+Quote Post
M_Andrey
сообщение Dec 10 2009, 09:49
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 158
Регистрация: 15-10-07
Из: Й-Ола
Пользователь №: 31 376



УАРТ вешаем на прерывание и по приему с ошибкой FE разрешаем сохранение последующих байт, я еще проверяю этот и следующий байт должны быть = 0, далее сохраняем столько сколько требуется и опять переходим на ожидание следующего FE.

Сообщение отредактировал M_Andrey - Dec 10 2009, 10:15
Go to the top of the page
 
+Quote Post
vutang
сообщение Dec 10 2009, 10:18
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 10-12-09
Из: Томск
Пользователь №: 54 174



Вот мой код
И чего-то он не правильно работает...Данные в массиве появляются в рандомных местах
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++;
}
}
}

Сообщение отредактировал vutang - Dec 10 2009, 10:37
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 10 2009, 10:56
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Не нужно пытаться ловить break по Framing Error - у USART'а для этого есть событие RXBRK. И еррату почитайте.
Go to the top of the page
 
+Quote Post
vutang
сообщение Dec 10 2009, 11:13
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 10-12-09
Из: Томск
Пользователь №: 54 174



Ну если вы на 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++;
}
}
}

}



Ну вот как-то так.... и такая же ситуация
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 10 2009, 11:22
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(vutang @ Dec 10 2009, 14:13) *
Ну вот как-то так.... и такая же ситуация


Замечательно:
Код
      m_pUSART0->US_CR = AT91C_US_RSTSTA;  // Сначала сбросили статусы
      if((m_pUSART0->US_CSR&AT91C_US_RXBRK)!=0) // А теперь пытаемся их проверить
Go to the top of the page
 
+Quote Post
vutang
сообщение Dec 10 2009, 11:26
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 10-12-09
Из: Томск
Пользователь №: 54 174



Увы....но даже если убрать m_pUSART0->US_CR = AT91C_US_RSTSTA;
То ничего не меняется((( Данные принимаются, и в массиве записываются по порядку но начало записи всегда разное.(
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 10 2009, 11:38
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(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. Воспользоваться полученными знаниями для написания программы.
Go to the top of the page
 
+Quote Post
vutang
сообщение Dec 10 2009, 12:21
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 10-12-09
Из: Томск
Пользователь №: 54 174



Спасибо всем кто давал советы. Все заработало вот так:


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++;
}
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 10 2009, 17:02
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(vutang @ Dec 10 2009, 15:21) *
Все заработало вот так

Случайно. Такой код работать не должен.
Go to the top of the page
 
+Quote Post
vutang
сообщение Dec 15 2009, 06:53
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 10-12-09
Из: Томск
Пользователь №: 54 174



Но он работает)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 15 2009, 07:18
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Код, построенный с программными задержками Delay(55*4) вызывает большие сомнения.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 15 2009, 11:41
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(vutang @ Dec 15 2009, 09:53) *
Но он работает)

Это его не оправдывает нисколько.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 08:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01485 секунд с 7
ELECTRONIX ©2004-2016