Измерение длительности

KamovEugeniy
Offline
Зарегистрирован: 24.02.2014

Как с максимальной возможной для arduino точностью измерить длительности ( 1/25000  ... 1/5000 сек ) периода между фронтами  импульсов? Наверное уже  писали об этом, но я не нашел.

Повлияет ли на результат измерения длительность выполнения команд и можно ли этого избежать, если работать по прерыванию?

Какой процессор arduino взять для этого ?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

длительность измерить просто. micros вам в помощь

с помощью флага можно добиться отсутствие глюков в измерении во время исполнения программы

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

gena
Offline
Зарегистрирован: 04.11.2012

  Ищите "тахометр на AVR, ардуино".

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

Читаните еще тут.

KamovEugeniy
Offline
Зарегистрирован: 24.02.2014

jeka_tm пишет:
длительность измерить просто. micros вам в помощь

с помощью флага можно добиться отсутствие глюков в измерении во время исполнения программы

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

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

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

KamovEugeniy
Offline
Зарегистрирован: 24.02.2014

jeka_tm пишет:
длительность измерить просто. micros вам в помощь с помощью флага можно добиться отсутствие глюков в измерении во время исполнения программы но измерение только с помощью прерывания. ардуина любая по идее

флаг при активности прерывания ?

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

volatile unsigned long time = 0;        //Время срабатывания датчика
volatile unsigned long time = 0;        //Предыдущее время


void setup(){
  attachInterrupt(0, impuls, RISING);   //Прерывание по нарастающему фронту на D2
} 

void loop(){
  тут ваш код
  time время между импульсами
}
//                      Подпрограмма прерывания    
void impuls(){
  time =micros()-time_old; 
  time_old = micros(); 
}

попробуйте пока так. может и так пойдет

туда можно еще добавить флаг, а вдруг совпадет операция с time с прерыванием

KamovEugeniy
Offline
Зарегистрирован: 24.02.2014

можно подробней про совпадения, я думал прерывание нельзя прервать ?

и как посчитать точность контроллера, вроде бы у всех 5-вольтовых ардуин 16 МГц, а у арма ближе к 90

 

PS: у меня тут есть смежная тема - генератор для тестирования этой программы

может что подскажете, спасибо

http://arduino.ru/forum/programmirovanie/generator-impulsov

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

да вы и не сказали как часто надо измерять длительность

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

 

KamovEugeniy
Offline
Зарегистрирован: 24.02.2014

jeka_tm пишет:
  в прерывание можно добавить условие, в зависимости от которого будет исполнятся подпрограмма в прерывании или нет

да вы и не сказали как часто надо измерять длительность

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

Измерять нужно периоды от 1/2500   до 1/5000 сек , те  от 2,5 до 5 кГц (в первом сообщении ошибся, приписал  лишний ноль в 2500 )

Для генератора хочу поставить отдельную ардуину, а что нужно описать точнее  и почему без осциллографа не получится?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

сигнал периодический или случайный?

KamovEugeniy
Offline
Зарегистрирован: 24.02.2014

jeka_tm пишет:
сигнал периодический или случайный?

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

KamovEugeniy
Offline
Зарегистрирован: 24.02.2014

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

а точность желательно наибольшая , но какая возможна не знаю может быть вы подскажете?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

200 мкс минимальный период. успеет на прерываниях

ну не знаю, не тестировал сколько составляет скорость записи на SD или память SPI. плюс ваш какой то код, который неизвестного размера (и соответственно время исполнения), соответственно на запись не очень много времени если каждое значение писать.

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

что вы такое делаете?

KamovEugeniy
Offline
Зарегистрирован: 24.02.2014

jeka_tm пишет:
200 мкс минимальный период. успеет на прерываниях

ну не знаю, не тестировал сколько составляет скорость записи на SD или память SPI. плюс ваш какой то код, который неизвестного размера (и соответственно время исполнения), соответственно на запись не очень много времени если каждое значение писать.

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

