找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

多任务环境下的红外解码

[复制链接]
admin 发表于 2012-9-2 12:20:17 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
正在学习红外解码,看了若干教程和方法,感觉 一线工人 的教程最好。工程化,而且思路清晰。抱歉,没买 一线工人 的学习板,却用了人家的教程。
调试程序中,发现一点问题,就是,单独用LCD和红外做演示的时候,解码完全正确,但是同时加入几个任务之后,解码的值就不稳定,比如同一按键,有时键值为1,有时为3,有时解不出码。
经分析,可能是以下几点原因造成的。
(1)红外接收用的是外部中断的负跳变触发接收的。跳变触发有一特性,即:负跳变触发方式时,中断标志寄存器锁存了中断请求。中断口线上一个从高到低的跳变将记录在标志寄存器中,直到CPU响应并转向该中断服务程序时,由硬件自动清除。因此当CPU正在执行同级中断(甚至是外部中断本身)或高级中断时,产生的外部中断(负跳变)同样将被记录在中断标志寄存器中。在该中断退出后,将被响应执行。
很明显,我们不希望这样的事情发生,所以我们在中断程序中用延时100us的方式“消抖”,然而,由于负跳变触发的这一特性,“抖动”已经被储存,并且将触发的中断程序
解决方法,就是在“消抖”之后,手工清除外部中断标志。具体来说,就是在延时消抖之后,加上个IE0=0(如果用的是外部中断0)。

(2)51单片机允许两级的中断嵌套。比如我在程序中用了4个中断处理程序,如果其他中断程序执行时间过长,长到超过两次红外有效触发的时间间隔。这样,尽管我们为红外触发选择的是优先级最高的外部中断0,然而,仍有可能有时丢失一次红外触发。

解决方法。似乎无法根治,只有尽力避免。
a:尽量减小其他中断函数的内部执行时间。
b:尽量增加其他中断函数执行间隔时间。例如:如果用的是一个定时器中断次数累加来解析红外码,则应将此定时器中断间隔时间做的尽量长,如原来位50US中断一次,若改为100US中断一次,再在红外中断处理函数中做相应调整。则会将提中断函数执行间隔时间增加一倍。从而减少丢失红外触发的可能性。
经本人在程序中验证,用上述办法改善后,红外解码的值就正确了。
我的这些看法不知对不对,望各位前辈指正。另外,还有什么能增强红外接收稳定性的好方法,希望大家也提出来,以便共同进步。
本人是新手,半路出家。正处于从入门到工程应用的艰难爬坡之中,从《电子工程师之家》学到了很多东西,感谢这个论坛及这个论坛的那些热心人。







[ 此帖被孙家沟岔在2010-11-23 16:17重新编辑 ]
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-24 09:15 , Processed in 0.067096 second(s), 11 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表