如题, 我用P3^2口接收红外数据, 但是每次有信号来的时候, 总是会进中断两次. 不管是怎么处理都一样.
在外部中断0处理里面, 我是这样做的:
void int0() interrupt 0{
EX0 = 0;
IT0 = 0;
MODE = 1; // 置标志位, 在主函数里面的while(1)里面接收红外数据
IT0 = 1;
EX0 = 1;
}
之所以像上面那样做是因为听过人说, 这样就不会产生两次中断. 可是还是产生了两次中断~~
这是什么原因, 难道是没有去抖 ? 谁知道 去抖 是怎么一回事, 或者有解决进入两次中断的方法 ?
------最佳解决方案--------------------
去抖有两种做法:
1)硬件上,在脉冲输入端加一个很小的阻容滤波,滤去尖毛刺;
2)软件做,见下;
你的情况。可能收到的红外脉冲本身就有多个,自然就会多次进入中断(2次或以上)。此时,硬件滤波就无法做了。
软件做法是,设置一个定时器中断。在进入红外脉冲中断后,禁止外中断(ET0=0)。同时启动定时器计数,t0时间过了之后,清外中断悬挂IE0=0,再开外中断ET0=1。这样在t0时间之内不会有两次外中断发生,达到去抖效果。
------其他解决方案--------------------
已经进入中断了,我们需要禁止瞬时发生的第2次中断,所以要ET0=0; 再次允许外中断之前,为了避免这期间已经有悬挂着的外中断,所以让IE0=0。能否软件清零,你可以试一下,不行的话再想办法。
------其他解决方案--------------------
硬件上可以加小电容,软件上可以用定时器捕抓方式,中断处理要快只设标记和记录数据,在主函数里面的while(1)里面处理红外数据。
------其他解决方案--------------------
To bjtea:
ET0 不是定时器/计数器0中断允许位吗? 还有IT0 = 1时, 即边沿触发, IE0 不是由硬件自动清零? 软件可以对它清零?
------其他解决方案--------------------
还是没法理解, 这跟 ET0 有什么关系, 为什么需要 ET0 为零. bjtea朋友没有打错字吧 ? ET0(定时器/计数器中断允许位) ? 你能加下我QQ3066129么, 这样交流起来比较方便. 现在碰到的问题好多, 在这说不清楚~~
------其他解决方案--------------------
估计是打错了,应该是EX0,禁止外中断。
------其他解决方案--------------------
是EX0,打错了
------其他解决方案--------------------
mark一下,正在学红外中断。