что вы такое делаете?

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

измерять не постоянно, маленькими интервалами

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

процессор ни при чем. 200мкс минимальный период между импульсами (поделите 1с/5000 получите 200 мкс)

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

KamovEugeniy
Offline
Зарегистрирован: 24.02.2014

jeka_tm пишет:
процессор ни при чем. 200мкс минимальный период между импульсами (поделите 1с/5000 получите 200 мкс)
как частота процессора повлияет на точность, как измерить точнее чем 1 мкс?

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

чем выше частота процессора, тем короче импульс можно измерить

KamovEugeniy
Offline
Зарегистрирован: 24.02.2014

jeka_tm пишет:
чем выше частота процессора, тем короче импульс можно измерить

Это общепонятное утверждение, а конкретней. Возможно точность micros()  и зависит от частоты процессора, а как измерить менее 1 мкс , этот реально ?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

KamovEugeniy
Offline
Зарегистрирован: 24.02.2014

jeka_tm пишет:
хотите сказать ваш мотор делает больше 1млн оборотов в секунду? че то вы загнались по моему. а по теме. теоретически можно использовать timer1

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

если длина 200 мкс, а точность инструмента 1 мкс (micros () ), то +- несколько команд выполнение самой функции, пересылка данных могут понизить добавить время обработки еще десятки-сотни мкс и понимзить точность например до 50 мкс.

200 мкс (+-) 50 мкс, не очень хорошая точность

где бы посмотреть примеры для timer1 ?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

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

micros кстати переполняется через 70минут

Sheet99
Offline
Зарегистрирован: 27.02.2014

jeka_tm пишет:

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

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

micros кстати переполняется через 70минут

Вы долго плетете то, о чем не знаете. Для увеличения точности поможет 32-битный таймер.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Sheet99 пишет:

jeka_tm пишет:

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

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

micros кстати переполняется через 70минут

Вы долго плетете то, о чем не знаете. Для увеличения точности поможет 32-битный таймер.

 

там где точно не знал я это и сразу написал. 

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

да и еще в ардуине нет такого таймера. due не в счет

Sheet99
Offline
Зарегистрирован: 27.02.2014

jeka_tm пишет:
да и еще в ардуине нет такого таймера. due не в счет

с какого такого перепуга Due не в счет, если нужен таймер 32 бит?

 

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

Может так можно протестировать задержки и разрещающую способность микрос():

1) Физически соединяем 2 пина перемычкой, один из них - пин внешнего прерывания.

2) В программе настраиваем: один пин - OUT, второй пин - прерывания.

3) Выставляем на порту (работаем напрямую с портами GPIO) OUT-пина - 1, фиксируем микрос1() (или фикисровать до выставления надо!).

4) В прерывании по второму пину RISING фиксируем микрос2().

5) Вычисляем дельты микрос().

 

Второй тест подобный, но уже измеряем импульс:

3) Выставляем на порту OUT-пина - 1, фиксируем микрос1().

4) NOP - разное количество раз в тестах.

5) Выставляем на порту OUT-пина - 0, фиксируем микрос3().

6) В прерывании по второму пину RISING фиксируем микрос2().

7) В прерывании по второму пину FALLING фиксируем микрос4().

8) Вычисляем дельты микрос().
 
KamovEugeniy
Offline
Зарегистрирован: 24.02.2014

С прерываниями пока текст не осилю. Какой контроллер брать ?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Sheet99 пишет:

jeka_tm пишет:
да и еще в ардуине нет такого таймера. due не в счет

с какого такого перепуга Due не в счет, если нужен таймер 32 бит?

 

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

время исполнения команды микрос можно и проще ведь измерить. без дрыганья портом.

запомнили время. еще раз запомнили время но на вторую переменную. нашли разницу поделили на 2

или вы скажете снова я не прав

но с портом все равно надо тестировать. сколько времени пройдет пока сработает прерывание.

