#include<avr/interrupt.h>
void setup()
{
attachInterrupt(0,switch1,CHANGE);//прерывания
.......
}
void loop(){
.....
}
void switch1()
{
buttonState = digitalRead(swpin1);
delayMicroseconds(300000);//типа антидребезг кнопки
buttonPress++;//увеличиваем глобальную переменную - у меня это переход между разными вункциями проги
if (buttonPress == 3)//простой цикл на 3 функции, у меня в loop() идёт проверка по этой переменной, но можно и втулить в цикл значения
{
buttonPress = 0;
}
}
Мне кажется можно не обработку прерывания блокировать, а, например, объявить volatile булеву переменную и проверять в самом обработчике если она false, то ничего не делать. Ну или в лоб detachInterrupt
Рабочий кусок моего кода
Не совсем понятена ваша программа .
Мне нужно чтобы по команде с ИК пульта цикл моментально начинался сначала (не смотря на многочисленые delay и т.д.).
ОК! А если в функции написать просто:
void switch1()
{
break;
}
подробнее про это тут
но сам еще не опробовал... В теории должно работать
Еще можно попробовать goto
А если continue;
Мне кажется это больше подходит .
Завтра буду пробовать.
Ни чего не получилось.
Придумал только : по прерыванию включить релюшку которая разомкнет общее питание МК
а потом опять его востановит.
Еще вопрос.
Можно ли (програмно) блокировать внешнее прерывание на какое то время .
Т.е. чтобы МК какое то время был не чувствителен к сигналу внешнего прерывания.
Мне кажется можно не обработку прерывания блокировать, а, например, объявить volatile булеву переменную и проверять в самом обработчике если она false, то ничего не делать. Ну или в лоб detachInterrupt
А можно подробнее про detachInterrupt (ваша ссылка не грузится) ?
Поправил ссылку и еще раз на всякий случай detachInterrupt
фактически это обратное действие attachInterrupt
Что то я не понял как его использовать в цикле , да к тому же на какое то время.