День добрый, коллеги! Возникла задача по кнопке (сидящей на прерывании) на одном из пинов надо выдать одиночный импульс длиной, скажем, 100 мсек. Delay() и Millis(), как я понимаю, в прерывания не суют. Одним из выходов вижу в прерывании объявить некий флаг как “true”, а Loop’e смотреть: если он “true”, то подать на пин “HIGH”, а по прошествии времени (через Millis()) - подать “LOW“ и обнулить флаг. Правильно ли я рассуждаю? Или есть некий оператор для такого действия (увы, не нашел…). Или есть еще какой-то более изящный способ?
А чё, я так и писал в первом посте. В общем, понял, моя “мысля“ получила одобрение у титанов. Так и поступим. Вообще-то доктора страсть как не любят советы. А я - люблю. Наверное, я плохой доктор, неправильный :). И еще: спасибо за запоминание миллиса В ПРЕРЫВАНИИ! Это правильно.
Отчего же не суют. Суют. Но, как правило, не больше одного вызова на прерывание: последовательный вызов millis() внутри прерывания с большой вероятностью вернет одинаковые значения, но тут зависит от Ардуины - на каком процессоре сделана. Например, на ESP32 - millis() работает от фонового микросекундного таймера, и можно его вызывать сколько хочешь раз в прерывании, получая корректные значения. А на какой-нибудь простенькой Ардуине millis() сам зависит от прерываний.
В принципе, если у тебя простенький скетч, который особо ничего не делает, то можно и внутри прерывания подождать, чтобы скетч не усложнять.
Но если задержки большие (>100мс) то в прерывании ждать плохо - вся система же стоит, ждет, когда прерывание будет обработано. Остальные прерывания не работают в это время, система в коме :). На процессорах типа ESP32 в таких случаях система будет перезагружена Interrupt Watchdog Timerом - типа, слишком долго обрабатываем прерывание.
Задержки внутри прерываний делаются “в лоб“ :
...
...
for (int i = 0; i < X; i++)
asm volatile ("nop\r\n");
Смотришь, сколько по времени выполняется NOP (обычно - 1 такт процессора, 1/CPU_Frequency; ), подбираешь полуэкспериментально параметр X.
Да, в моем случае дребезг недопустим. Есть такая микруха MC14490. Поигрался с ней. Что энкодер, что кнопка - после микрухи идеальные импульсы как на дорогом генераторе. Обвеса (RC-цепочки) никакого не надо - подключается все прямо к ней.