но по моему все это ловля блох и не нужна автору такая точность

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

KamovEugeniy пишет:

С прерываниями пока текст не осилю. Какой контроллер брать ?

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

KamovEugeniy
Offline
Зарегистрирован: 24.02.2014

Garry пишет:
Ну дык сначала тесты сделать надо, поглядеть разницу между  дельтами.

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

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

Провел второй тест на Меге 16Мгц:

START:
M2-M1: 8 us
M3-M2: 8 us
M4-M3: 8 us
M4-M1: 24 us
 
Код налабал в спешке, что сумел, может гуру подправят:
 
//  MCU MEGA2560: OK!
//  TEST PULSE: Определение dMicros импульса в прерывании
//  Пины D3 и D2 (INT0) физически замкнуты
//  Смотрим связку №Int - №pin в описании: http://arduino.cc/en/Reference/AttachInterrupt#.UwxGvuOqmfA


byte intNum = 0;   // внешнее прерывание INT0 на пине D2
byte outPin = 3;   // D3 OUTPUT, пины D3 и D2 (INT0) физически замкнуты

unsigned long micros1, micros3 = 0;
volatile unsigned long micros2, micros4 = 0;


//  ISR RISING
void isr_change() {
  
  //  2) 4)
  micros4 = micros();
  
}  // void isr_rising()


void setup() {
  
  delay(1000);
  
  Serial.begin(57600);
  Serial.println("START:");
  
  attachInterrupt(intNum, isr_change, CHANGE);
  
  // 1)
  
  //  a) RESULT = 12us
  //pinMode(outPin, OUTPUT);
  //micros1 = micros();
  //digitalWrite(outPin, HIGH);
  
  //  b) MEGA.D3 - MCU.PE5 : RESULT = 8us;
  micros1 = micros();
  DDRE  |= B00100000; // устанавливаем OUTPUT      // DDRE  |= (1<<DDE5);
  PORTE |= B00100000; // устанавливаем HIGH на D3  // PORTE |= (1<<PORTE5);
  
  asm volatile ("nop");  // для синхронизации
  asm volatile ("nop");  // 1-2 вызова должно хватать для сработки INT
  
  micros2 = micros4;
  micros4 = 0;
  
  // 3)
  micros3 = micros();
  DDRE  |= B00100000; // устанавливаем OUTPUT      // DDRE  |= (1<<DDE5);
  PORTE &= B11011111; // устанавливаем LOW на D3   // PORTE &= (0<<PORTE5);
  
  
  while (!micros4);
  
  Serial.print("M2-M1: ");  Serial.println(micros2-micros1);
  Serial.print("M3-M2: ");  Serial.println(micros3-micros2);
  Serial.print("M4-M3: ");  Serial.println(micros4-micros3);
  Serial.print("M4-M1: ");  Serial.println(micros4-micros1);
  
}  // void setup()


void loop() {
  
  
}  // void loop()

 

 

KamovEugeniy
Offline
Зарегистрирован: 24.02.2014

благодарю Garry , но не  понял что измеряете в тесте , какой интервал времени  -  например сумму задержек ... +  исполнения функции micros() или другое ?

Garry пишет:

Провел второй тест на Меге 16Мгц:

START:
M2-M1: 8 us
M3-M2: 8 us
M4-M3: 8 us
M4-M1: 24 us
 
Код налабал в спешке, что сумел, может гуру подправят:

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

Пытался на одном МК эмулировать и посылку и отлов одного импульса 0-1-0 для определения порядков затраченного времени на его фиксацию, получилось проверить время задержки отлова переднего и заднего фронта импульса с помощью прерывания:

M2-M1 = 8 мкс - интервал времени между переводом пина в состояние HIGH и фиксацией этого состояния в прерывании, т.е если пин изменит состояние, то программа узнает об этом в прерываании через 8 мкс (может чуть меньше!). Аналогичная задержка и по заднему фронту импульса при переходе в состояние LOW (M4-M3).

