Цитата(xelax @ Feb 29 2008, 09:10)

Используется бридж 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)
}
Вообще что это такое может быть?
З.Ы.
Гоняю данные другой терминальной программой всё ок и на приём и на передачу.
недавно сам столкнулся с подобной проблеммой.
Решение: вместо вычистения скорости по формуле в регистр UBRR записал пердопределенную константу из даташита.
Пример:
u16 bauddiv = 51;
outb(UBRRL, bauddiv);
#ifdef UBRRH
outb(UBRRH, bauddiv>>8);
#endif
Сообщение отредактировал alex1979 - Mar 7 2008, 10:14