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

 
 
> Какова "реальная" скорость UART?
altlogic
сообщение Jun 2 2008, 23:15
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



Здравствуйте!

Стояла задача добиться максимальной скорости обмена по UART в Atmega128. Со стороны мк была написана небольшая програмка для измерения скорости обмена. Передача осуществляется в режиме прерывания.
Код
#define TX_BUFFER_SIZE 128
char tx_buffer[TX_BUFFER_SIZE];

#if TX_BUFFER_SIZE<256
unsigned char tx_wr_index,tx_rd_index,tx_counter;
#else
unsigned int tx_wr_index,tx_rd_index,tx_counter;
#endif

// USART0 Transmitter interrupt service routine
interrupt [USART0_TXC] void usart0_tx_isr(void)
{
if (tx_counter)
   {
   --tx_counter;
   UDR0 = tx_buffer[tx_rd_index];
   if (++tx_rd_index == TX_BUFFER_SIZE)
      tx_rd_index=0;
   };
}

// Write a character to the USART0 Transmitter buffer
#pragma used+
int COM_putchar(unsigned char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSR0A & DATA_REGISTER_EMPTY)==0))
   {
   tx_buffer[tx_wr_index]=c;
   if (++tx_wr_index == TX_BUFFER_SIZE)
   {        
      tx_wr_index=0;
   }
   ++tx_counter;
   }
else
   UDR0=c;
#asm("sei")
return 1;//<!
}

в main:

unsigned long int tx_cnt; // счётчик переданных байт
_включили_таймер
   if( ++tx_cnt < 65535 )
   {      
      COM_putchar(0x55);    
   }
_остановили_таймер

В теории скорость передачи BAUD = 115200 бит/с. Передаём один старт-бит, 8 бит данных, один стоп-бит, итого 10 бит на передачу одного байта данных.
На деле получаю:
передано 65535 байт;
время: 6,2с.
Считаем BAUD: 65535*10/6,2 = 105702 бит/с.

Не дотягивает передатчик до любой из стандартных скоростей, которую я выбирал. Может так и должно быть? Или стоит искать ошибки программы?

Сообщение отредактировал altlogic - Jun 2 2008, 23:17


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
altlogic
сообщение Jun 3 2008, 21:53
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 2-12-06
Из: г. Хабаровск
Пользователь №: 23 035



Всем участникам спасибо! Сегодня утром на свежую голову разобрался в вопросе, сделал НОРМАЛЬНО прерывания по пустому Data Register, и получил свои 115 200 на передатчике. Вот теперь встанет следующий вопрос - добиться 115 200 на приёмникеsmile.gif У меня там тоже прерывания по окончанию приёма. Пока не проверял, но боюсь и там будет та же картина.
Код
interrupt [USART1_RXC] void usart1_rx_isr(void)
{
char status,data;
status=UCSR1A;
data=UDR1;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer1[rx_wr_index1]=data;
   if (++rx_wr_index1 == RX1_BUFFER_SIZE) rx_wr_index1=0;
   if (++rx_counter1 == RX1_BUFFER_SIZE)
      {
      rx_counter1=0;
      rx_buffer_overflow1=1;
      };
   };
}


--------------------
С уважением, Вячеслав
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 4 2008, 09:45
Сообщение #3


Гуру
******

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



Цитата(altlogic @ Jun 4 2008, 01:53) *
Вот теперь встанет следующий вопрос - добиться 115 200 на приёмникеsmile.gif У меня там тоже прерывания по окончанию приёма. Пока не проверял, но боюсь и там будет та же картина.

Проверку FRAMING-PARITY-OVERRUN можно смело выбросить - толку от нее никакого, а время сожрет.
С приемом проблем быть не должно.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jun 4 2008, 10:38
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(aaarrr @ Jun 4 2008, 12:45) *
Проверку FRAMING-PARITY-OVERRUN можно смело выбросить - толку от нее никакого, а время сожрет.

Толк весьма существенен. Например экономия времени smile.gif
Если произошла одна из ошибок, автомат приема можно сразу перевести на ожидание нового пакета, не дожидаясь окончания приема пакета, проверки контрольной суммы и проч.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 4 2008, 10:48
Сообщение #5