Еще я усмотрел странную вещь, если убрать одну операцию nop, то прерывание не успевало зафиксировать изменение состояния пина в HIGH, т.к. программа переводила пин уже в состояние LOW, а это говорит о каком-то минимуме длины импульса, которое МК может отловить. Наверняка этот праметр указан в даташите на МК.

Что еще можно увидеть из этого теста: длина эмулируемого импульса ~16 мкс (M3-M1) = длине импульса определенного программой - 16 мкс (M4-M2).

Рекомендации для следующих тестов:

1) Избавиться от micros() или учесть его влияние на измерения (было предложено выше jeka_tm).

2) Подавать с внешнего генератора реальные импульсы с известными параметрами, сравнивать с измерениями в программе. Тут реально можно найти минимальную длину импульса, можно сравнивать длины импульсов подаваемый-измеренный.

3) Протестировать фиксацию изменения состояния пина не прерыванием, а при помощи портов GPIO (тут бы на asm надо, а то в цикле ловить надо).

Я все. Может только (3) пункт проверю.

 

Лохота100
Offline
Зарегистрирован: 01.03.2014

Garry пишет:
Пытался на одном МК эмулировать и посылку и отлов одного импульса 0-1-0 для определения порядков затраченного времени на его фиксацию, получилось проверить время задержки отлова переднего и заднего фронта импульса с помощью прерывания:

M2-M1 = 8 мкс - интервал времени между переводом пина в состояние HIGH и фиксацией этого состояния в прерывании, т.е если пин изменит состояние, то программа узнает об этом в прерываании через 8 мкс (может чуть меньше!). Аналогичная задержка и по заднему фронту импульса при переходе в состояние LOW (M4-M3).

Еще я усмотрел странную вещь, если убрать одну операцию nop, то прерывание не успевало зафиксировать изменение состояния пина в HIGH, т.к. программа переводила пин уже в состояние LOW, а это говорит о каком-то минимуме длины импульса, которое МК может отловить. Наверняка этот праметр указан в даташите на МК.

Тут надо подумать над методикой теста, может быть ширина импульса мала и входы-выходы имеют паразитную емкость и для ее преодоления (перезарядки) нужен больший выходной ток и подтяжка к питанию.  Знаю что энкодеры работают на 16-мегагерцовых до 100 кГц это как раз 10 мкс

Еще возможно  8 мкс из-за нечистоты эксперимента. При входе в прерывание МК сохраняет регистры в стеке и тратит на это некоторое время.

 

А как вы хотите не на прерывании а на GPIO - опрашивать в цикле, это разьве лучше и быстрее?

любое прерывание прервет этот цикл ...

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

Лохота100 пишет:

Еще возможно  8 мкс из-за нечистоты эксперимента. При входе в прерывание МК сохраняет регистры в стеке и тратит на это некоторое время.

А как вы хотите не на прерывании а на GPIO - опрашивать в цикле, это разьве лучше и быстрее?

любое прерывание прервет этот цикл ...

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

Предполагается сделать тест без прерываний по измерению, если в МК происходят другие неявные прерывания, то т.к. от них нам тоже не избавиться (кстати, можно ведь запретить в тесте прерывания!), считаем, что их нет (или они есть всегда и мы учитываем этот факт). Надо проверить скорость на GPIO в цикле и сравнить с пред. тестом, вот и будет понятно что быстрее. Мне кажется, что проверка состояния бита в порту в цикле будет куда быстрее, чем реализация прерываний в том виде как она есть сейчас на языке высокого уровня.

Дааа, надо asm походу изучать и на нем писать рилтайм значимые куски кода. Как вставлять куски кода на asm, также как это проделано с крмандой nop?

 

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

Лохота100 пишет:

Тут надо подумать над методикой теста, может быть ширина импульса мала и входы-выходы имеют паразитную емкость и для ее преодоления (перезарядки) нужен больший выходной ток и подтяжка к питанию.  Знаю что энкодеры работают на 16-мегагерцовых до 100 кГц это как раз 10 мкс

