|
Какова "реальная" скорость UART? |
|
|
|
Jun 3 2008, 22:37
|
Знающий
   
Группа: Админы
Сообщений: 689
Регистрация: 24-06-04
Из: South Africa
Пользователь №: 164

|
Цитата(MrYuran @ Jun 3 2008, 06:04)  на самом деле 11. забыли бит четности. Если проверка на четность не включена, это ещё не значит, что бит не передаётся. Так что подкорректируем ваш результат: 105000*11/10=115500. Где-то так.
Опять же, не забываем про погрешность деления частоты. Или у вас коэффициент целый получился? Можно пояснить выделенное? А то как-то не понятно: сам ваял UART-ы (неоднократно) и всегда делал так что, если не включена то и не передается. С приемом на самых разных устройствах проблем никогда не было... А когда рассогласуешь Rx/Tx по контролю на PARITY - сразу FRAMING ERRORS валятся как из рога изобилия (Tx передает PARITY, а Rx его не ожидает). Ну и еще куча всяких побочных эффектов... 11 битов могут возникать при установке 2-х STOP Bits (их может быть 1, 1.5, 2)
--------------------
"В мире есть две бесконечные вещи: Вселенная и человеческая глупость. За Вселенную, впрочем, поручиться не могу". (С)
А. Эйнштейн.
|
|
|
|
|
Jun 4 2008, 10:48
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Dog Pawlowa @ Jun 4 2008, 14:38)  Толк весьма существенен. Например экономия времени smile.gif Если произошла одна из ошибок, автомат приема можно сразу перевести на ожидание нового пакета, не дожидаясь окончания приема пакета, проверки контрольной суммы и проч. Ага, сэкономите, как же  Представьте: принимаем пакет из 16 байт, в 7-м Framing Error - и что делать? Считать следующий байт началом нового пакета? Кричать караул? Правильным решением будет наплевать на ошибки и принять пакет до конца - пусть верхний уровень разбирается, нормальный пришел пакет, или нет. Как раз с помощью контрольной суммы, CRC и т.п.
|
|
|
|
|
Jun 4 2008, 11:20
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(aaarrr @ Jun 4 2008, 13:48)  Ага, сэкономите, как же  Представьте: принимаем пакет из 16 байт, в 7-м Framing Error - и что делать? Считать следующий байт началом нового пакета? Кричать караул? Правильным решением будет наплевать на ошибки и принять пакет до конца - пусть верхний уровень разбирается, нормальный пришел пакет, или нет. Как раз с помощью контрольной суммы, CRC и т.п. Я думаю, что правильное решение для каждой ситуации свое и ситуация сильно зависит от протокола. Например: - контрольная сумма простая, вероятность ее случайного совпадения достаточно велика, не контролировать паритет при приеме рискованно. Не хочется переходить на начало - можно флаг поставить. - есть протоколы, где EOT в потоке должно прекращать прием, то есть эта ветка(перехода на начало) все равно существует.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Jun 4 2008, 12:14
|
Местный
  
Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035

|
Цитата(aaarrr @ Jun 4 2008, 20:45)  Проверку FRAMING-PARITY-OVERRUN можно смело выбросить - толку от нее никакого, а время сожрет. С приемом проблем быть не должно. Спасибо за замечание. У меня никакого потокола верхнего уровня нет. UART используется для обмена между мк и gsm-модемом в пределах одной платы. Поэтому я исхожу из предположения, что ошибок быть не может в принципе.
--------------------
|
|
|
|
|
Jun 5 2008, 11:35
|
Местный
  
Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035

|
Что-то просел я с реализацией RTS/CTS протокола. Никак не могу придумать алгоритм быстрой связи. Почитал http://electronix.ru/forum/index.php?act=P...amp;qpid=133018 понял, так, что RTS/CTS не обязательно обрабатывать в режиме прерывания. Можно сделать буфер передатчика скажем байт на восемь, и не записывать в него, пока CTS равен единице(модем не готов). А вот прерывание по пустому DATA REGISTER пусть крутится, но до тех пор пока программный буфер не пуст. В общем пока что я теряю байты при передаче их модему, не могу понять где. Приведу сразу и переписанный код Код int COM_tx_on( void ) { UCSR0B |= ( 1 << UDRIE0 ); // Enable TX UDRE interrupt return 1; }
void COM_tx_off( void ) { UCSR0B &= ~( 1 << UDRIE0 ); // Disable TX interrupt }
//<! USART0_DRE - usart data register emptry interrupt [ USART0_DRE ] void usart0_UDRE_isr(void) { if ( tx_counter > 0 ) { #asm("cli") --tx_counter; //<! неделимая операция #asm("sei") UDR0 = tx_buffer[tx_rd_index]; if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0; } else { COM_tx_off(); } }
int COM_putchar(unsigned char c) { char tx = 0; while( !tx ) { if( !CTS ) { if( tx_counter != TX_BUFFER_SIZE ) { tx_buffer[tx_wr_index]=c; COM_tx_on(); if (++tx_wr_index == TX_BUFFER_SIZE) { tx_wr_index=0; } #asm("cli") ++tx_counter; #asm("sei") tx = 1; //<! break from while } } } return 1; }
--------------------
|
|
|
|
|
Jun 5 2008, 13:40
|
Местный
  
Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035

|
Спасибо, теперь вроде ничего не теряю  Только я не понял Код // #asm("cli") <-- aaarrr Лишнее действие: прерывания уже запрещены При входе в прерывание происходит глобальное запрещение прерываний? Т.е. из одного прерывания в другое меня не выбросит, если не делать так? Код // #asm("sei") <-- aaarrr А это уже просто опасно
--------------------
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|