Гуру
******

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



Цитата(Dog Pawlowa @ Jun 4 2008, 14:38) *
Толк весьма существенен. Например экономия времени smile.gif
Если произошла одна из ошибок, автомат приема можно сразу перевести на ожидание нового пакета, не дожидаясь окончания приема пакета, проверки контрольной суммы и проч.

Ага, сэкономите, как же smile.gif
Представьте: принимаем пакет из 16 байт, в 7-м Framing Error - и что делать? Считать следующий байт началом нового пакета? Кричать караул?

Правильным решением будет наплевать на ошибки и принять пакет до конца - пусть верхний уровень разбирается, нормальный пришел пакет, или нет. Как раз с помощью контрольной суммы, CRC и т.п.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- altlogic   Какова "реальная" скорость UART?   Jun 2 2008, 23:15
- - repairDV   Цитата(altlogic @ Jun 3 2008, 10:15) Не ...   Jun 3 2008, 00:50
|- - altlogic   Цитата(repairDV @ Jun 3 2008, 11:50) Да, ...   Jun 3 2008, 01:12
|- - repairDV   Цитата(altlogic @ Jun 3 2008, 12:12) бит ...   Jun 3 2008, 02:58
- - aaarrr   Цитата(altlogic @ Jun 3 2008, 03:15) Не ...   Jun 3 2008, 03:03
- - altlogic   Цитата(repairDV @ Jun 3 2008, 13:58) Тут,...   Jun 3 2008, 03:14
- - MrYuran   Цитата(altlogic @ Jun 3 2008, 03:15) В те...   Jun 3 2008, 04:04
|- - altlogic   Цитата(MrYuran @ Jun 3 2008, 15:04) на са...   Jun 3 2008, 04:45
|- - LeonY   Цитата(MrYuran @ Jun 3 2008, 06:04) на са...   Jun 3 2008, 22:37
- - aaarrr   Цитата(MrYuran @ Jun 3 2008, 08:04) на са...   Jun 3 2008, 04:54
- - Палыч   Цитата(altlogic @ Jun 3 2008, 02:15) Стоя...   Jun 3 2008, 06:00
- - altlogic   Цитата(aaarrr @ Jun 3 2008, 15:54) Код ин...   Jun 3 2008, 07:15
|- - Палыч   По-моему, Вам уже всё обьяснили... Или остались во...   Jun 3 2008, 07:56
- - lolful   Я наверно скажу глупость, но мне всегда казалось, ...   Jun 3 2008, 17:49
- - aaarrr   Ересь Стартовый бит всегда один, количество стопо...   Jun 3 2008, 17:59
||- - Dog Pawlowa   Цитата(aaarrr @ Jun 4 2008, 13:48) Ага, с...   Jun 4 2008, 11:20
|- - altlogic   Цитата(aaarrr @ Jun 4 2008, 20:45) Провер...   Jun 4 2008, 12:14
- - DpInRock   Бит четности не передается, если четность не включ...   Jun 4 2008, 03:48
- - WHALE   а зачем 2 индекса-rx_wr_index1 и rx_counter1?   Jun 4 2008, 05:54
- - altlogic   Там вообще три переменных под индексы: rx_wr_index...   Jun 4 2008, 07:02
- - aaarrr   Ну, если специально придумать плохой протокол и до...   Jun 4 2008, 11:51
- - DpInRock   Протокол верхнего уровня, это когда вы принятую ст...   Jun 5 2008, 10:37
- - altlogic   Что-то просел я с реализацией RTS/CTS протокола. Н...   Jun 5 2008, 11:35
|- - aaarrr   Цитата(altlogic @ Jun 5 2008, 15:35) Ко...   Jun 5 2008, 13:02
|- - altlogic   Спасибо, теперь вроде ничего не теряю Только я не ...   Jun 5 2008, 13:40
- - aaarrr   Да, при входе в прерывание прерывания запрещаются ...   Jun 5 2008, 13:54


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 00:15
Рейтинг@Mail.ru


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