OpenEdv-开源电子网

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

原子:红外解码

[复制链接]

15

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2011-9-16
在线时间
8 小时
发表于 2013-1-23 09:43:31 | 显示全部楼层 |阅读模式
原子,你好
我在做红外解码部分的东西。要做两种解码方式:NEC和RC5.
由于NEC是脉宽调制,所以可以用定时器输入捕获或者板子自带的检测高脉冲的宽度进行0和1的区分进行解码
而RC5是相位调制,所以感觉用上面两种方式都不可以,我采用一定时间去检测红外接收引脚的电平去区分0和1,这就牵扯到外部中断和定时器中断的问题,发现不成功。
论坛里也有说定时器中断和外部中断同时用时有点问题,我不太了解,请你指教

还有个问题想问,在你板子自带红外接收,外部中断处理函数里用了while(1)嵌死,然后去检测引脚脉冲宽度,直到接收到结束脉冲用break跳出。我想问的是:那是不是一旦进入外部中断触发,引脚上已经有一段按键所代表的脉冲序列,而
while(1)内部就是把这段脉冲给识别出来???不知道我理解的对不对?

你不努力,谁都会看不起你!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2011-9-16
在线时间
8 小时
 楼主| 发表于 2013-1-23 11:06:56 | 显示全部楼层
原子,我感觉是我外部中断处理函数的问题
大致程序如下:
void EXTI1_IRQHandler(void)
{
    u8 res = 0;
    u8 OK= 0;
    u32 RC5Data = 0;
    IR_Receive *pReceive = (IR_Receive *)(&ReceiveMessage);//ReceiveMessage 为定义的结构体类型的全局变量,各参数已初始化为全为0
   
    if(pReceive->IRType == 0)
        IRTypeCheck();//中断一触发进入该函数,进行对接收到的编码模式进行判断。如果是RC5,该函数还会打开定时器中断
   while(1)
    {
         if(pReceive->IRType == NECTYPE)
         {
           //板子自带相关程序
          }
          if(pReceive->IRType == RC5TYPE)
         {
          //判断是否将信息接受完,没完成,进行信息存储。若完成,置pReceive->RemoteRdy=1,并break跳出 
          }
     }
     EXTI->R = 1<<1;
}
我这样写,就是在外部中断处理函数里开启了定时器中断,然后是两者的中断优先级了,其实我不太清楚他俩该谁高些,我感觉应该外部中断优先级高,不知道理解的对不对?
若定时器优先级高,开启定时器之后,后面的while(1)内部还执行嘛?不清楚这样写之后,外部中断和定时器中断怎么工作的?会相互影响吗?
你不努力,谁都会看不起你!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-1-23 11:29:05 | 显示全部楼层
这个文章应该可以帮到你.

基于RC5_编码的红外遥控器的设计(毕业论文).doc

705.5 KB, 下载次数: 2174

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-1-23 11:30:57 | 显示全部楼层
回复【2楼】fengcq126:
---------------------------------
如果要定时器中断打断外部中断,必须设置定时器中断的抢占优先级高于外部中断的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

15

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2011-9-16
在线时间
8 小时
 楼主| 发表于 2013-1-23 11:41:07 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
谢谢原子,之前看过这篇文章。
其实我的外部中断处理函数里,对RC5的处理就是参考这篇文章来做的。
我现在的问题是:我这样安排外部中断和定时器中断是否合理,我的第二次发帖中关于外部中断的相关问题,希望你能指导下!!
你不努力,谁都会看不起你!
回复 支持 反对

使用道具 举报

15

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2011-9-16
在线时间
8 小时
 楼主| 发表于 2013-1-23 11:51:20 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
嗯,我设置定时器中断优先级高于外部中断之后。
程序流程是这样吗:一旦进入外部中断,检测到是RC5模式,同时开启定时器中断。程序上接着会嵌在while(1)里,定时器中断一直在判断脉冲,直到接收完成,break跳出,一次接收完成,同时将定时器中断关闭,再等待下次外部中断。进入外部中断—检测模式—开定时器中断—接受完—关定时器中断—跳出外部中断—处理接收数据。是不是我设想的这种工作模式。嘿嘿,请指教
你不努力,谁都会看不起你!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-1-23 17:12:12 | 显示全部楼层
回复【6楼】fengcq126:
---------------------------------
你没实际验证么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

15

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2011-9-16
在线时间
8 小时
 楼主| 发表于 2013-1-23 17:22:30 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
我验证了,发现NEC可以,RC5好像就没法进入定时器中断,去根据红外接收引脚的电平进行判断数据了
因为RC5不管发送0还是1,它们的标准周期都是1.7ms左右,所以我的定时器中断设为1.7ms进一次中断~~
你不努力,谁都会看不起你!
回复 支持 反对

使用道具 举报

15

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2011-9-16
在线时间
8 小时
 楼主| 发表于 2013-1-23 17:48:11 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
我验证的NEC可以,是因为没用到定时器中断。采用的板子自带程序
你不努力,谁都会看不起你!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-1-24 00:15:03 | 显示全部楼层
回复【8楼】fengcq126:
---------------------------------
也就是你的定时器中断,从来都没发生过.
RC5解码,我觉得还是可以考虑用延时的办法,在检测到起始信号之后,每隔500us检测一次输入信号电平,就可以判断当前信号是1,还是0,同时电平变化的时刻做同步处理,应该是可以实现解码的,不过我没验证啊,呵呵.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

15

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2011-9-16
在线时间
8 小时
 楼主| 发表于 2013-1-25 19:00:04 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
谢谢原子哥
你所说的在检测到起始信号之后,每隔500us去检测输入信号电平。这个行为的实现是不是用定时器中断去做。我是用定时器中断去做的
你所说的电平变化的同时做同步处理是什么意思?有点不太明白

现在我的RC5解码做出来了,就是有时候会解码出错,按完某一按键,看到想要的键值在屏上显示了,但一松手就又变成0了。这个现象有时会出现,不知道什么原因
我测试了原板子带的NEC解码,发现有时候按键也会解码错误,显示为0.不知道这是什么原因。不知道你遇到过没?
你不努力,谁都会看不起你!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-1-25 19:10:17 | 显示全部楼层
RC5的编码,不是每个0/1都是有一次跳变么?只是跳变在前在后的问题.
抓住这个跳变,做同步. 
如果信号不好,或者接受过程出了问题,就导致接收不正确,从而出现0.或者其他乱码.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2020-5-11
在线时间
5 小时
发表于 2020-5-12 09:19:07 | 显示全部楼层
请问有做51 的RC5解码吗?STM32的可以发我一下吗
296677149@qq.com
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-29 17:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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