[PIC®/AVR®/dsPIC®产品] 【CuriosityNano测评报告】07.开启引脚中断及红外遥控接收实验

[复制链接]
89596|37
 楼主| hu9jj 发表于 2021-6-12 13:08 | 显示全部楼层 |阅读模式
#申请原创#

一、引脚中断的使用步骤

    之前测试的DS1307日历模块有秒信号输出功能,可以利用其输出的秒信号触发中断,实现单片机中秒计数和控制LED闪烁,取代之前用定时器进行秒计数,同时准备实验的红外遥控接收也打算使用中断来处理,实现及时响应,因此本次重点进行了引脚中断处理的实验。
    DS1307日历模块输出的是1Hz方波,因为触发方式可以为下降沿,也可以为上升沿,我的设置如下:


    红外接收实验用的是从机顶盒拆下来的VS838接收头,其典型指标如下:


    从上图可以看出应该设置为下降沿触发:


    引脚参数配置好以后,直接生成代码,可以在intrrupt_manager.c文件中看到中断处理过程:


    具体的中断处理函数在pin_manager.c文件中,我们可以在此写入代码:


    秒信号中断的代码很简单,只是对second变量增1,代码如下:
  1. /**
  2.     IOCAF5 Interrupt Service Routine
  3. */
  4. void IOCAF5_ISR(void) {

  5.     // Add custom IOCAF5 code DS1307_SQ秒信号中断
  6.     second++;
  7.    
  8.     // Call the interrupt handler for the callback registered at runtime
  9.     if(IOCAF5_InterruptHandler)
  10.     {
  11.         IOCAF5_InterruptHandler();
  12.     }
  13.     IOCAFbits.IOCAF5 = 0;
  14. }


二、红外遥控信号接收

    常用的红外遥控信号是由起始码及32bit数据构成,其中包含两组(各8位)的用户码和两组(各8位)的数据组成的,两组用户码可以是相同的,后8位也可以是前8位的反码,两组数据码则后一组是前一组的反码,具体可以参见前面第二幅图片。其时序图如下:


    不过我在测试中遇到一款万能电视机遥控器,其起始码之后仅有16bit 数据,即用户码和数据各8位,没有校验用的反码,其时序图如下:


    通过分析,其起始码也不是常用的9ms低电平+4.5ms的高电平,而是各为3ms左右的低电平+高电平,这就成为了我识别这两种红外遥控器的标志。
    这款遥控器的另一个特点是按下按键会同时发出5组相同的数据,两组间隔约24ms,这个特点就需要在识别代码中处理,可以通过延时忽略掉重复的数据,也可以在完成识别之后设立标志,在处理结束后取消标志,在标志取消之前就不识别收到的数据。下图为实际抓取的时序图:


    在测试某机顶盒红外遥控器的时候,发现其发送完一次数据之后,还会跟一个起始码(如下图所示),好在这个起始码的高电平时间没有4.5ms,仅有约2.2ms,这也成了识别处理的标志:


    下面是我识别测试中使用的代码,这个代码是我独自写的,可以算是成原创了:
  1. //红外线遥控器解码,识别的数据存放在全局变量IR[4]中,其中IR[0]和IR[1]存放用户码,IR[2]和IR[3]存放数据
  2. void IR_Handier(void)
  3. {
  4.     uint8_t i,j,dat = 0;
  5.     uint8_t times;
  6.     if(IRok>0)
  7.         return;                //前一数据未处理,不解释新的信息
  8.     Led1_SetLow();       //测试用
  9.     times = 200;
  10.     while((0==IR_GetValue())&&(times>0)){   //等待高电平信号(9ms或3ms)
  11.         DELAY_microseconds(100);
  12.         times--;
  13.         Led1_Toggle();
  14.     }
  15.     Led1_SetHigh();
  16.     if(times > 150){                        //按万能遥控器8+8位解码(200-22=178)
  17.         times = 50;
  18.         while((IR_GetValue()>0)&&(times>0)){//等待高电平起始码信号结束(4.5sm)
  19.             DELAY_microseconds(100);
  20.             Led1_Toggle();
  21.             times--;
  22.         }
  23.         Led1_SetLow();
  24.         for(j=0; j<2; j++){
  25.             for(i=0; i<8; i++){
  26.                 times = 10;
  27.                 while((0==IR_GetValue())&&(times>0)){//等待0.5ms的数据低电平信号结束
  28.                     DELAY_microseconds(100);
  29.                     times--;
  30.                 }
  31.                 Led1_SetHigh();
  32.                 dat >>= 1;
  33.                 times = 30;
  34.                 while((IR_GetValue()>0)&&(times>0)){//等待数据高电平信号结束(计算高电平时间1.5/2.5ms)
  35.                     DELAY_microseconds(100);
  36.                     times--;
  37.                     Led1_Toggle();
  38.                 }
  39.                 Led1_SetLow();
  40.                 if(times<15)
  41.                     dat |= 0x80;            //高电平times=30-19;低电平times=30-11
  42.             }
  43.             IR[j] = dat;
  44.             dat = 0;
  45.         }
  46.         IR[2] = IR[1];
  47.         IR[1] = 222;    //随意设置的标志
  48.         IR[3] = 222;
  49.     }
  50.     else{                                   //按标准遥控器9+4.5位解码(200-70=130)
  51.         times = 50;
  52.         while((IR_GetValue()>0)&&(times>0)){//等待高电平起始码信号结束(50-34=17)
  53.             DELAY_microseconds(100);
  54.             times--;
  55.             Led1_Toggle();
  56.         }
  57.         if(times>20)                        //处理末尾的结束信号(50-18=32)
  58.             return;
  59.         Led1_SetLow();
  60.         for(j=0; j<4; j++){
  61.             Led1_SetHigh();
  62.             for(i=0; i<8; i++){
  63.                 Led1_SetLow();
  64.                 times = 10;
  65.                 while((0==IR_GetValue())&&(times>0)){//等待0.56ms的数据低电平信号结束
  66.                     DELAY_microseconds(100);
  67.                     times--;
  68.                 }
  69.                 Led1_SetHigh();
  70.                 dat >>= 1;
  71.                 times = 20;
  72.                 while((IR_GetValue()>0)&&(times>0)){
  73.                     DELAY_microseconds(100);//520+620us(520~1140us)
  74.                     times--;
  75.                     Led1_Toggle();
  76.                 }
  77.                 Led1_SetLow();
  78.                 if(times<10)
  79.                     dat |= 0x80;            //高电平:times=12;低电平:times=20
  80.             }
  81.             IR[j] = dat;
  82.             dat = 0;
  83.             Led1_SetLow();
  84.         }
  85.     }
  86.     IRok++;                                 //置红外信号标志
  87. }


    红外遥控的实际使用代码尚未编写,本次测试仅仅是将收到的用户码和键值显示在LCD屏幕上,下面是测试过程的照片“


    这是显示效果,因光线太强,屏幕有点不清晰:

