avr外部中断错误触发器

时间:2014-04-22 03:37:52

标签: interrupt avr

我正在使用ATmega128编程外部中断。我将外部中断0和1设置为下降沿触发中断。中断必须计算按下开关的次数。但是当按下键一次时,中断会被调用2到3次,因此它会更高。这有什么问题?

我的中断代码在这里

ISR(INT1_vect){
    cli();  
    ++push_cntr1;printf("p1:%d,",push_cntr1);
    sei();  
}
ISR(INT0_vect){
    cli();
    ++push_cntr0;printf("p0:%d,",push_cntr0);
    sei();  
}
void interrupt_init(void)       //enable interrupt 0 and 1.
{   
    EICRA |= (1<<ISC01)|(0<<ISC00)|(1<<ISC11)|(0<<ISC10);
    EIFR = 0xFF;
    EIMSK |= (1<<INT1)|(1<<INT0);
    DDRD = 0x00;
}

int main(void)        //main program
{
    dev_init();
    while(1){
        process();
    }
    return 0;
} 

2 个答案:

答案 0 :(得分:0)

您无需在中断处理程序中清除并设置i位。它将由编译器负责。

至于多次点击,你可能会受到“切换反弹”的困扰。网上有很多这样的参考,但要点是开关电路中的电压不是简单地从0到最大的干净跳跃。这通常是由电触点的实际物理弹跳引起的。

有许多技术可用于“去抖动”开关。您可以尝试一些简单的操作,例如记录tcnt并在上一次之后过早忽略中断。

答案 1 :(得分:0)

我可以想到你可能遇到的两个问题。如前所述,您可能想尝试去抖动&#39;你的输入信号。

您可能还想检查外部输入是否浮动;也就是说,您的输入是否连接了上拉或下拉电阻,当没有信号时,信号分别被拉高或拉低?如果它没有,则您的输入是浮动的。

添加上拉或下拉电阻可以消除大多数随机噪声影响信号的可能性。去抖可以消除由实际输入本身多次触发微控制器引起的错误。

以下是 Debouncing:

的示例

让我们使用一个简单的瞬时开关作为例子。首次关闭开关时,信号不会从OFF变为ON。信号稳定的时间非常短,非常短暂

**请参考示波器中这个非常有趣的图像,显​​示机械开关在第一次关闭时的行为:

https://a.pololu-files.com/picture/0J790.600.jpg?c2e19ae7a5387b0870b4dbacf5cb7055

如果您考虑微控制器如何解释此信号,它会在一切稳定之前看到多个尖峰。这些高峰是完全不可预测的,因此我们需要提出解决方案。

解决方案: 的反跳。

有很多复杂的算法用于去抖动硬件,但是你可以通过一个简单的程序来创建自己的去抖功能。

  1. 检测到中断,记录输入值
  2. 等待(尝试10-20us为首发)
  3. 再次检查输入。
  4. 先前记录的输入值是否与当前输入值相同?如果是,则信号稳定:注册成功读取。如果信号不同,则表示您已检测到噪音。等待下一个中断,不注册任何内容。
  5. 这是一个非常基本的辩护,但随着它们变得更加先进,这种方法并没有发生太大变化。

    我希望这有助于回答你的问题。