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

 
 
> Портится старший бит при приёме через UART, atmega1281
xelax
сообщение Feb 29 2008, 07:10
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Используется бридж USB to UART СР2101 silabs.
Запускаю передачу файла через гипиертерминал. Файл состоит из последовательности ASCII цифорок.
На меге творится что-то странное. На 9600 иногда принимается нормально, иногда через байт то есть например передаю несколько раз 2. на приёме вижу 0х32 0хb2 0x32 0xb2 ... и т.д. со всеми цифрами.
Ситауация исправилась, когда на гипертерминале ставлю два стоп бита.
На скорости 38400 два стоп бита уже не спасают.

Мега работаёт на внутреннем RC генераторе на 4 Мгц. При старте программы генератор калибруется по внешнему часовому кварцу, который для асинхронного таймера.

бодрейт считается так.
Код
#define UART_DOUBLE_SPEED 1ul

enum
{
UART_BAUDRATE_9600 =  (unsigned)((F_CPU * (UART_DOUBLE_SPEED + 1ul)) / (16ul * 9600ul) - 1ul),
UART_BAUDRATE_38400 = (unsigned)((F_CPU * (UART_DOUBLE_SPEED + 1ul)) / (16ul * 38400ul) - 1ul)
}


Вообще что это такое может быть?

З.Ы.

Гоняю данные другой терминальной программой всё ок и на приём и на передачу.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
xelax
сообщение Feb 29 2008, 09:56
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Ну затактировать от кварца к сожалению не могу. Изделия уже были разработаны до моего появления в компании.

Управление потоком тоже отключить не могу, так используется в данном Application.

Все мои тестовые аппликейшены по несколько часов работали на приём/передачу с компом без ошибок.

Калибровка производится правильно. Хотя... Вот код на поругание общественностью smile.gif
Код
#define INTERNAL_CLOCK F_CPU

#define EXTERNAL_TICKS 2*4
#define CYCLE_LENGTH 7
#define REFERENCE_CLOCK 32768
#define REFERENCE_COUNT (INTERNAL_CLOCK * EXTERNAL_TICKS) / (REFERENCE_CLOCK * CYCLE_LENGTH)

static uint16_t Measurement(void)
{
uint16_t cnt = 0;
  ASSR |= (1 << AS2);
  TCCR2B = 1 << CS20;
  ATOMIC_SECTION_ENTER
    TCNT2 = 0;
    while (ASSR & 0x1B);
    do
    {
      cnt++;
    } while (TCNT2 < EXTERNAL_TICKS);
  ATOMIC_SECTION_LEAVE
  return cnt;
}

void CalibrateInternalRc(void)
{
  uint16_t count;
  uint8_t cycles = 0x80;
  do
  {
    count = Measurement();
    if (count > REFERENCE_COUNT)
      OSCCAL--;
    if (count < REFERENCE_COUNT)
      OSCCAL++;
    if (count == REFERENCE_COUNT)
    {
      break;
    }
  } while (--cycles);
}
Go to the top of the page
 
+Quote Post
=GM=
сообщение Feb 29 2008, 11:27
Сообщение #3


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(xelax @ Feb 29 2008, 09:56) *
Калибровка производится правильно. Хотя... Вот код на поругание общественностью smile.gif

С первого взгляда вроде бы всё в порядке с программой калибровки, но создаётся такое впечатление, что частота откалибрована немного неверно, поскольку иногда вы принимаете стоп-бит посылки в качестве последнего бита. Возможно, это связано с тем, что программа калибровки написана на си, и в вашем частном случае количество МЦ в цикле измерения не совпадает с заданными в программе 7-ю МЦ, может быть из-за уровня оптимизации, может быть из-за различных версий компилятора или даже другого компилятора...

Попробуйте напрямую выдать сигнал на ножку OC2A (или OC2B) в режиме output compare match и померить частоту сигнала с помощью частотомера. Отсюда легко будет вычислить скорость приёма по рс232.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- xelax   Портится старший бит при приёме через UART   Feb 29 2008, 07:10
- - IJAR   [удалил НЕНУЖНОЕ цитирование] Может быть установ...   Feb 29 2008, 07:23
- - GDI   Может дело не в меге, раз с другой терминалкой раб...   Feb 29 2008, 07:30
|- - Stas633   Попробуйте "сменить" ПО на РС. AVR, наве...   Feb 29 2008, 23:44
|- - zltigo   Цитата(Stas633 @ Mar 1 2008, 02:44) Попро...   Mar 1 2008, 10:11
|- - Stas633   Цитата(zltigo @ Mar 1 2008, 13:11) Не вер...   Mar 1 2008, 14:18
- - GDI   ЦитатаНу затактировать от кварца к сожалению не мо...   Feb 29 2008, 10:50
|- - xelax   Цитата(GDI @ Feb 29 2008, 13:50) А в чем ...   Feb 29 2008, 11:25
- - ReAl   Кроме отклонения RC от номинального значения есть ...   Feb 29 2008, 12:09
- - xelax   К стати баг проявляется только в гипертерминале, т...   Mar 3 2008, 06:59
|- - ReAl   Цитата(xelax @ Mar 3 2008, 08:59) И когда...   Mar 3 2008, 08:01
|- - xelax   Цитата(ReAl @ Mar 3 2008, 11:01) И никако...   Mar 3 2008, 11:48
|- - ReAl   Цитата(xelax @ Mar 3 2008, 13:48) В сво...   Mar 6 2008, 15:53
- - alex1979   Цитата(xelax @ Feb 29 2008, 09:10) Исполь...   Mar 7 2008, 10:13
|- - Lexdaw   А вот еще был случай...Короче опторазвязанный USAR...   Mar 11 2008, 12:08
|- - alux   Цитата(alex1979 @ Mar 7 2008, 13:13) Реше...   Oct 24 2008, 05:01
|- - zltigo   Цитата(alex1979 @ Mar 7 2008, 12:13) неда...   Oct 24 2008, 20:37
- - xelax   Реально наблюдаю на осцилографе картинку, с писишк...   Mar 11 2008, 13:33
- - xelax   Тема древняя... Ну раз подняли снова, просто опиш...   Oct 24 2008, 11:07


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

 


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


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