Понимаю что тема избитая, но все же. Время выполнения команды ардуино 1 такт, 2 такта или n тактов. Кварц 16 Мгц. 1 такт - 1/16 000 000 гц * 1 000 000 (мкс) = 0,0625 мкс т.е. 1 тактовые команды выполняются за 0,0625 мкс, 2 тактовые за 0,125 мкс и т.д. Это так?
Угол зажигания на машине, на шкиву 60 зубов, т.е. каждый зуб 6 градусов, при оборотах 6000 отсчет уже между зубьями проходит за 166 мкс. Поэтому и такты считать, чтобы не пропустить следующий отсчет
И Ардуино IDE не самый лучший инструмент для подсчета каждого такта. Вот интересное исследование сколько времени съедают только вызовы loop(): http://arduino.ru/forum/programmirovanie/chastota-vyzovov-loop Также нужно помнить, что команды работы АЦП и записи в EEPROM требуют существенно больше одного такта.
я думаю для посчета угла и минимальных действий должно хватить, задачи сделать инжектор с кучей датчиков не стоит, а для отслеживания нескольких датчиков, да и то не в аналоговом режиме вполне достаточно
вот фрагмент из моего проекта, где есть отладочный расчет времени выполнения чего-то: Код (C++): #define PROCTIME // закомментировать после отладки #ifdef PROCTIME // Проверяем, сколько времени занимает выполнение функции long processTime = millis(); #endif // здесь делаем что-то #ifdef PROCTIME Serial.print("Execution time: \t\t\t"); Serial.print(millis() - processTime); Serial.println(" ms\n"); #endif
нет, это скелет для дальнейшей работы ТС Ну и миллисекунды можно заменить на микросекунды, для большинства применений точности хватит.
Если уж так нужно узнать время выполнения, запускаете 16-битный таймер с prescaler=1, делаете, что нужно, останавливаете таймер, считываете его значение, из этого вычитаете значение таймера, соответствующее пустому действию (если оно не равно 0). При этом действие не должно занимать более 64k тактов, т.е. ~4мс при 16 МГц.
я вставляю команду пин(какой нибуль)=1 в начале и пин=0 в конце сегмента, длительность которого нужно измерить, и смотрю на осциллографе.
Самый простой и надежный способ, особенно, если дергать пин через регистр, а не библиотечной командой.
конечно через регистр, я с библиотечными командами и не дружу, например PINB.1=1; и PINB.1=0; Очень удобно, когда минимизируешь время обработки прерывания