Несколько триггеров на одном прерывании на Arduino

Я работаю над Arduinos, и я хотел бы использовать прерывания, чтобы использовать поворотный энкодер. Но я бы хотел свести код прерывания к минимуму.

Могу ли я использовать несколько триггеров для одного прерывания?

Я хотел бы изменить мой фактический код:

attachInterrupt(0, ChangeA, CHANGE);

Что-то вроде

attachInterrupt(0, FailingA, FAILING);
attachInterrupt(0, RisingA, RISING);

Является ли это возможным?

1

Решение

Нет, не совсем возможно. Внешнее прерывание настроено на внутреннюю реакцию только на одну из возможностей.

Одна вещь, которую вы можете сделать, это использовать CHANGE прервать процедуру обслуживания и проверить значение вывода в начале ISR, чтобы сделать FallingA() или же RisingA(),

Здесь есть потенциальная проблема. Возможно, контакт снова изменился до того, как вы его проверили, поэтому, например, прерывание, которое вызвало прерывание, могло падать, и ваш тест определяет, что оно повышается. Один из способов защиты от двух быстрых прерываний — проверить, установлен ли флаг. Он должен был быть очищен, если в начале прерывания, и если он установлен, то изменение произошло снова. Не существует практического способа защиты от трех быстрых изменений.

Если вы действительно хотите использовать два отдельных ISR, есть ли у вас дополнительный пин-код? Если это так, вы можете просто соединить контакты и запустить FALLING ISR на одного и RISING ISR с другой.

1

Другие решения


По вопросам рекламы [email protected]