本帖子中包含更多资源

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

×
tabmone 发表于 2021-6-13 21:01 | 显示全部楼层
正准备用 来做产品,刚好用上。         
qiufengsd 发表于 2021-6-13 21:01 | 显示全部楼层
正准备用 来做产品,刚好用上。         
hellosdc 发表于 2021-6-13 21:01 | 显示全部楼层
内容还是非常丰富的                                 
ghuca 发表于 2021-6-13 21:01 | 显示全部楼层
内容还是非常丰富的                                 
jimmhu 发表于 2021-6-13 21:01 | 显示全部楼层
资料够全的,多谢分享                                 
quickman 发表于 2021-6-13 21:01 | 显示全部楼层
很详细的开发板资料                                 
xiaoyaodz 发表于 2021-6-13 21:01 | 显示全部楼层
正准备用 来做产品,刚好用上。         
earlmax 发表于 2021-6-13 21:01 | 显示全部楼层
正准备学习的朋友推荐下载。                                 
tifmill 发表于 2021-6-13 21:01 | 显示全部楼层
  应用还是很广泛的                                 
sdCAD 发表于 2021-6-13 21:01 | 显示全部楼层
谢谢你共享的资料!!                                 
hudi008 发表于 2021-6-13 21:01 | 显示全部楼层
  应用还是很广泛的                                 
nomomy 发表于 2021-6-13 21:02 | 显示全部楼层
资料够全的,多谢分享                                 
usysm 发表于 2021-6-13 21:02 | 显示全部楼层
谢谢你共享的资料                                 
wengh2016 发表于 2021-6-13 21:02 | 显示全部楼层
资料还是相当全面的                                 
linfelix 发表于 2021-6-13 21:02 | 显示全部楼层
内容还是非常丰富的                                 
hilahope 发表于 2021-6-13 21:02 | 显示全部楼层
  应用还是很广泛的                                 
typeof 发表于 2021-6-13 21:02 | 显示全部楼层
很详细的开发板资料                                 
bartonalfred 发表于 2021-6-13 21:02 | 显示全部楼层
内容还是非常丰富的                                 
zerorobert 发表于 2021-6-13 21:02 | 显示全部楼层
  应用还是很广泛的                                 
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:Microchip
简介:让我们来为您提供帮助。我们可提供各种资源来帮助您解决一切问题。是否需要与我们的客户支持团队联系?您可以通过电话、在线聊天功能或电子邮件与他们联系。

151

主题

1063

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部