Тут вы правы, я про это тоже подумал когда вставлял второй nop. Плюс, наверно фронт сигнала имеет не меандровую форму (криво сказал) - нарастает не мгновенно из-за этих емкостей.

Чет туплю про подтяжку к питанию. А можно подтянуть в моем тесте D2 (INT0) к питанию, прерыванию не помешает? И тогда D2 будет в состоянии 1 и надо менять логику теста?

KamovEugeniy
Offline
Зарегистрирован: 24.02.2014

Garry пишет:
Чет туплю про подтяжку к питанию. А можно подтянуть в моем тесте D2 (INT0) к питанию, прерыванию не помешает? И тогда D2 будет в состоянии 1 и надо менять логику теста?
Изменить резистор можно для повышения силы тока в нагрузке, те можно уменьшить резистор между выходом  и  +5В, с расчетом чтобы ток=U/R=5/R не превысит допустимого.  На вход INT0 влиять не должно, в крайнем случае применить делитель напряжения.

Я могу запустить генератор на отдельной 2560 (есть 3 шт, а Due только одна) , но в этом случае нужно мерить не время между возникновением фронта импульса и реакцией системы (входом в прерывание) , а  разность времени между двумя последовательными событиями Тсоб1 Тсоб2).  Заодно из результата уберется длительность обработки входа в прерывание  ( Т реакции ); Т1 и Т2 время входа событий 1 и 2 в прерывание

(это матем формулы,а не операторы присваивания:-) )

T1=Тсоб1+Треакции  

T2=Тсоб2+Треакции

delta=T2-T1= Тсоб2+Треакции - Тсоб1 - Треакции=Тсоб2 - Тсоб1

KamovEugeniy
Offline
Зарегистрирован: 24.02.2014

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

что есть хорошего в Due для данного случая (измерение)  кроме таймера ?

 

 

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

KamovEugeniy пишет:

Как с максимальной возможной для arduino точностью измерить длительности ( 1/25000  ... 1/5000 сек ) периода между фронтами  импульсов? Наверное уже  писали об этом, но я не нашел.

Тогда достаточно фиксировать время появления сигнала в программе?

Я чет запутался какие времена надо определить: время импульса (состояние HIGH) или период сигнала (между фронтами двух импульсов)?

Если фиксировать период, то все нормально, просто время фиксации будет сдвинуто на задержку (<= 8мкс).

 

KamovEugeniy
Offline
Зарегистрирован: 24.02.2014

Периоды между фронтами соседних импульсов и складывать в массив. Ставить по 1 шт arduino 2560 на генератор  и на измеритель ?

Да, лучше просто фиксировать время появления фронта и складывать его в массив.

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

KamovEugeniy пишет:

Периоды между фронтами соседних импульсов и складывать в массив. Ставить по 1 шт arduino 2560 на генератор  и на измеритель ?

Да, лучше просто фиксировать время появления фронта и складывать его в массив.

ну тут я несоветчик.

KamovEugeniy
Offline
Зарегистрирован: 24.02.2014

Garry пишет:
ну тут я несоветчик.

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

PS: вывод INT0 как PB0?  http://arduino.ru/Schematic/arduino-mega2560-schematic.pdf

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

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

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

KamovEugeniy пишет:

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

PS: вывод INT0 как PB0?  http://arduino.ru/Schematic/arduino-mega2560-schematic.pdf

1) Просто измерять время - быстрее, но дальше вопрос: а куда эти данные пойдут и кто будет делать их апостериорную обработку (например ПК)?

2) Про INT0 смотрите в программе, там все написано. НЕ ПУТАЙТЕ INT0 в терминах Arduino и подпись INT0 на ноге МК!

Для МЕГИ2560: прерывание Arduino.INT0 = пину Arduino.D2 = ноге MCU.PE4 (но если хотите отлавливать фронт в прерывании, то информация о ноге = MCU.PE4 не нужна, она нужна только при отлове с помощью портов GPIO/регистров).

