В следующем коде, почему ISR2
никогда не запускается?Несколько прерываний Arduino на том же выводе
const int in = 19;
const int LED = 9;
int flag;
void setup() {
pinMode(in, INPUT_PULLUP);
pinMode(LED, OUTPUT);
attachInterrupt(digitalPinToInterrupt(in), ISR2, RISING);
attachInterrupt(digitalPinToInterrupt(in), ISR1, FALLING);
}
void loop() {
if (flag) {delay (100); flag = false;}// debounce
}
void ISR1(){
digitalWrite(LED, LOW);
// Turn Off the motor, since, Limit Switch was engaged
flag = true;
}
void ISR2(){ // Limit Switch was disengaged.
digitalWrite(LED, HIGH);
delay(100); // Debounce, so I do not receive spurious FALLING edges from this.
}
ли Arduino не позволяют прикрепить два прерывания на том же штифтом, даже если прерывания запрограммированы для различных событий?
В моей настройке контакт 19 получает сигнал от конечного выключателя, используемого в настройке управления движением. Когда конечный выключатель включен, контакт in
получает сигнал LOW
. Таким образом, я сначала вижу край FALLING
, за которым следуют RISING
ребра и FALLING
края из-за механического отскока. В этом случае я правильно обрабатываю debouncing.
Однако, представьте на некоторое время Концевой выключатель сидел в сцепленном состоянии, а затем я обратный двигатель, вызывающий конечный выключатель для отключения, это будет отправить RISING
край с последующим FALLING
и RISING
краями. Мне нужно игнорировать эти края, потому что ничего не в опасности. Файл ISR2
был записан с целью захвата первого края RISING
, когда переключатель Limit отключается, а затем дебютирует его так, что следующие края FALLING
игнорируются. Но теперь, когда ISR2
никогда не звонит, как я могу справиться с этой ситуацией?
P.S. Мой микроконтроллер - ATMEGA 2650, это доска Arduino Mega.
Не смотря на техническое описание AVR, я подозреваю, что вы не можете настроить два прерывания на одном и том же выводе.Кажется, он универсален на всех платформах, на которых я работал, и вы получаете один источник прерываний на каждый вывод, и вы можете запускать край, повышение, уровень, падение и т. Д. –
Использование занятого ожидания в ISR является злым! Проверьте исходный код 'delay()' Я уже прокомментировал это по вашему последнему вопросу. Тем не менее, я не знаю, покрывает ли Arduino это в программном обеспечении, но то, что вы делаете, выглядит очень странным и необычным. AVR (как и все другие MCU, которые я знаю) не может использовать два прерывания на одном и том же выводе. Узнайте больше о том, как работают прерывания и аппаратные средства. И как правильно отключить коммутатор. Ваш подход окончательно ошибочен. – Olaf