多个Arduino中断在同一个引脚上

The*_*ere 3 embedded arduino debouncing

在下面的代码中,为什么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.
}
Run Code Online (Sandbox Code Playgroud)

即使为不同的事件编程了中断,Arduino也不允许在同一个引脚上连接两个中断吗?

在我的设置中,引脚19从运动控制设置中使用的限位开关获取信号.当限位开关接合时,in引脚会LOW发出信号.因此,我首先看到由于机械反弹而产生FALLINGRISING边缘和FALLING边缘.在这种情况下我正确处理了去抖动.

然而,想象限位开关正坐在接合状态了一会儿,然后我扭转电机造成限位开关脱离,这将发出一个RISING边缘,然后FALLINGRISING边缘.因为没有任何危险,我需要忽略这些边缘.在ISR2用捕捉所述第一的目的写入RISING边缘当限位开关脱开,然后去抖动它,以便下面FALLING的边缘被忽略.但现在ISR2永远不会被召唤,我该如何应对这种情况呢?

PS我的微控制器是ATMEGA 2650,它是Arduino Mega板.

kkr*_*mbo 8

ISR2从不运行,因为任何中断源只能有一个中断服务程序,并且您已将ISR1替换为ISR1作为此中断的sercice例程.如果您在ISR2之前重新排序代码并附加了ISR1,那么您可能会看到ISR2运行但不会运行ISR1.

典型的微控制器具有中断向量表,该表将中断服务例程与每个中断源相关联.每个中断源只能有一个服务程序.如果您分配了一个新的服务例程,那么您将替换旧的服务例程.上升沿和下降沿没有单独的服务程序.上升沿与下降沿是中断源的配置设置,以确定何时应触发该中断.中断源不能配置为同时在两个边沿触发.

但是,在收到第一条边沿的中断并去掉转换后,您可以重新配置另一条边的中断.这样,您的代码将来回配置一个ISR,然后另一个ISR.