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发出信号.因此,我首先看到由于机械反弹而产生FALLING的RISING边缘和FALLING边缘.在这种情况下我正确处理了去抖动.
然而,想象限位开关正坐在接合状态了一会儿,然后我扭转电机造成限位开关脱离,这将发出一个RISING边缘,然后FALLING和RISING边缘.因为没有任何危险,我需要忽略这些边缘.在ISR2用捕捉所述第一的目的写入RISING边缘当限位开关脱开,然后去抖动它,以便下面FALLING的边缘被忽略.但现在ISR2永远不会被召唤,我该如何应对这种情况呢?
PS我的微控制器是ATMEGA 2650,它是Arduino Mega板.
ISR2从不运行,因为任何中断源只能有一个中断服务程序,并且您已将ISR1替换为ISR1作为此中断的sercice例程.如果您在ISR2之前重新排序代码并附加了ISR1,那么您可能会看到ISR2运行但不会运行ISR1.
典型的微控制器具有中断向量表,该表将中断服务例程与每个中断源相关联.每个中断源只能有一个服务程序.如果您分配了一个新的服务例程,那么您将替换旧的服务例程.上升沿和下降沿没有单独的服务程序.上升沿与下降沿是中断源的配置设置,以确定何时应触发该中断.中断源不能配置为同时在两个边沿触发.
但是,在收到第一条边沿的中断并去掉转换后,您可以重新配置另一条边的中断.这样,您的代码将来回配置一个ISR,然后另一个ISR.