Может это прозвучит немного рекурсивно, но можно ли по прерыванию вызвать функцию, которую нельзя прервать прерыванием? Ситуация: есть устройство, оно спит и потребляет считаные микроамперы, при срабатывании, скажем, геркона оно должно проснуться и отработать код, причем ни дребезг контактов, ни повторное срабатывание в ближайшие 5 мин не должны вызвать повторное срабатывание кода. Можно ли на время работы кода выполнить обратное attachInterrupt(0, foo, RISING); ?
В обработчке прерывания пишете detachInterrupt() - и прерывания вас больше не беспокоят, пока вновь не встретится attachInterrupt().
А вот еще вопрос, просто вот прям сейчас нет под рукой платы попробовать, да к тому же хочу знать что по этому поводу говорит теория МК. Пример, есть система управления с функцией "Shut Down" где все плавно тормозиться и паркуется. Есть аварийная кнопка, она сидит на прерывании и при нажатии грубо, но быстро, делает то же самое. В определенных условиях есть сигнал на аварийную остановку, то есть один из выходов через диод соединяем с D2 (где и сидит прерывание int0). Все красиво, но не уйдет ли вся система в dead loop. Ведь сигнал останeтся, и после вызова функции прерываня, она опять будет прерванна и повторно вызванна. Вопрос вот в чем, как это тактуется, ведь вызов функции и отключение прерывния для исполнения функции занимает время, в течении которого МК продолжает мониторить прерывания.
Могу ошибаться, но делать noInterrupts на пять минут мне кажется не очень хорошей идеей. Чтобы предотвратить повторное срабатывание, отключить конкретный вектор вполне достаточно.
Конечно, так не нужно делать, я имел ввиду кратковременный запрет на прерывания вне контекста задачи ТС. Если событие нужно отключить надолго, то либо можно прерывание вообще не отключать, но игнорировать событие в главном цикле, либо действительно отключить конкретный вектор через detachInterrupt(). Для экономии батарейки лучше отрубать вектор.