Решил выложить код автодетекта, проверен на атmega128 c 7-мегагерцовым кварцем практически на всех стандартных скоростях. Для синхронизации нужно послать контроллеру 16 байтов со значением 0х80. Вдруг понадобится кому.
Цитата
//----------------------------------------------------------------------------------------------------------------------
INT16U autodetect_baudrate(void)
{
/*
** определение частоты работы по усарту
*/
INT8U i;
INT16U TempData = 0;
//конфигурируем сигнал RxD как дискретный вход
_USART_DDR_PIN &= ~(1 << _USART_RXD_PIN);
//ожидаем 16 байт = 0x80
for( i = 0; i < 16 ; i++ )
{
//обнуляем таймер
TCNT1_BOOT = 0;
//ожидаем стартовый бит = 1 (сброс высокого уровня в ноль)
while( _USART_PORT_PIN & (1 << _USART_RXD_PIN) );
//запускаем таймер
TCCR1B_BOOT = 2;
//ждем стоп-бита (низкий уровень меняется на высокий)
while( !(_USART_PORT_PIN & (1 << _USART_RXD_PIN) ) );
//останавливаем таймер
TCCR1B_BOOT = 0;
TempData += TCNT1_BOOT;
}
//В данные момент TempData = UDR *256, сл. передаем старший байт
return ( (TempData >> 8) );
}
Еще раз спасибо всем ответившим.
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.