Во втором скетче широкий импульс опять есть перед пропущенными. Сейчас первый посмотрю.
Итак, скрин к первому скетчу твоему:
А это ко второму:
Я разницу не вижу. Если она есть - нужно выяснить с чем она связана?
Может быть действительно проблема в резисторе?
Ну тогда можно и к энкодеру перейти (код уже позволяет).
Здесь все одинаково. Этот импульс появляется не каждый раз перед пропущенным, а перепрыгивает через раз. Но стабильно . Сейчас попробую поймать. Во втором скетче.
Хорошо бы его и «поймать» и когда именно он происходит выловить.
У меня кроме резистора и ТМ1637 ничего не подключено.
Попробуй отключить для начала резистор (но мне в него не верится уже), а потом ТМ1637. Для теста.
Что значит «чередуется с нормальным»?
Вот первый (из последнего сообщения) скрин, что было?
Поясни (разверни подробнее) эту фразу.
Во втором скетче нормальный импульс есть( на втором фото) , но за ним через 58 зубов проскакивает широкий импульс перед пропущенным( на первом Фото).
Опиши как ‘поймать’ этот «пропущенный». Я делаю максимальную развертку (чтобы видеть импульсы пропущенных ещё) и потом приближаю. Как это делаешь ты?
BOOM, на моем осцил.на фото кнопка ок. Она под зеленой наклейкой. Я на нее нажимаю и экран останавливается. Развертка 0.5 мс.
BOOM, предлагаю отдохнуть)
Я, конечно же , далеко не гений (да и не пытаюсь им казаться), но я понимаю как работают код который я написал.
Увеличиваться длительность импульса в прерывании может только если её другое прерываение «прерывает». Такое возможно, но слабо верится чтобы оно на столько прерывало (хотя в ардуино и не такое может быть).
Но именно чтобы определенный импульс - такого быть, скорее всего, не может. Ты можешь исследовать не только пред импульс (что перед большими пропусками) но и все остальные?
Поддерживаю. Нужно «переварить» информацию, заодно поищу у себя 1637 (вроде где-то были).
Хороших выходных.
analogRead да и map для чисел long - выполняются довольно долго. И расположены они по времени как раз перед первыми “пробелами”. Вполне возможно, именно они и увеличивают ширину импульса перед “пробелами”.
Длительность analogRead - примерно 112 мкс, map по идее - тоже десятки (а то и вся сотня) мкс. При большой частоте это должно сказываться.
Вывод: нужно заранее измерить время выполнения блока внутри if (millis() - mill > 1000) и вычитать его из tick_delay при первом проходе цикла.
Только вот беда: по моим подсчетам минимальное значение tick_delay примерно 91, а поправка по прядку величины ~200, т.е. на высоких частотах такой алгоритм не реализуем.
PS. Вероятно, нужно этот блок (который с if) выполнять внутри первого пробела, тогда у нас будет лимит времени более 270 мкс.
То есть технология, как я вижу, такая:
- Заранее измеряем время выполнения внутри
if, и заносим его в константуdelta_delay. - В нашей программе гоним общий цикл (но не до 240, а до 236), и проверку осуществляем внутри цикла по значению счетчика
i. - При
i == 0осуществляем проверку и настройку частоты. Задержка при этом3*tick_delay - delta_delay. - При
i == 1делаем задержку3*tick_delay. - При всех остальных
iзадержкаtick_delay.
А как это сказывается на прерываниях по совпадению? Поясни пожалуйста.
В заголовке темы указано, что решение приведено в сообщении №16. Именно по нему я и готовил ответ. Там никаких прерываний нет.
Это к тому, что если ТС хочет получить адекватный совет, то следует поддерживать заголовок в актуальном состоянии.
Укажите хоть номер поста. в котором содержится обсуждаемый вариант программы. Без этого как-то непонятно, на что ориентироваться.
В заголовке в качестве ответа указан минимально модифицированный РАБОЧИЙ код от ТС (правил я).
А далее он захотел приделать к нему ТМ1637 и после этого код перестал работать. Я переписал его на работу по прерываниям (вместо первоначального - цикл с задержками в лупе). Сохранив при этом вывод на ТМ1637.
Но ТС говорит, что код работает не правильно - перед пропусками двух «зубов» у него более длинный импульс и якобы от этого остальные блоки «не переваривают» сигнал. У меня такого нет. На этом вчера и разошлись…
Тот код я выложил в сообщении #44.
Но ты, как полный педант, мог бы и прочитать тему для полного понимания (не так и много сообщений в ней). Не в твоих же правилах «прыгать по верхам», а зачем то ТС обвинил ))



