野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17626|回复: 3

红外遥控实验内的中断的while是如何跳出的?

[复制链接]
发表于 2020-3-25 19:53:26 | 显示全部楼层 |阅读模式
在红外遥控实验内,连接接收器的io口设置为下降沿中断,很想知道:
1.下降沿中断函数内的这个whil循环在接收到正常编码时是如何跳出来的?
2.难道是紧接着的下降沿中断继续使用这个中断函数,就不用退出来直接接着运行就好了吗?
    while(1)
    {
      if( IrDa_DATA_IN()== SET )        /* 只测量高电平的时间 */
      {      
        pulse_time = Get_Pulse_Time();

        /* >=5ms 不是有用信号 当出现干扰或者连发码时,也会break跳出while(1)循环 */
        if( pulse_time >= 250 )               
        {
          break; /* 跳出while(1)循环 */
        }

        if(pulse_time>=200 && pulse_time<250)         /* 获得前导位 4ms~4.5ms */
        {
          leader_code_flag = 1;
        }
        else if(pulse_time>=10 && pulse_time<50)      /* 0.56ms: 0.2ms~1ms */
        {
          irda_data = 0;
        }
        else if(pulse_time>=50 && pulse_time<100)     /* 1.68ms:1ms~2ms */
        {
          irda_data =1 ;
        }        
        else if( pulse_time>=100 && pulse_time<=200 ) /* 2.1ms:2ms~4ms */
        {/* 连发码,在第二次中断出现 */
          frame_flag = 1;               /* 一帧数据接收完成 */
          frame_cnt++;                  /* 按键次数加1 */
          isr_cnt ++;                   /* 进中断一次加1 */
          break;                        /* 跳出while(1)循环 */
        }

        if( leader_code_flag == 1 )
        {/* 在第一次中断中完成 */
          frame_data <<= 1;
          frame_data += irda_data;
          frame_cnt = 0;
          isr_cnt = 1;
        }
      }      
    }

回复

使用道具 举报

发表于 2020-3-25 21:58:07 | 显示全部楼层
/* >=5ms 不是有用信号 当出现干扰或者连发码时,也会break跳出while(1)循环 */
        if( pulse_time >= 250 )               
        {
          break; /* 跳出while(1)循环 */
        }

这里不是有break吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-26 08:35:25 | 显示全部楼层
LONG_R3acc 发表于 2020-3-25 21:58
/* >=5ms 不是有用信号 当出现干扰或者连发码时,也会break跳出while(1)循环 */
        if( pulse_time > ...

后面的信号并不会大于这个值啊,这是错误信号才运行这里。
比如接收完引导码(pulse_time>=200 && pulse_time<250)后,要接收后面的地址,也会触发中断,可是接收完引导码后并没有break
回复 支持 反对

使用道具 举报

发表于 2021-9-2 21:23:04 | 显示全部楼层
1.下降沿中断函数内的这个whil循环在接收到正常编码时是如何跳出来的?除开长按情况 ,一般 按两次 遥控器的时间都大于5ms ,无论是引导码 ,地址码 ,还是 数据码 判断他们的条件都是高电平的时间,并且这个时间没有超过5ms
数据码 和 地址码 接收头端收到的信号为:逻辑 1 应该是 560us 低+1680us 高,逻辑 0 应该是 560us 低+560us 高
同步码由一个 9ms 的低电平和一个 4.5ms 的高电平组成,

连发码 : 如果在一帧数据发送完毕之后,按键仍然没有放开,则发射连发码,(由 9ms 低电平+2.5m 高电平(判断这个时间)+0.56ms 低电平
+97.94ms 高电平组成),
2.难道是紧接着的下降沿中断继续使用这个中断函数,就不用退出来直接接着运行就好了吗?
是的,要在 中断函数里把 数据给读完
中断函数里有个死循环 ,而这个死循环里又在不断判断 接受引脚是否遇到高电平 ,高电平时间是多少 高电平时间 对应着不同的处理 例如 数据暂存位赋逻辑位 0/1 ,再根据leader_code_flag标志,把 数据暂存位写入到 frame_data(32位)的不同位中.

对于连发码的处理 由于        
else if(pulse_time>100&&pulse_time<200) //2000<pulse_time<4000
                        {// NEC 码规定的连发码(由 9ms 低电平+2.5m 高电平+0.56ms 低电平+97.94ms 高电平组成)
                        frame_flag=1;//一帧数据接收完成 连续码在第二次中断 出现
                         frame_cnt++;                  /* 按键次数加1 */
                         isr_cnt ++;                   /* 进中断一次加1 */
          break;                        /* 跳出while(1)循环 */
                        }
frame_flag=1;/* 一帧数据接收完成标志 */
break;退出中断
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-2 14:24 , Processed in 0.031167 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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