определение скорости UART спомощу ардуино

Buzoff
Offline
Зарегистрирован: 03.04.2018

здравствуйте.

мозможно ли как-то (может такие проэкты существуют) определять скорость ЮАРТ ардуиной (атмегой8)?

возможно по принципу логического анализатора. или как-то вычеслять минимальную длительность сигнала, близкой к стандартным скоростям.

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

как то наверное можно, ведь например GSM модемы могут автоматически подстраиваться под скорость.

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

а если вам необходимо определять скорость абстрактного любого сигнала....боюсь мощности ардуино тут не хватит.

Buzoff
Offline
Зарегистрирован: 03.04.2018

определять нужно будет однотипные устройства, которые работают на стандартных скоростях 9600, 19200, 38400, 57600 и 115200 бод.

это вроде 10мкс, 5мкс, 2,6мкс, 1,7мкс, 0,9мкс соответственно.

первые две скорости наверное еще можно будет вычеслить, а вот три крайние проблемные.

остается еще второй вопрос, как это правильно сделать?

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Надо копать в сторону частомера и подгонять к стандартным значениям. ИМХО. В сети этого (частомеров) на ардуинке много.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Buzoff пишет:

определять нужно будет однотипные устройства, которые работают на стандартных скоростях 9600, 19200, 38400, 57600 и 115200 бод.

это вроде 10мкс, 5мкс, 2,6мкс, 1,7мкс, 0,9мкс соответственно.

первые две скорости наверное еще можно будет вычеслить, а вот три крайние проблемные.

остается еще второй вопрос, как это правильно сделать?

 

Ноль потерял... 1 000 000 / 115 200 = 8.6

Buzoff
Offline
Зарегистрирован: 03.04.2018

насколько я понял, частотомер считает количество прерываний за 1 сек, и работает с ровномерной частатой. 

а передача данных не совсем равномерный частотный сигнал. (выражаюсь как могу)

я это вижу так: принимая какието данные измеряем длину импульсов, выбираем тот который самый короткий и попадает в диапазом стандартных скоростей (чтоб отсеить шумы). возможно делаем это несколько раз и сравнивниваем результат. и так определяем скорость

подскажите, ардуино не может работать с наносекундами, только мкс?

Buzoff
Offline
Зарегистрирован: 03.04.2018

wdrakula пишет:

Buzoff пишет:

определять нужно будет однотипные устройства, которые работают на стандартных скоростях 9600, 19200, 38400, 57600 и 115200 бод.

это вроде 10мкс, 5мкс, 2,6мкс, 1,7мкс, 0,9мкс соответственно.

первые две скорости наверное еще можно будет вычеслить, а вот три крайние проблемные.

остается еще второй вопрос, как это правильно сделать?

 

Ноль потерял... 1 000 000 / 115 200 = 8.6

 

каждый бод это примерно 10бит (1 старт бит + 8 бит + 1 стоп бит)

или 115200бод  это и есть 115200бит?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Buzoff пишет:

каждый бод это примерно 10бит (1 старт бит + 8 бит + 1 стоп бит)

или 115200бод  это и есть 115200бит?

Охренел???????????

115200 это БИТОВАЯ СКОРОСТЬ! Мля! Где таких берут?! Почему не в армии?

Buzoff
Offline
Зарегистрирован: 03.04.2018

wdrakula пишет:

Buzoff пишет:

каждый бод это примерно 10бит (1 старт бит + 8 бит + 1 стоп бит)

или 115200бод  это и есть 115200бит?

Охренел???????????

115200 это БИТОВАЯ СКОРОСТЬ! Мля! Где таких берут?! Почему не в армии?

да чет тупанул))

ну тогда не все так печально. думаю с такими импульсами ардуина справится

не хотелось бы изобретать колесо, никто с готовой  реализацией подобной задачи не сталкивался?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Путь истиного программиста - это езда с костылями на самодельных велосипедах! И я ничего не перепутал, это действительно так.

Проще тебе написать 15 строк своего кода, для определения длительностей импульсов, чем искать на просторах инета.

Buzoff
Offline
Зарегистрирован: 03.04.2018

wdrakula пишет:

Путь истиного программиста - это езда с костылями на самодельных велосипедах! И я ничего не перепутал, это действительно так.

Проще тебе написать 15 строк своего кода, для определения длительностей импульсов, чем искать на просторах инета.

полностью согласен) 

буду пробовать. если у кого есть еще какие-то подсказки, варианты решений, какието ньюансы, озвучивайте, буду только рад, может что-то пригодится при составлении алгоритма.

