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

 
 
 
Reply to this topicStart new topic
> Автоопределение частоты работы УСАРТа, Пните куда надо
SpiritDance
сообщение Apr 17 2006, 18:25
Сообщение #1


Дух погибшего транзистора
****

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



Понадобилось, значит, мне сваять автодетект частоты передатчика при преме. Прием по УСАРТу. Передача либо от компа либо не от компа, протокола вобщем еще нет. Вопрос, как сделать, от чего оттолкнутся, как вообще это делают? Хелп. unsure.gif


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
DS
сообщение Apr 17 2006, 18:31
Сообщение #2


Гуру
******

Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250



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


По измерению длины битового импульса. В модемах пользют для этого момент прихода символов AT, с которых любая команда начинается. Если пытаться определить по произвольным символам, можно с первой попытки не угадать


--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
Go to the top of the page
 
+Quote Post
WHALE
сообщение Apr 18 2006, 04:10
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



На работе пользуем gsm-модемы,в них есть функция автоопределения скорости,если ее не выключить,
начинают сыпать сбои.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Apr 18 2006, 04:44
Сообщение #4


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 18 2006, 05:20
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Для детекта скорости обычно используют символ 0xFF. При этом входом служит не RXD UARTа, а вход таймера в режиме CAPTURE (режим захвата). В результате измеряется длительность стартового символа, при тактировании таймера от того же источника, что и UART. Поэтому знать частоту тактирования (кварца) не обязательно. Однако проблема в том, что далеко не во всех протоколах связи можно использовать символ синхронизации. Если вы планируете сделать автодетект скорости для своего собственного бутлоадера, это одно дело. А если планируете использоваеть его (автодетект) в обычной работе, то я бы категорически не советовал вам этого делать!
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Apr 18 2006, 07:42
Сообщение #6


Профессионал
*****

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



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

Ну так эти алгоритмы достаточно хорошо описаны в даташитах.
Например AT91SAM7S Series Preliminary страница 136.
В любом случае, в начале идет предопределенная последовательность,
а потом девайс отвечает, что частота найдена, можете передавать.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 18 2006, 11:12
Сообщение #7


кекс
******

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



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

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

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

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

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

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

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

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

Далеко не лучший выбор. Т.к. такой символ есть ни что иное как всего лишь однин импульс (стартбит). Большая вероятность того, что любая помеха будет воспринята как такой (0xFF) символ.
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Apr 18 2006, 18:21
Сообщение #8


Дух погибшего транзистора
****

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



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

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


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Apr 18 2006, 21:15
Сообщение #9


Профессионал
*****

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



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


Да нет, просто отслеживать событие в IO порте, а потом переключаться на УАРТ.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
otrog
сообщение Apr 19 2006, 07:11
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589



Цитата(SpiritDance @ Apr 18 2006, 22:21) *
Что касается использования, то это бутлоадер.

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

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

Успехов.

Сообщение отредактировал otrog - Apr 19 2006, 07:15


--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Apr 19 2006, 20:02
Сообщение #11


Дух погибшего транзистора
****

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



otrog
G thanks!!!


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Apr 19 2006, 22:16
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



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


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

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

И ещё мне удалось задетектить от 1200 до 115200 на AVR с частотой 7372.8М при выключенных прерываниях (слежу за флагами) на ассемблере. При этом запас по скорости не высок.
Go to the top of the page
 
+Quote Post
_artem_
сообщение Apr 20 2006, 09:57
Сообщение #13


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



kak odin iz vozmoznix variantov :

http://www.iol.ie/~ecarroll/autobaud.html
http://www.gaw.ru/pdf/TI/app/msp430/slaa215.pdf

A voobse proydis po guglu :

http://www.google.se/search?q=autobaud+alg...:en-US:official


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Apr 25 2006, 04:43
Сообщение #14


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 15th July 2025 - 02:42
Рейтинг@Mail.ru


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