首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

KBI中断标志位清除不当造成的问题,已解决,大家经验共享.

KBI中断标志位清除不当造成的问题,已解决,大家经验共享.

今天调试时碰到的问题,系统可以正常运行, 但是插入AV端子(电视机方案)的时候,程序就会进入下面的KBI中断,而且一直在中断中循环,无法退出.

ISR(KEY_int)
{
/* Write your interrupt code here ... */

if(PTAD_PTAD0==0)
{
KBIPE_KBIPE0 = 0;
Cpu_Delay100US(200);
if(PTAD_PTAD0==0)
keydown = 1;
KBISC_KBACK = 1;
KBIPE_KBIPE0 = 1;
}
}

可以确定进入中断是由于在PTAD0引脚产生了干扰脉冲而进入了中断,而无法退出中断的原因是脉冲持续时间小于20ms,所以没有执行KBACK=1的语句,中断标志位不能清除,程序就不断的在这个循环里执行。
解决这个问题将KBI的禁止/使能和清标志位语句放在if{}语句外面就可以了.
这是个逻辑方面的bug,但是由于开始只是用手工测试而没有发现,幸好在测其他功能时发现了,算是比较幸运.
我把这个问题写出来,对自己会比较认识深刻,如果其他朋友也遇到类似的问题,希望可以给他们借鉴.
在路上
脉冲持续时间小于20ms,所以没有执行KBACK=1的语句
这点不明白,楼主能解释一下吗.

我也做过KBI,奇怪的事:什么都没动,程序就进入KBI中断,而且一秒种50多次.
我用的KBI是下降沿触发,有下降沿发生会进入ISR中断,Cpu_Delay100US(200)用来延时20ms后判断引脚PTAD1是否还是在低电平,如果不是低电平,说明是个干扰信号,如果20ms后还保持低电平,就是有按键按下了,这个是常用的去触按键抖动的方法,简单但是浪费了一些CPU的时间.
干扰脉冲使程序进入了中断,但是没能进入第二个if语句中清除KBI的标志位,所以没法退出中断。
你可以看一下你的KBI引脚的波形,是不是真有那么多的脉冲.
在路上
明白了,这个方法可以.
楼上的朋友能留下个联系方式吗.我的QQ:252500081
我也正在做这方面的东西
返回列表