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

 
 
 
Reply to this topicStart new topic
> 1 Мбит на USART Atmega128, как добиться большой скорости
DmitryDI
сообщение Mar 4 2010, 12:10
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 70
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 789



Усть вопрос - как добиться скорости 1 Мбит на USART для Atmega128? В соответствии с документацией подключил кварц 16 Мгц - выставил все параметры - установил фуз CKOPT. Добиться скорости 1 Мбит не удалось. на 500 кбит работает с кучей ошибок. 250 кбит - не работает. Стабильно только на 76800. К компьютеру подключен через чип USB to UART Bridge с поддержко USB 2.0
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 4 2010, 12:17
Сообщение #2


Гуру
******

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



Цитата(DmitryDI @ Mar 4 2010, 15:10) *
Усть вопрос - как добиться скорости 1 Мбит на USART для Atmega128?

Надо выяснять, может ли работать переходник на такой нестандартной скорости. Судя по стабильной работе на 76800 - не может. Или неправильно настраивается.
Go to the top of the page
 
+Quote Post
V_N
сообщение Mar 4 2010, 12:18
Сообщение #3


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

Группа: Свой
Сообщений: 162
Регистрация: 12-01-09
Из: Харьков
Пользователь №: 43 270



Покажите код инициализации USART
Go to the top of the page
 
+Quote Post
Tcom
сообщение Mar 4 2010, 12:19
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 360
Регистрация: 3-01-06
Из: Украина Запорожская обл.
Пользователь №: 12 792



Тактовая частота должна быть кратна скорости обмена по UART.
Есть в ДШ табличка с ошибками.
U2X = 0 и UBRR=0 должно ровняться скорости 1М

А если включить перемычку TX + RX в USB to UART Bridge с поддержкой USB 2.0 то нормально работает?
Go to the top of the page
 
+Quote Post
DmitryDI
сообщение Mar 4 2010, 12:24
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 70
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 789



Цитата(V_N @ Mar 4 2010, 15:18) *
Покажите код инициализации USART


// USART1 initialization
// Communication Parameters: 8 Data, 1 Stop, Even Parity
// USART1 Receiver: On
// USART1 Transmitter: On
// USART1 Mode: Asynchronous
// USART1 Baud Rate: 1 000 000
UCSR1A=0x00;
UCSR1B=0xD8; // RX и TX включение и прерывания
UCSR1C=0x26;
UBRR1H=0x00;
UBRR1L=0x00;

На чипе еще реализованы МЭК-101 и еще куча кода в 2 -х прерываниях от таймеров - может не успевает обработать.
Go to the top of the page
 
+Quote Post
V_N
сообщение Mar 4 2010, 12:36
Сообщение #6


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

Группа: Свой
Сообщений: 162
Регистрация: 12-01-09
Из: Харьков
Пользователь №: 43 270



Инициализация вроде в порядке Запретите все прерывания кроме USART и проверте
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 4 2010, 12:41
Сообщение #7


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(aaarrr @ Mar 4 2010, 15:17) *
Надо выяснять, может ли работать переходник на такой нестандартной скорости.

Ну это легко посмотреть осцилом.
А ещё стоит посмотреть исходник, как там байты ловятся.
Есть вероятность, что пропуски идут. Хотя, 16х11 тактов вроде должно хватить


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Mar 4 2010, 13:09
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(Tcom @ Mar 4 2010, 15:19) *
Тактовая частота должна быть кратна скорости обмена по UART.
Есть в ДШ табличка с ошибками.
U2X = 0 и UBRR=0 должно ровняться скорости 1М

А если включить перемычку TX + RX в USB to UART Bridge с поддержкой USB 2.0 то нормально работает?

Приммер инициализации USART1 для м128 на 1МГц, работает без ошибок, кварц 16МГц
Код
//------------ Инициализация USART1 -----------------------

void MonitorUART :: InitUSART1 (ULONG baudrate, char frame, char stopbits )
{
  UCSR1B = (1<<RXEN1)|(1<<TXEN1);
  // Количество стоп битов
  if ( stopbits == 1) UCSR1C &= ~(1<<USBS1);  // 1 bit
  else UCSR1C |= (1<<USBS1);                  //2 bit
  
  //Устанавливаем фрэйм
  UCSR1B &= ~(1<<UCSZ12);
  char tmp = 0;
  switch (frame)
  {
  case 5: tmp = ~(1<<UCSZ10); tmp &= ~(1<<UCSZ11);
          UCSR1C = tmp;
    break;
  case 6: tmp |= (1<<UCSZ10); tmp &= ~(1<<UCSZ11);
          UCSR1C = tmp;
    break;
  case 7: tmp |= (1<<UCSZ11); tmp &= ~(1<<UCSZ10);
          UCSR1C = tmp;
    break;
  case 8: UCSR1C |= (1<<UCSZ10)|(1<<UCSZ11);
    break;
  default: UCSR1C |= (1<<UCSZ10)|(1<<UCSZ11);
    break;    
  }
  
  // Скорость обмена
  UINT ubrr = CPU_F_Hz/ ( 16UL*baudrate) -1;
  UBRR1L = (char) ubrr; UBRR1H = ubrr>>8;
  
  // Разрешаем прерывания
  RxcIntEnable ();
  TxcIntEnable ();  
}
Go to the top of the page
 
+Quote Post
Yaumen
сообщение Mar 9 2010, 12:37
Сообщение #9


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

Группа: Свой
Сообщений: 187
Регистрация: 22-06-05
Из: Минск, Беларусь
Пользователь №: 6 213



Насколько я помню, ATmega поддерживает только целочисленный коэффициент деления для UART, поэтому для того чтобы работать со стандартными частотами UART-ов необходимо выбирать кварц, который будет делиться точно и без остатка, например 7.3728 МГц, 11.059 Мгц, 14.7486 МГц и т.д.

А из-за Вашего 16 Мгц кварца слишком большая ошибка набегает
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 9 2010, 12:42
Сообщение #10


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Yaumen @ Mar 9 2010, 15:37) *
А из-за Вашего 16 Мгц кварца слишком большая ошибка набегает

16М/1М=16
Где остаток, который "набегает"?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Yaumen
сообщение Mar 9 2010, 12:58
Сообщение #11


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

Группа: Свой
Сообщений: 187
Регистрация: 22-06-05
Из: Минск, Беларусь
Пользователь №: 6 213



MrYuran, действительно я тормознул, привык, что UART-ы используются с корявыми делителями для получения скорости.

Ну а для работы 1 Мбитом могу сказать, что скорость для UART-а очень капризная и требовательная, как к длине кабеля, так и к занятости процессора. Возможно он просто не справляется с обработкой данных, поступающей с такой скоростью через UART. При приеме данных, каждый новый байт будет приходить примерно 1 раз в 10 мкс, поэтому процессор должен быть максимально свободен, чтобы успевать обрабатывать с такой скоростью.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 9 2010, 13:18
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Yaumen @ Mar 9 2010, 15:58) *
UART-ы используются с корявыми делителями для получения скорости.

Ага, и по этой причине на встречной стороне от USB->UART переходника мегабит не получится. 9216000 например, получится.... Возможность других частот - тут уже надо изучать, как железо конкретного чипа, так и его драйвера,


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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