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

 
 
> Какова "реальная" скорость 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 5 2008, 11:35
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 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;
}


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


Гуру
******

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



Цитата(altlogic @ Jun 5 2008, 15:35) *


Код
//<! USART0_DRE - usart data register emptry
interrupt [ USART0_DRE ] void usart0_UDRE_isr(void)
{  
   if ( tx_counter > 0 )
   {                  
    //  #asm("cli")    <-- aaarrr Лишнее действие: прерывания уже запрещены
      --tx_counter; //<! неделимая операция
    //  #asm("sei")    <-- aaarrr А это уже просто опасно
      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();    <-- aaarrr Здесь включать передатчик рано, он может тут же запретить UDR        
            if (++tx_wr_index == TX_BUFFER_SIZE)
            {        
               tx_wr_index=0;
            }  
            #asm("cli")          
            ++tx_counter;            
            #asm("sei")
            COM_tx_on();
            tx = 1; //<! break from while
         }  
      }      
   }      
   return 1;
}
Go to the top of the page
 
+Quote Post
altlogic
сообщение Jun 5 2008, 13:40
Сообщение #4


Местный
***

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



Спасибо, теперь вроде ничего не теряюsmile.gif Только я не понял
Код
//  #asm("cli")    <-- aaarrr Лишнее действие: прерывания уже запрещены

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


--------------------
С уважением, Вячеслав
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
- - altlogic   Всем участникам спасибо! Сегодня утром на свеж...   Jun 3 2008, 21:53
|- - aaarrr   Цитата(altlogic @ Jun 4 2008, 01:53) Вот ...   Jun 4 2008, 09:45
|- - Dog Pawlowa   Цитата(aaarrr @ Jun 4 2008, 12:45) Провер...   Jun 4 2008, 10:38
||- - aaarrr   Цитата(Dog Pawlowa @ Jun 4 2008, 14:38) Т...   Jun 4 2008, 10:48
||- - 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
- - aaarrr   Да, при входе в прерывание прерывания запрещаются ...   Jun 5 2008, 13:54


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 03:02
Рейтинг@Mail.ru


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