|
|
  |
Автоопределение частоты работы УСАРТа, Пните куда надо |
|
|
|
Apr 17 2006, 18:31
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250

|
Цитата(SpiritDance @ Apr 17 2006, 22:25)  Понадобилось, значит, мне сваять автодетект частоты передатчика при преме. Прием по УСАРТу. Передача либо от компа либо не от компа, протокола вобщем еще нет. Вопрос, как сделать, от чего оттолкнутся, как вообще это делают? Хелп.  По измерению длины битового импульса. В модемах пользют для этого момент прихода символов AT, с которых любая команда начинается. Если пытаться определить по произвольным символам, можно с первой попытки не угадать
--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
|
|
|
|
|
Apr 18 2006, 04:44
|

Дух погибшего транзистора
   
Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288

|
Цитата(DS_ @ Apr 17 2006, 22:31)  По измерению длины битового импульса. В модемах пользют для этого момент прихода символов AT, с которых любая команда начинается. Если пытаться определить по произвольным символам, можно с первой попытки не угадать Например для арма в бутлоадере используют символ синхронизации (какой?) в начале передачи данных.Собственно подобное и нужно сделать для АВР. Вопрос так как вычислять значение заносимое в UBR, при том что скорости нестандартные?Я так понимаю что надо знать всю таблицу возможных скоростей и собственно по ней определять какая же сейчас, так? Алгоритм вполне понятен, если надо определить длину импульса, а вот как это сделать по принимаемому байту. Выбрать байт синхронизации например 0xF0? Или 0xAA и величины измеренных импульсов усреднить? Я так понимаю что при этом надо еще точно знать частоту кварца. Как поступить в том случае если частота кварца в принципе разная. Интересно как можно извернутся, ведь например в тех же армах бутлоадер заранее "не знает" о частоте кварца?
--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
|
|
|
|
|
Apr 18 2006, 07:42
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата Как поступить в том случае если частота кварца в принципе разная. Интересно как можно извернутся, ведь например в тех же армах бутлоадер заранее "не знает" о частоте кварца? Ну так эти алгоритмы достаточно хорошо описаны в даташитах. Например AT91SAM7S Series Preliminary страница 136. В любом случае, в начале идет предопределенная последовательность, а потом девайс отвечает, что частота найдена, можете передавать.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Apr 18 2006, 11:12
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(SpiritDance @ Apr 18 2006, 07:44)  Например для арма в бутлоадере используют символ синхронизации (какой?) в начале передачи данных.Собственно подобное и нужно сделать для АВР. В LPC используется символ '?'. Цитата Вопрос так как вычислять значение заносимое в UBR, при том что скорости нестандартные?Я так понимаю что надо знать всю таблицу возможных скоростей и собственно по ней определять какая же сейчас, так? Таблицу знать не обязательно, вычислить значение UBR можно по формуле: UBR = 1 + 1/16 * Fosc /(Скорость уарта) А вот определить скорость уарта, необходимо с помощью таймера, на основе определения длительности одного импульса. Вначале нужно использовать пины уарта как GPIO и анализировать поступающую информацию (выделить символ синхронизации, и определить длительность одного бита), на ее основе определить скорость, подставить в формулу, и только после этого инициализировать УАРТ. Цитата Интересно как можно извернутся, ведь например в тех же армах бутлоадер заранее "не знает" о частоте кварца? и вам тоже нужно знать частоту кварца, иначе в формуле уравнения будет две неизвестных, и решить его не удастся. Цитата Для детекта скорости обычно используют символ 0xFF. Далеко не лучший выбор. Т.к. такой символ есть ни что иное как всего лишь однин импульс (стартбит). Большая вероятность того, что любая помеха будет воспринята как такой (0xFF) символ.
|
|
|
|
|
Apr 18 2006, 21:15
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата Каким макаром использовать захват, он что везде совпадает с RxD? Если вы имеете в виду совмещение сигналов, то мне ног не дадут, придется программно камень насиловать. Да нет, просто отслеживать событие в IO порте, а потом переключаться на УАРТ.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Apr 19 2006, 07:11
|
Местный
  
Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589

|
Цитата(SpiritDance @ Apr 18 2006, 22:21)  Что касается использования, то это бутлоадер. Я думаю это ответит на все ваши вопросы. Цитата Для установления связи ПК передает подряд 16 байт ( 0x80 ), по ним определяется скорость передачи. В ответ загрузчик передает подряд 3 байта: полученный коэффициент деления асинхронного интерфейса ( первым - целая часть, вторым - дробная ) и байт 0x0D. Коэффициент деления, отличающийся от ближайшего целого числа больше чем на 4..5% не рекомендуется для использования из-за низкой точности синхронизации Успехов.
Сообщение отредактировал otrog - Apr 19 2006, 07:15
--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
|
|
|
|
|
Apr 19 2006, 22:16
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(DS_ @ Apr 17 2006, 22:31)  По измерению длины битового импульса. В модемах пользют для этого момент прихода символов AT, с которых любая команда начинается. Если пытаться определить по произвольным символам, можно с первой попытки не угадать И да и нет.  Нормальный модем определяет по любому первому символу. Я у себя в модеме реализовал так называемый автобод. Выпускается уже давно. Кстати без этого не на каждой винде диагностика проходит. Но задача данная нетривиальна. Я скажу что повозится с ней пришлось и врядли её тебе кто-нибудь за просто так отдаст. Подскажу некоторые моменты. Сначала идёт синхроимпульс. Байт передаётся младшим битом вперёд, - поэтому все нечётные байты определяются просто. Но есть байты которые правильно идентифицировать практически нельзя. Это там где один перепад уровня. Их немного. Западные модемы на данных символах тоже ошибаются. И ещё мне удалось задетектить от 1200 до 115200 на AVR с частотой 7372.8М при выключенных прерываниях (слежу за флагами) на ассемблере. При этом запас по скорости не высок.
|
|
|
|
|
Apr 25 2006, 04:43
|

Дух погибшего транзистора
   
Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288

|
Решил выложить код автодетекта, проверен на ат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.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|