我正在使用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;
}
答案 0 :(得分:0)
您无需在中断处理程序中清除并设置i位。它将由编译器负责。
至于多次点击,你可能会受到“切换反弹”的困扰。网上有很多这样的参考,但要点是开关电路中的电压不是简单地从0到最大的干净跳跃。这通常是由电触点的实际物理弹跳引起的。
有许多技术可用于“去抖动”开关。您可以尝试一些简单的操作,例如记录tcnt并在上一次之后过早忽略中断。
答案 1 :(得分:0)
我可以想到你可能遇到的两个问题。如前所述,您可能想尝试去抖动&#39;你的输入信号。
您可能还想检查外部输入是否浮动;也就是说,您的输入是否连接了上拉或下拉电阻,当没有信号时,信号分别被拉高或拉低?如果它没有,则您的输入是浮动的。
添加上拉或下拉电阻可以消除大多数随机噪声影响信号的可能性。去抖可以消除由实际输入本身多次触发微控制器引起的错误。
以下是 Debouncing:
的示例让我们使用一个简单的瞬时开关作为例子。首次关闭开关时,信号不会从OFF变为ON。信号稳定的时间非常短,非常短暂
。**请参考示波器中这个非常有趣的图像,显示机械开关在第一次关闭时的行为:
https://a.pololu-files.com/picture/0J790.600.jpg?c2e19ae7a5387b0870b4dbacf5cb7055
如果您考虑微控制器如何解释此信号,它会在一切稳定之前看到多个尖峰。这些高峰是完全不可预测的,因此我们需要提出解决方案。
解决方案: 的反跳。强>
有很多复杂的算法用于去抖动硬件,但是你可以通过一个简单的程序来创建自己的去抖功能。
这是一个非常基本的辩护,但随着它们变得更加先进,这种方法并没有发生太大变化。
我希望这有助于回答你的问题。