OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4175|回复: 3

NEC解码算法

[复制链接]

23

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-1-19
在线时间
28 小时
发表于 2016-10-29 12:33:29 | 显示全部楼层 |阅读模式
    因为楼主工作的单位是遥控器公司,所以红外接触的比较多,最近帮天猫遥控器测试,开发了一个NEC解码算法,程序很高效,代码量也很少,大家可以借鉴一下!

前提:我现在做的工装是反复上掉电测试遥控器死机的次数,我用systick定时器以10us为单位利用时钟摘取法来实时获得电平长度,并存放到数组中。

    现在普遍采用的解码算法是比对每个电平的长度是否在某个范围内,来判断是逻辑1还是0,而我采用的算法是吧两个相邻采集的电平长度相加,因为NEC遥控器的逻辑1是560us+1.69ms,逻辑0是560us+560us,因此如果相邻电平的时间和超过2ms就是1,小于2ms就是0。
    QQ截图20161029121430.png

   我声明了存储NEC码的结构,如下:
[mw_shl_code=c,true]typedef struct
{
       u8 CustomCode_H;   //用户码高字节
       u8 CustomCode_L;   //用户码低字节
       u8 Data_H;             //键值高字节
       u8 Data_L;             //键值低字节
         
       u8 Wrong;              //前导码错误标志
}NEC_DataType;[/mw_shl_code]

解码程序如下:


[mw_shl_code=c,true]/**
* NEC解码函数
* pPulse:调用函数前事先采集的电平长度的数组, pnec: NEC数据格式数据结构指针
* 调用nec的结构后要给wrong清零
* 返回1 接收错误 0正常
*/
u8 NEC_Decode(u16 *pPulse,NEC_DataType * pnec)
{
        u8 i = 0;  //读取字节索引
    u8 j = 0;  //读取每字节的位索引
        u8 index = offset+2; //数组索引
        u8 * pnec_cache = (u8 *)pnec;
       
        if(*(pPulse+offset)>5000) // 大于50ms就认为数据头不对
                pnec->Wrong = 1; //错位标志置位
       
        if(!pnec->Wrong)   //数据没错就进入此代码段
        {
                for(i=0;i<4;++i)  //每字节循环
                {
                        for(j=0;j<8;++j) //每字节接收的8bits循环
                        {
                                if(*(pPulse+index)+*(pPulse+index+1)>200)  //相邻数组相加
                                        *(pnec_cache+i) |= 0x80>>(7-j);        
                                else
                                        *(pnec_cache+i) &= ~(0x80>>(7-j));               
                                index += 2;
                        }
                }
                return 0;
        }else
        {
                pnec->Wrong = 0;
                return 1;
        }       
}[/mw_shl_code]


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

23

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-1-19
在线时间
28 小时
 楼主| 发表于 2016-10-29 12:34:35 | 显示全部楼层
tip:存储结构时每个结构元素在物理地址上是连续的!
回复 支持 反对

使用道具 举报

54

主题

372

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-6-15
在线时间
474 小时
发表于 2016-10-29 12:48:01 | 显示全部楼层
本帖最后由 shuaigew88 于 2016-10-29 12:49 编辑

最高效的方法是使用输入捕获,比如逻辑分析仪抓捕总线时序用单片机做只有输入捕获才能满足要求。当然没有捕获功能的用定时器应该是不二的选择。
回复 支持 反对

使用道具 举报

23

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2015-1-19
在线时间
28 小时
 楼主| 发表于 2016-10-29 13:33:54 | 显示全部楼层
shuaigew88 发表于 2016-10-29 12:48
最高效的方法是使用输入捕获,比如逻辑分析仪抓捕总线时序用单片机做只有输入捕获才能满足要求。当然没有捕 ...

的确会有误差,之前1us进一次systick中断,发现测出来的数据有很大误差。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 16:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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