您的位置 首页 汽车

uc/OS-II下ARM7定时器捕获完成红外解码

今天下午的时候,调试努力之下,终于把红外解码弄出来了。其实以前有次比赛的时候就已经用到了红外,只是那次用的是51单片机,用的是外部中…

今天下午的时分,调试尽力之下,总算把红外解码弄出来了。其实曾经有次竞赛的时分就现已用到了红外,仅仅那次用的是51单片机,用的是外部中止和延时检测脉宽来进行解码,由于51的时钟这些比较简略,所以解码很简略就正确了。可是现在换到了ARM7平台下,由于对它的不是很熟悉,怎样用一般句子完成准确延时对我来说是个难点。终究考虑用两个计划来完成红外的解码。计划一是用外部中止加定时器延时检测脉宽进行解码,可是成果并没有我想的那样夸姣,调试了半响也没有完成正确的解码,个人认为是使命节拍的影响,可是的确不知道该怎样修正,终究抛弃计划一,改用计划二,用定时器捕获完成红外的解码,并终究完成。

LPC2103芯片带有定时器捕获,能够设置为下降沿,上升沿或双边缘捕获中止。由于结合到此款红外编码方法,所以选用下降沿进行捕获。定时器0由于用作了体系节拍定时器,所以我挑选了定时器1的捕获。

定时器1进行如下的初始化。

[plain]view plaincopy

print?

  1. voidSetTimer(void)
  2. {
  3. T1TCR=0x02;//封闭复位定时器1
  4. T1PR=10;//11分频,约1us计时一次(外设时钟11.0592MHZ)
  5. T1CCR=0x06;//下降沿捕获并发生中止
  6. T1IR=0x10;//铲除定时器1捕获0中止
  7. T1TCR=0x01;//敞开定时器1
  8. VICVectAddr1=(uint32)Timer1_Handler;//中止向量相关设置
  9. VICVectCntl1=(0x20|0x05);
  10. VICIntEnable|=(1<<5);
  11. }

然后在定时器1中止服务函数里,就算出相邻两次下降沿之间的差值。然后经过音讯邮箱把音讯发送到脉宽检测使命进行处理。

[plain]view plaincopy

print?

  1. voidTimer1_Exception()
  2. {
  3. staticuint32tOld;//保存旧的下降沿捕获值
  4. uint32tNew;//保存新的下降沿捕获值
  5. statici;
  6. OS_ENTER_CRITICAL();
  7. T1IR=0x10;//铲除定时器1捕获0中止
  8. tNew=T1CR0;
  9. tValue=tNew-tOld;//得到两次下降沿之间的差值
  10. tOld=tNew;//以便下次中止处理
  11. OSMboxPost(Msg,(void*)tValue);//发送音讯邮箱,行为同步
  12. OS_EXIT_CRITICAL();
  13. V%&&&&&%VectAddr=0x00;
  14. }

在检测脉宽使命里,我只需要根据测定脉宽与原本编码原有的脉宽进行比较判别,然后进行相关移位数据操作,得到数据码值。

由于我的遥控器有点不同,地址码与地址反码不互反,所以不能进行地址的判别,所以滤除掉了引导码与地址码,直接进行了数据码的处理。

只需数据码与数据反码取反相同,则调试LED闪耀一下。

当然我还没有详细知道遥控器按键对应的详细码制是多少,并且还没有检测到连发码,留下下次把码制经过串口发送到上位机进行显现。

[plain]view plaincopy

print?

[plain]view plaincopy

print?

  1. 这是检测脉宽使命的中心代码:

    while(1)
  2. {
  3. OSMboxPend(Msg,0,&err);//等候脉宽检测音讯
  4. if(tValue>2145&&tValue<2345)//进行脉宽检测
  5. {
  6. ucTemp=1;//逻辑1
  7. }
  8. elseif(tValue>1025&&tValue<1225)
  9. {
  10. ucTemp=0;//逻辑0
  11. }
  12. elseif(tValue>13400&&tValue<13600)
  13. {
  14. ucCounter=0;//引导码
  15. usData0=0;
  16. usData1=0;
  17. flag=1;
  18. }
  19. else
  20. {
  21. continue;
  22. }
  23. if(flag)//数据处理进程
  24. {
  25. ucCounter++;
  26. if(ucCounter<16)
  27. {
  28. usData0|=(uint16)ucTemp;
  29. usData0<<=1;
  30. }
  31. elseif(ucCounter==16)
  32. {
  33. usData0|=(uint16)ucTemp;
  34. }
  35. elseif(ucCounter<32)
  36. {
  37. usData1|=(uint16)ucTemp;
  38. usData1<<=1;
  39. }
  40. elseif(ucCounter==32)
  41. {
  42. usData1|=(uint16)ucTemp;
  43. flag=0;
  44. OSSemPost(Sem);//发送信号量,进行码制转化使命,我的使命仅仅简略的完成了判别解码是否成功。
  45. }
  46. }
  47. }
  48. 
    
  49. 
    
  50. 
    
  51. 
    
  52. 
    
  53. 
    

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/262634.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部