Непрерываемое исполнение

Тема в разделе "Arduino & Shields", создана пользователем Karabas, 29 дек 2015.

  1. Karabas

    Karabas Гик

    Может это прозвучит немного рекурсивно, но можно ли по прерыванию вызвать функцию, которую нельзя прервать прерыванием?
    Ситуация: есть устройство, оно спит и потребляет считаные микроамперы, при срабатывании, скажем, геркона оно должно проснуться и отработать код, причем ни дребезг контактов, ни повторное срабатывание в ближайшие 5 мин не должны вызвать повторное срабатывание кода.
    Можно ли на время работы кода выполнить обратное attachInterrupt(0, foo, RISING); ?
     
  2. AlexVS

    AlexVS Гик

    В обработчке прерывания пишете detachInterrupt() - и прерывания вас больше не беспокоят, пока вновь не встретится attachInterrupt().
     
    Karabas нравится это.
  3. Karabas

    Karabas Гик

    А вот еще вопрос, просто вот прям сейчас нет под рукой платы попробовать, да к тому же хочу знать что по этому поводу говорит теория МК.
    Пример, есть система управления с функцией "Shut Down" где все плавно тормозиться и паркуется. Есть аварийная кнопка, она сидит на прерывании и при нажатии грубо, но быстро, делает то же самое.
    В определенных условиях есть сигнал на аварийную остановку, то есть один из выходов через диод соединяем с D2 (где и сидит прерывание int0).

    Все красиво, но не уйдет ли вся система в dead loop. Ведь сигнал останeтся, и после вызова функции прерываня, она опять будет прерванна и повторно вызванна.
    Вопрос вот в чем, как это тактуется, ведь вызов функции и отключение прерывния для исполнения функции занимает время, в течении которого МК продолжает мониторить прерывания.
     
  4. Unixon

    Unixon Оракул Модератор

    Это отключит только один вектор. Правильно будет noInterrrupts() и interrupts();
     
  5. Unixon

    Unixon Оракул Модератор

    Обработчик прерывания и так не будет прерываться, т.к. у AVR нет вложенных прерываний.
     
  6. Michael

    Michael Нерд

    Могу ошибаться, но делать noInterrupts на пять минут мне кажется не очень хорошей идеей. Чтобы предотвратить повторное срабатывание, отключить конкретный вектор вполне достаточно.
     
  7. Unixon

    Unixon Оракул Модератор

    Конечно, так не нужно делать, я имел ввиду кратковременный запрет на прерывания вне контекста задачи ТС. Если событие нужно отключить надолго, то либо можно прерывание вообще не отключать, но игнорировать событие в главном цикле, либо действительно отключить конкретный вектор через detachInterrupt(). Для экономии батарейки лучше отрубать вектор.