еще нужно как-то заставить устройства что-то передавать, чтоб было что анализировать)

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

да какие там "варианты"? Записываешь по каждому изменению состояния линии количество прошедших микросекунд и выбираешь меньшее значение. Это похоже реализованно в библиотеке RC-switch, хоть она и о другом. Низкие скорости ты так определишь. Высокие - ну пробуй... до какой уверенно будешь определять низкие, с высокими есть другие приемы. К тому времени или сам поймешь, что с высокими скоростями делать или поймешь, что и как спрашивать.

Buzoff
Offline
Зарегистрирован: 03.04.2018

вобщем, проверил на паре таких устройств, ничего они не шлют и некак не риагируют на входящие байты.

возможно должна прийти конкретная информация на которую будет отклик, а это уже проблема((

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

а начать с просмотра линии логическим анализатором - не спортивно? ;)

Buzoff
Offline
Зарегистрирован: 03.04.2018

wdrakula пишет:

а начать с просмотра линии логическим анализатором - не спортивно? ;)

у меня его нет. я подключал устройство к терминалу и смотрел шлет ли устройство какието запросы, и попробовал отправить какие-нибудь символы, но в ответ тишина.

логический анализатор в данном случае что-то показал бы?

еслиб был какой-то сигнал, то и терминал что-то да показал, хоть бы какуюто абракатабру.

strarbit
Offline
Зарегистрирован: 12.06.2016
wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

 я далек от подсчета денег в чужих карманах, но 500р - не совсем деньги, да?

логический анализатор

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

wdrakula пишет:

Путь истиного программиста - это езда с костылями на самодельных велосипедах! И я ничего не перепутал, это действительно так.

Проще тебе написать 15 строк своего кода, для определения длительностей импульсов, чем искать на просторах инета.


Нет там никаких импульсов.
Там есть место (временное окно) где может появляться 0 или 1
А может и не появляться.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

wdrakula пишет:

а начать с просмотра линии логическим анализатором - не спортивно? ;)


Именно так и надо делать.
Saleae называется.

Buzoff
Offline
Зарегистрирован: 03.04.2018

wdrakula пишет:

 я далек от подсчета денег в чужих карманах, но 500р - не совсем деньги, да?

логический анализатор

вопрос сейчас не в деньгах, а в отсутствии анализатора (ну ненужен был он мне до этого времени, теперь закажу). поэтому пытался выйти из ситуации доступными способами. но не получилось. 

 

 

Buzoff
Offline
Зарегистрирован: 03.04.2018

trembo пишет:
wdrakula пишет:

Путь истиного программиста - это езда с костылями на самодельных велосипедах! И я ничего не перепутал, это действительно так.

Проще тебе написать 15 строк своего кода, для определения длительностей импульсов, чем искать на просторах инета.

Нет там никаких импульсов. Там есть место (временное окно) где может появляться 0 или 1 А может и не появляться.

а чем тогда является изменение напряжения между нулями (010) и еденицами (101)?

длинну этих импульсов я и планировал измерять.

или там все происходит как-то не так?

Buzoff
Offline
Зарегистрирован: 03.04.2018

.

Buzoff
Offline
Зарегистрирован: 03.04.2018

.

Logik
Offline
Зарегистрирован: 05.08.2014

Задача тривиальнейшая, меряеш интервалы между соседними перепадами, не взирая на полярности, и набираеш статистику в виде гистограммы. Диапазоны гистограммы неравномерные, в этом случае типа 5-15мксек; 15-22мсек; и т.д. чтоб интервал соответствующий ожидаемой скорости был в центре каждого диапазона. Проверяеш что получилось. Если максимум в самом коротком из ненулевых диапазонов - ОК, это скорость, если иначе  - тогда по вкусу: 1.повторяеш замер или 2.пробуеш первый заполненый диапазон и максимальный по  - скорость в одном из них или 3. выводиш гистограмму, рассматриваеш/чешеш затылок/выкладываеш сюда.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Что-то в этом есть.
Найти самый короткий импульс и скорее всего
это будет переход с "0" в "1" и обратно в "0" ( или наоборот 1>0>1).
Значит частота тактов нам уже известна.

Logik
Offline
Зарегистрирован: 05.08.2014

По самому короткому можна, если помех нет, дребезга при подключении нет. Вобщем в идеальном случае. В реальном на основе статистики.