KamovEugeniy
Offline
Зарегистрирован: 24.02.2014

Garry пишет:
1) Просто измерять время - быстрее, но дальше вопрос: а куда эти данные пойдут и кто будет делать их апостериорную обработку (например ПК)?

2) Про INT0 смотрите в программе, там все написано. НЕ ПУТАЙТЕ INT0 в терминах Arduino и подпись INT0 на ноге МК!

Для МЕГИ2560: прерывание Arduino.INT0 = пину Arduino.D2 = ноге MCU.PE4 (но если хотите отлавливать фронт в прерывании, то информация о ноге = MCU.PE4 не нужна, она нужна только при отлове с помощью портов GPIO/регистров).

1) предполагаю здесь же обрабатывать чуть позже, это не проблема в отличие от измерить

2) INT0 на этой схеме показана как  21-я нога ардуины 2560, MCU2560.PD0=Arduino.21, вы ее имеете ввиду?  http://arduino.ru/Schematic/arduino-mega2560-schematic.pdf

 

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

KamovEugeniy пишет:

2) INT0 на этой схеме показана как  21-я нога ардуины 2560, MCU2560.PD0=Arduino.21, вы ее имеете ввиду?  http://arduino.ru/Schematic/arduino-mega2560-schematic.pdf

Блин, ну как еще объяснить, ведь все написал наготово, читаем вдумчиво!

Смотрим сюда на табличку, сопоставляем что я написал: Для МЕГИ2560: прерывание Arduino.INT0 = пину Arduino.D2 = ноге MCU.PE4!

 

KamovEugeniy
Offline
Зарегистрирован: 24.02.2014

Garry пишет:
ну как еще объяснить, ведь все написал наготово, читаем вдумчиво!

Смотрим сюда на табличку, сопоставляем что я написал: Для МЕГИ2560: прерывание Arduino.INT0 = пину Arduino.D2 = ноге MCU.PE4!

теперь понятно все, кроме того, откуда в обозначении взялась буква D, на принципиальной схеме ее нет рядом, только PWLM

http://arduino.ru/Schematic/arduino-mega2560-schematic.pdf

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

KamovEugeniy пишет:

теперь понятно все, кроме того, откуда в обозначении взялась буква D, на принципиальной схеме ее нет рядом, только PWLM

Ну это я специально так отделяю "цифровые пины" от "аналоговых" (в терминологии Arduino) - например: D0 и A0 (хотя, как на форуме уже много раз говорилось, все пины МК цифровые, но некоторые несут дополнительный функционал в виде АЦП и в Arduino они обозначены A0-An, прямо так в прогамме и можно указать).

Пинмаппинг 2560.

Цветные картинки, выбирайте.

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

jeka_tm пишет:

время исполнения команды микрос можно и проще ведь измерить. без дрыганья портом.

запомнили время. еще раз запомнили время но на вторую переменную. нашли разницу поделили на 2

или вы скажете снова я не прав

Похоже не правы вы...

  prevMicros = micros();
  lastMicros = micros();
  
  Serial.println(prevMicros);
  Serial.println(lastMicros);
  Serial.println(lastMicros-prevMicros);  // ACHTUNG!!! 4 us
  
  prevMicros = micros();
  temp = micros();
  lastMicros = micros();
  
  Serial.println(prevMicros);
  Serial.println(lastMicros);
  Serial.println(lastMicros-prevMicros);  // ACHTUNG!!! 8 us

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

интересно почему 8 а не 6

ну тогда надо по другому попробовать



prevMicros = micros();
for(int i=0;i<1000;i++){
  temp = micros();
}
lastMicros = micros();

Serial.println(prevMicros);
Serial.println(lastMicros);
Serial.println((lastMicros-prevMicros)/1000);

получилось 3

но и ваши предыдущие данные подтверждаются. странно