измерение длины импульса

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

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

пытаюсь решить вопрос с определением скорости uart, с помощу ардуино (16мгц)

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

по факту, временные интервалы получаются немного меньше расчетных, например, при получении данных на скорости 57600бод, минимальные импульсы получаются 12 и 16мкс иногда 8мкс (в реалии 17мкс). но проблемма не в этом. просто когда пытыюсь замерять импульсы на скорости 115200бод, то минимальный импульс равен 8мкс и ниже засечь нельзя.

вопрос. есть ли какието другие способы или методы для измерения импульсов короче 10мкс?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Buzoff пишет:

вопрос. есть ли какието другие способы или методы для измерения импульсов короче 10мкс?

А каким способом Вы польуетесь? А то не зная этого, как определить "другой" этоили не "другой"?

То, что Вы описали - ничего не говорит,тоже самое можно сделать миллионом способов.

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

через прерывание.

функция прерывания выглядит примерно так (скетча сейчас нет под руками, поэтому по памяти):

time[x++] = micros() - timeold;

timeold = micros();

if (x > 99) x = 99;     // был обьявлен масив размером [100]

 

от реальных отличается на 4-8мкс в минус, и ниже 8-10мкс не получается.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Точность функции micros - 4 мкс. Так что для таких маленьких интервалов она неприменима.

Измеряйте таймером. Можно по его (таймера) собственному прерываю по захвату изменения (на 8-ом пине, если у Вас uno/nano), а можно и по внешнему прерыванию, как Вы делали. Первое проще реализовать без потери точности. Второе надо очень аккуратно программировать.

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

Buzoff пишет:

вопрос. есть ли какието другие способы или методы для измерения импульсов короче 10мкс?

Конечно. Запрещаете прерывание в цикле вводите отсчеты напрямую с порта и сохраняете в массиве. Затем анализируете. Надо только откалибровать на известных импульсах. Должно получится в раене пол микросекунды.

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

буду разбераться с таймерами)

вопрос по ходу, как-то можно быстро одмим махом очитить (обнулить) массив?

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

Можно. На ресет нажать. А неторопливые люди memset() пользуются. Но это не для очистки, а для заполнения.

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

sadman41 пишет:

Можно. На ресет нажать. А неторопливые люди memset() пользуются. Но это не для очистки, а для заполнения.

в моем случае это будет выглядить так?

memset(time0, 100);

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

а что вы хотите в байты запихать - 0x48, если '0' предлагаете ему? В любом случае будет веселее memset(time, ..., sizeof(time));

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

sadman41 пишет:

а что вы хотите в байты запихать - 0x48, если '0' предлагаете ему? В любом случае будет веселее memset(time, ..., sizeof(time));

я хочу в мой масив unsigned long time[100], при необходимости, записать нули

одинарные кавычки я случайно не убрал в предыдущем посте (просто скопировал и не глянул)

 

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

Ну, значит, подойдет, ежели нулями заполнить.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

тока sizeof(time[100]) = 400

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

Ну... а в чем проблема? sizeof(uint_32) * 100 заполненное нулями - то же самое, что sizeof(uint_8) * 400 заполненное нулями.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

У ТС написано так

memset(time0, 100);

 

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

Это пусть исправляет, конечно.

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

sadman41 пишет:

Это пусть исправляет, конечно.

тоесть вот так?

memset(time0, 400);

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

Ну чем вам простой sizeof на массив не нравится... 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

да. чота я туплю под вечер. 

memset(time, 0, sizeof(time));  

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

sadman41 пишет:

Ну чем вам простой sizeof на массив не нравится... 

 вобщем писать вот так memset(time, 0, sizeof(time));?

я просто не знаю С++.  почитал о данной функции, там вроде третье значение это размер масива, вот и написал 100 (у меня в скетче обьявлен unsigned long time[100];)

помогите разобратся с основной проблемой данной темы.

 

 

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

Первая ссылка в яндексе: http://cppstudio.com/post/673/

  • memptr

    Указатель на блок памяти для заполнения.
  • val

    val передается в виде целого числа, но функция заполняет блок памяти символом, преобразуя это число в символ.
  • num

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

Количество байт. Какой размер массива? Ну сделайте вы массив из четырех long, забейте его разными значениями через memset и посмотрите что в Serial вылезает. Два дня простую функцию объяснять что ли?

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

sadman41 пишет:

Первая ссылка в яндексе: http://cppstudio.com/post/673/

  • memptr

    Указатель на блок памяти для заполнения.
  • val

    val передается в виде целого числа, но функция заполняет блок памяти символом, преобразуя это число в символ.
  • num

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

Количество байт. Какой размер массива? Ну сделайте вы массив из четырех long, забейте его разными значениями через memset и посмотрите что в Serial вылезает. Два дня простую функцию объяснять что ли?

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

помогите с таймерами разобратся.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Buzoff пишет:

помогите с таймерами разобратся.

AVR130: "Setup and Use of AVR Timers" 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Buzoff пишет:

помогите с таймерами разобратся.

AVR130: "Setup and Use of AVR Timers" 

Вот, поддался с утреца, посмотрел, мым жеж не грамотные, мы на ём тока разговариваем )))
 

За ссылку благодарность, сохранил

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

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

или только по смене значения с LOW на HIGH? 

или только по смене значения с HIGH на LOW?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Зависит от того, какой именно таймер, какой именно порт, нужен ли этот пин ещё для чего-нибудь и т.п. Вопросов больше, чем ответов. Если, например, таймер 1, то он может работать от любых (какие скажете) изменений на 8-ом пине или на 5-ом пине. Но логика работы при этом разная. На 8-ом запоминается значение, а на 5-ом просто происходит тик. Это есть по той ссылке, что я давал (не конкретные пины, а логика работы, конкретные пины есть в даташите)

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

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