Но и так и так тоже не 100%, зависит от того, какие символы на вход прийдут, может оказатся что и ни одного длинной в один бит не будет! Такая подлянка ))) Тогда надо правильные байты отправлять или подробней делать логический анализ гистограммы, из предположения что максимум на длительностях от 2 до 4 бит.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Вряд-ли где-то  кто-то будет только "00" передавать :)
Так что короткие импульсы всегда найдутся.
Даже у "FF" будет короткий "старт" в ноль.
 

a5021
Offline
Зарегистрирован: 07.07.2013

У всех семейств STM32, что посвежее F1, есть "Auto baud rate detection" -- фишка, которая позволяет подцепить мк к линии не конфигурируя скорость порта. Оно само измерит все длительности и само себя сконфигурирует для работы на нужной скорости.

Если задача измерить скорость передачи в линии, то можно подключить отладочную плату, а потом просто прочитать значение соответствующих регистров в микроконтроллере.

Logik
Offline
Зарегистрирован: 05.08.2014

trembo пишет:

Вряд-ли где-то  кто-то будет только "00" передавать :)

Даже не сомниваюсь что уникум найдется! :) И будет как обычно - у всех работает, а у него нет - памагите!!!!

Buzoff
Offline
Зарегистрирован: 03.04.2018

Вероятность того что не будет таких последованостей как 010 или 101, есть. Потому что повлиять на то что будет слать устройство, на котором определяется скорость, нельзя, это прописано производителем изначально. Устройство может вообще ничего не слать пока не получит нужную команду из вне. Была мысыль не ловить один бит (минимальный импульс в диапазонах скоростей), а ловить целый байт, но есть две проблемы:

1. Это то что у некоторых устройств есть проверка на четность/нечетность, а это +1 бит, еще есть вероятность двух стоповых битов, тоже +1 бит. Это может и незначительное отклонение при расчете скорости, но все же.

2. Главная проблема, я не знаю какие паузы между байтами. Если паузы длинною в 1 бит (или даже меньше байта), то вычленить байт с потока данных не получится

Вобщем, заказал логический анализатор, буду смотреть точнее, что там происходит.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

В подтверждение вышесказанному:

Например, протокол MIDI предусматривает при отсутствии возействия на органы управления (никто не нажимает на клавиши и не крутит ручки) периодическую передачу команды 0xfe, которая представляет собой одиночный отрицательный импульс. Если знать, что это именно 0x0fe, то скорость порта определить можно, а если не знать? И 0xf0 и 0x80 выглядят тоже в виде одиночного отрицаиельного импульса.

Buzoff
Offline
Зарегистрирован: 03.04.2018

Logik пишет:

trembo пишет:

Вряд-ли где-то  кто-то будет только "00" передавать :)

Даже не сомниваюсь что уникум найдется! :) И будет как обычно - у всех работает, а у него нет - памагите!!!!

еще раз повторюсь, не кто-то, а что-то! скорость нужно определить одного из множества аналогичных блоков управления, которые шлют то что им хочется (повлиять на это нельзя) или вообще просто так ничего не шлют пока не получат какуето команду, а если и так, то команду нужно отправить на правильной скорости, чтоб блок ее понял и что-то ответил. а так получается замкнутый круг.

для того чтоб выяснить какие именно команды (байты) заставят блок откликнуться, я планировал посмотреть, что именно шлет програмное обеспечение ПО, пытаясь соединиться с блоком. потом весь список этих команд слать по очереди на разных скоростях пека блок что-то не ответит. 

вопрос по ходу. если я активировал Сериал (Serial.begin(speed))на одной скорости, для того чтобы запустить его на другой скорости его нужно закрывать (Serial.end()) или просто запускать на новой скорости?

Buzoff
Offline
Зарегистрирован: 03.04.2018

Logik пишет:

По самому короткому можна, если помех нет, дребезга при подключении нет. Вобщем в идеальном случае. В реальном на основе статистики.

не по самомому короткому, а по самому короткому и в диапазоне скоростей. так по идеи исключатся помехи и дребизг, если не попадут в диапазом скоростей)))

strarbit
Offline
Зарегистрирован: 12.06.2016

Вы можете смотреть техническая спецификация atmega328 глава 24.9.1 Asynchronous Clock Recovery. чип контроллер синхронизирует часы для процесс выборки входящих кадров (фреймов) 

Logik
Offline
Зарегистрирован: 05.08.2014

//вообще просто так ничего не шлют пока не получат какуето команду,

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

//не по самомому короткому, а по самому короткому и в диапазоне скоростей. так по идеи исключатся помехи и дребизг, если не попадут в диапазом скоростей

плохая идея. Ну попадет короткий импульс в диапазон. Например при коммутации линии. Там что хош в таком случае будет, в т.ч. и в диапазоне скоростей, он вощето широченный. Нельзя по одному факту решать. Статистика нужна.

