在下面的代码中,为什么ISR2
从不运行?
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
在这种情况下,我正确处理了去抖动。
然而,想象一下限位开关处于接合状态一段时间,然后我反转电机导致限位开关脱离,这将发送一个RISING
边沿,然后是FALLING
边沿RISING
。我需要忽略这些边缘,因为没有任何危险。编写的ISR2
目的是在限位开关脱离时捕获第一个RISING
边沿,然后对其进行去抖动,以便FALLING
忽略后面的边沿。但是现在ISR2
永远不会被调用,我该如何处理这种情况?
PS 我的微控制器是 ATMEGA 2650,它是一个 Arduino Mega 板。