Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Автоопределение частоты работы УСАРТа
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
SpiritDance
Понадобилось, значит, мне сваять автодетект частоты передатчика при преме. Прием по УСАРТу. Передача либо от компа либо не от компа, протокола вобщем еще нет. Вопрос, как сделать, от чего оттолкнутся, как вообще это делают? Хелп. unsure.gif
DS
Цитата(SpiritDance @ Apr 17 2006, 22:25) *
Понадобилось, значит, мне сваять автодетект частоты передатчика при преме. Прием по УСАРТу. Передача либо от компа либо не от компа, протокола вобщем еще нет. Вопрос, как сделать, от чего оттолкнутся, как вообще это делают? Хелп. unsure.gif


По измерению длины битового импульса. В модемах пользют для этого момент прихода символов AT, с которых любая команда начинается. Если пытаться определить по произвольным символам, можно с первой попытки не угадать
WHALE
На работе пользуем gsm-модемы,в них есть функция автоопределения скорости,если ее не выключить,
начинают сыпать сбои.
SpiritDance
Цитата(DS_ @ Apr 17 2006, 22:31) *
По измерению длины битового импульса. В модемах пользют для этого момент прихода символов AT, с которых любая команда начинается. Если пытаться определить по произвольным символам, можно с первой попытки не угадать

Например для арма в бутлоадере используют символ синхронизации (какой?) в начале передачи данных.Собственно подобное и нужно сделать для АВР.
Вопрос так как вычислять значение заносимое в UBR, при том что скорости нестандартные?Я так понимаю что надо знать всю таблицу возможных скоростей и собственно по ней определять какая же сейчас, так?
Алгоритм вполне понятен, если надо определить длину импульса, а вот как это сделать по принимаемому байту. Выбрать байт синхронизации например 0xF0? Или 0xAA и величины измеренных импульсов усреднить?
Я так понимаю что при этом надо еще точно знать частоту кварца. Как поступить в том случае если частота кварца в принципе разная. Интересно как можно извернутся, ведь например в тех же армах бутлоадер заранее "не знает" о частоте кварца?
rezident
Для детекта скорости обычно используют символ 0xFF. При этом входом служит не RXD UARTа, а вход таймера в режиме CAPTURE (режим захвата). В результате измеряется длительность стартового символа, при тактировании таймера от того же источника, что и UART. Поэтому знать частоту тактирования (кварца) не обязательно. Однако проблема в том, что далеко не во всех протоколах связи можно использовать символ синхронизации. Если вы планируете сделать автодетект скорости для своего собственного бутлоадера, это одно дело. А если планируете использоваеть его (автодетект) в обычной работе, то я бы категорически не советовал вам этого делать!
beer_warrior
Цитата
Как поступить в том случае если частота кварца в принципе разная. Интересно как можно извернутся, ведь например в тех же армах бутлоадер заранее "не знает" о частоте кварца?

Ну так эти алгоритмы достаточно хорошо описаны в даташитах.
Например AT91SAM7S Series Preliminary страница 136.
В любом случае, в начале идет предопределенная последовательность,
а потом девайс отвечает, что частота найдена, можете передавать.
defunct
Цитата(SpiritDance @ Apr 18 2006, 07:44) *
Например для арма в бутлоадере используют символ синхронизации (какой?) в начале передачи данных.Собственно подобное и нужно сделать для АВР.

В LPC используется символ '?'.

Цитата
Вопрос так как вычислять значение заносимое в UBR, при том что скорости нестандартные?Я так понимаю что надо знать всю таблицу возможных скоростей и собственно по ней определять какая же сейчас, так?

Таблицу знать не обязательно, вычислить значение UBR можно по формуле:
UBR = 1 + 1/16 * Fosc /(Скорость уарта)

А вот определить скорость уарта, необходимо с помощью таймера, на основе определения длительности одного импульса.
Вначале нужно использовать пины уарта как GPIO и анализировать поступающую информацию (выделить символ синхронизации, и определить длительность одного бита), на ее основе определить скорость, подставить в формулу, и только после этого инициализировать УАРТ.

Цитата
Интересно как можно извернутся, ведь например в тех же армах бутлоадер заранее "не знает" о частоте кварца?

и вам тоже нужно знать частоту кварца, иначе в формуле уравнения будет две неизвестных, и решить его не удастся.

Цитата
Для детекта скорости обычно используют символ 0xFF.

Далеко не лучший выбор. Т.к. такой символ есть ни что иное как всего лишь однин импульс (стартбит). Большая вероятность того, что любая помеха будет воспринята как такой (0xFF) символ.
SpiritDance
Всем спасибо! Буду соображать.
Напоследок
UBR = 1 + 1/16 * Fosc /(Скорость уарта)
Думаю что надо выразить отношение fosc/скорость через длину единичного импульса при известном синхросимволе.
А вот помехи это да, с ними тут вообще ничего не сделаешь.

Что касается использования, то это бутлоадер. Каким макаром использовать захват, он что везде совпадает с RxD? Если вы имеете в виду совмещение сигналов, то мне ног не дадут, придется программно камень насиловать.
beer_warrior
Цитата
Каким макаром использовать захват, он что везде совпадает с RxD? Если вы имеете в виду совмещение сигналов, то мне ног не дадут, придется программно камень насиловать.


Да нет, просто отслеживать событие в IO порте, а потом переключаться на УАРТ.
otrog
Цитата(SpiritDance @ Apr 18 2006, 22:21) *
Что касается использования, то это бутлоадер.

Я думаю это ответит на все ваши вопросы.

Цитата
Для установления связи ПК передает подряд 16 байт ( 0x80 ), по ним определяется скорость передачи. В ответ загрузчик передает подряд 3 байта: полученный коэффициент деления асинхронного интерфейса ( первым - целая часть, вторым - дробная ) и байт 0x0D. Коэффициент деления, отличающийся от ближайшего целого числа больше чем на 4..5% не рекомендуется для использования из-за низкой точности синхронизации

Успехов.
SpiritDance
otrog
G thanks!!!
SasaVitebsk
Цитата(DS_ @ Apr 17 2006, 22:31) *
По измерению длины битового импульса. В модемах пользют для этого момент прихода символов AT, с которых любая команда начинается. Если пытаться определить по произвольным символам, можно с первой попытки не угадать


И да и нет. smile.gif Нормальный модем определяет по любому первому символу. Я у себя в модеме реализовал так называемый автобод. Выпускается уже давно. Кстати без этого не на каждой винде диагностика проходит. Но задача данная нетривиальна. Я скажу что повозится с ней пришлось и врядли её тебе кто-нибудь за просто так отдаст.

Подскажу некоторые моменты.
Сначала идёт синхроимпульс. Байт передаётся младшим битом вперёд, - поэтому все нечётные байты определяются просто. Но есть байты которые правильно идентифицировать практически нельзя. Это там где один перепад уровня. Их немного. Западные модемы на данных символах тоже ошибаются.

И ещё мне удалось задетектить от 1200 до 115200 на AVR с частотой 7372.8М при выключенных прерываниях (слежу за флагами) на ассемблере. При этом запас по скорости не высок.
SpiritDance
Решил выложить код автодетекта, проверен на ат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) );
}


Еще раз спасибо всем ответившим.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.