Buzoff
Offline
Зарегистрирован: 03.04.2018

strarbit пишет:

Вы можете смотреть техническая спецификация atmega328 глава 24.9.1 Asynchronous Clock Recovery. чип контроллер синхронизирует часы для процесс выборки входящих кадров (фреймов) 

а можете обьяснить своими словами, как это работает?

Buzoff
Offline
Зарегистрирован: 03.04.2018

Logik пишет:

//вообще просто так ничего не шлют пока не получат какуето команду,

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

//не по самомому короткому, а по самому короткому и в диапазоне скоростей. так по идеи исключатся помехи и дребизг, если не попадут в диапазом скоростей

плохая идея. Ну попадет короткий импульс в диапазон. Например при коммутации линии. Там что хош в таком случае будет, в т.ч. и в диапазоне скоростей, он вощето широченный. Нельзя по одному факту решать. Статистика нужна.

не, ну не прям по одному, по нескольким по какойто закономерности.

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

Buzoff
Offline
Зарегистрирован: 03.04.2018

Вобщем написал скетч с прерыванием, на низких скоростях работает норм, а вот на 57600 и 115200бод уже разброс по значениям минимального импульса большой. Отлечить две эти скорости невозможно.
Какой вообще минимальный импульс прерывание может нормально определять (кварц 16мгц)? В интернетах какой информации не нашел.
Смотрел частотомеры на ардуино, встречались до 4мгц, но скетчи там написаны на чистом языке, я не разберусь.

Buzoff
Offline
Зарегистрирован: 03.04.2018

народ, подскажите, есть ли на ардуино (16мгц) мозможность измерять длину импульсов меньших 10мкс?

Jeka_M
Jeka_M аватар
Онлайн
Зарегистрирован: 06.07.2014

Используйте аппаратные таймеры.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Buzoff, вот мой вариант,  на асме писал.

Buzoff
Offline
Зарегистрирован: 03.04.2018

Jeka_M пишет:

Используйте аппаратные таймеры.

да вот пытаюсь разобраться с этими таймерами.

Buzoff
Offline
Зарегистрирован: 03.04.2018

dimax пишет:

Buzoff, вот мой вариант,  на асме писал.

по описанию, вроде то что мне нужно. осталось разобратся))

а как-то можно сделать чтоб измеряло длину импульса по принципу CHANGE (при смене значения на порту, с LOW на HIGH и наоборот), и както собрать значения м масив?

и при выходе за диапазон выдавало на левые цифры, а к примеру НОЛЬ.

Buzoff
Offline
Зарегистрирован: 03.04.2018

dimax пишет:

Buzoff, вот мой вариант,  на асме писал.

или просто подскажите, способ с таймером может реагировать на смену значения на порту, с LOW на HIGH и наоборот одновременно (по аналогии с прерыванием CHANGE)? 

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Buzoff пишет:

способ с таймером может реагировать на смену значения на порту, с LOW на HIGH и наоборот одновременно (по аналогии с прерыванием CHANGE)? 

Может, но с нюансом - либо одно, либо другое. Логика выбирается  битом ICES (Input Capture Edge Select). Но это не проблема, в своём примере я как раз  ловлю и так и эдак именяя этот бит, обратите внимание на комменты в функции rising(falling) icp detect.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Buzoff,   кстати забыл сказать - некоторые модели stm32 имеют аппаратный автодетект скорости uart :) Правда в "народной" серии F103 к сожалению  нету.

APJ
Offline
Зарегистрирован: 25.03.2015

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

Требуется 6 различных последовательностей импульсов.

Пока написал так-

digitalWrite(13, HIGH);
delayMicroseconds(300);
digitalWrite(13, LOW);
delayMicroseconds(120);
digitalWrite(13, HIGH);
delayMicroseconds(480);
digitalWrite(13, LOW);
delayMicroseconds(300);

Вроде похоже, но хочется более изящного решения

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Изящного с какой точки зрения?

APJ
Offline
Зарегистрирован: 25.03.2015

При использовании delay остальная часть программы не работает нормально. Если делать через millis()  то выходит слишком длинный код.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну да, есть такая проблема у программ - иногда они выходят длинными. Порой - очень длинными. Такие штуки, как циклы, массивы и структуры известны вам?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ARJ, в даннгом случае целесообразно данные по длительностям записать в массив, настроить таймер на генерацию прерываний раз в 60 мкс, и в прерывании решать, пришло время переключать пин или нет.