Я работаю над Arduinos, и я хотел бы использовать прерывания, чтобы использовать поворотный энкодер. Но я бы хотел свести код прерывания к минимуму.
Могу ли я использовать несколько триггеров для одного прерывания?
Я хотел бы изменить мой фактический код:
attachInterrupt(0, ChangeA, CHANGE);
Что-то вроде
attachInterrupt(0, FailingA, FAILING);
attachInterrupt(0, RisingA, RISING);
Является ли это возможным?
Нет, не совсем возможно. Внешнее прерывание настроено на внутреннюю реакцию только на одну из возможностей.
Одна вещь, которую вы можете сделать, это использовать CHANGE
прервать процедуру обслуживания и проверить значение вывода в начале ISR, чтобы сделать FallingA()
или же RisingA()
,
Здесь есть потенциальная проблема. Возможно, контакт снова изменился до того, как вы его проверили, поэтому, например, прерывание, которое вызвало прерывание, могло падать, и ваш тест определяет, что оно повышается. Один из способов защиты от двух быстрых прерываний — проверить, установлен ли флаг. Он должен был быть очищен, если в начале прерывания, и если он установлен, то изменение произошло снова. Не существует практического способа защиты от трех быстрых изменений.
Если вы действительно хотите использовать два отдельных ISR, есть ли у вас дополнительный пин-код? Если это так, вы можете просто соединить контакты и запустить FALLING
ISR на одного и RISING
ISR с другой.