Перейти к содержанию
    

1 Мбит на USART Atmega128

Усть вопрос - как добиться скорости 1 Мбит на USART для Atmega128? В соответствии с документацией подключил кварц 16 Мгц - выставил все параметры - установил фуз CKOPT. Добиться скорости 1 Мбит не удалось. на 500 кбит работает с кучей ошибок. 250 кбит - не работает. Стабильно только на 76800. К компьютеру подключен через чип USB to UART Bridge с поддержко USB 2.0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Усть вопрос - как добиться скорости 1 Мбит на USART для Atmega128?

Надо выяснять, может ли работать переходник на такой нестандартной скорости. Судя по стабильной работе на 76800 - не может. Или неправильно настраивается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тактовая частота должна быть кратна скорости обмена по UART.

Есть в ДШ табличка с ошибками.

U2X = 0 и UBRR=0 должно ровняться скорости 1М

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Покажите код инициализации 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 -х прерываниях от таймеров - может не успевает обработать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Инициализация вроде в порядке Запретите все прерывания кроме USART и проверте

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надо выяснять, может ли работать переходник на такой нестандартной скорости.

Ну это легко посмотреть осцилом.

А ещё стоит посмотреть исходник, как там байты ловятся.

Есть вероятность, что пропуски идут. Хотя, 16х11 тактов вроде должно хватить

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тактовая частота должна быть кратна скорости обмена по 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 ();  
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

А из-за Вашего 16 Мгц кварца слишком большая ошибка набегает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А из-за Вашего 16 Мгц кварца слишком большая ошибка набегает

16М/1М=16

Где остаток, который "набегает"?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Ну а для работы 1 Мбитом могу сказать, что скорость для UART-а очень капризная и требовательная, как к длине кабеля, так и к занятости процессора. Возможно он просто не справляется с обработкой данных, поступающей с такой скоростью через UART. При приеме данных, каждый новый байт будет приходить примерно 1 раз в 10 мкс, поэтому процессор должен быть максимально свободен, чтобы успевать обрабатывать с такой скоростью.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...