导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→我采用外中断接收遥控器数据,为何接收不到?(见内)[boysen]

 *第10480篇: 我采用外中断接收遥控器数据,为何接收不到?(见内)

  
楼 主:boysen 2003年4月16日17:38
 我采用外中断接收遥控器数据,为何接收不到?(见内)
硬件:遥控芯片m50462,接收头数据线接INT1脚。
M50462是根据一个脉冲的长短来区分0和1。低电平均为0.26ms,0的高电平为0.79ms,1的高电平为1.84ms.
思路:下降沿到来,进入中断,每次接收一位。接收完16位(第17个下降沿到来)对数据处理。
出现的问题:进入了中断,但是没有接收到数据。请教大侠。
void getbit(void) interrupt 0
     {
    EX1=0;      //关掉外部中断    
    number=number+1;
    count=TH0;   //保存上一个脉冲计数值(高位)
    TR0=0;       //关掉上一个脉冲的计数
       TH0=0X00;    //重新开始计数
    TL0=0X00;
    TR0=1;       //启动计数器
    if (number==1)
       {
      goto kk;   //第一个下降沿到来时只计数,不处理
    }
    //判断上一个脉冲长度
    if (count>  0 && count  <6) //"0"值
       {
      key>  >  =1;
    }
       else if (count>  5 && count   <11)  //"1"值
    {
      key>  >  =1;
   key=key+0x8000;
    }
       if (number==17)     //一帧的最后一个下降沿,对接收到的数据进行处理
       {
      //拆分key
   keyH=key%0x100;   //高8位
   keyL=key/0x100;   //低8位
   buf[0]=0x34;//keyH;
   buf[1]=0x45;//keyL;
   goto kk;
    }
 kk:   EX1=1;               //重新开外部中断       
  }
  
2楼:huzimax 2003年4月16日18:30
 number是在外部清0的吗?
  
3楼:boysen 2003年4月16日18:42
 不好意思,少写了一句,在number==17后,number=0;
  
4楼:huzimax 2003年4月16日18:55
 我有一个问题:如果在没有信号的时候,你接收头输出是高还是低?
尽管你设置的外部中断是沿触发,但如果一直处于低电平时,很容易误动作
  
5楼:boysen 2003年4月16日18:59
 接收头在没有数据的时候为高电平
  
6楼:huzimax 2003年4月16日19:07
 接收完16位(第17个下降沿到来),第17位岂不是一帧的数据
你最后一位的脉宽是怎么计算的?
M50462的资料我查不到,但我觉得好象不应是你所说的编码方式,还应该有头或是尾,要不最后一位不成了只有0.26ms的0,真正的数据信息又在哪?
  
7楼:boysen 2003年4月16日19:12
 他的一帧数据是两个字节
在第一个下降沿到来,进入中断,第十七个下降沿到来,一帧数据结束。虽然我也没有找到M50462资料,但是我参考的是HS50462(兼容)。一阵数据包括17个下降沿。
  
8楼:huzimax 2003年4月16日19:10
 接收完16位(第17个下降沿到来),第17位岂不是两帧的数据间隙
上边没表达明白,抱歉
  
9楼:boysen 2003年4月16日19:14
 在十七个下降沿来到后,低电平持续0.26ms,然后会保持一段时间的高电平
  
10楼:huzimax 2003年4月16日19:20
 也就是说有17个低电平,16个高电平?
  
11楼:boysen 2003年4月16日19:24
 yes,是这样的。0信号高电平长度1.79ms,1信号高电平长度1.84ms
  
12楼:huzimax 2003年4月16日19:31
 你确认计时中断工作正常?
  
13楼:huzimax 2003年4月16日19:31
 用的是12M晶振?
  
14楼:boysen 2003年4月16日19:32
 晶振是6M,但是用的单片机是6时钟的,所以一个时钟周期是1us
  
15楼:boysen 2003年4月16日19:30
 0信号高电平长度0.79ms。上面写错了
  
16楼:huzimax 2003年4月16日19:33
 你接收到的数据全是0?
  
17楼:boysen 2003年4月16日19:35
 是啊。所以很昏头。
  
18楼:huzimax 2003年4月16日19:42
 一个建议:
kk:   EX1=1;               //重新开外部中断   
当你持行完一个外部中断程序后,不要在外部中断程序中开启外部中断(上一语句),而在计时中段中,当TH0计为2的时候再来开启
原因是:你的中断程序执行完后,INT1输入还是低电平,此时开启可能会马上又进入中断程序,因此得到的数据大多是0;
检查方法很简单:可以测一个你的程序从第一个中断到接收完16个信号(中断执行17次)的程序运行时间,如果远小于红外一帧的时间,就是此原因引起
  
19楼:boysen 2003年4月16日19:48
 谢谢大侠的热心建议。
我现在通过检测发现,number能计数到16,但是计数不到17.应该是我number=number+1;的问题。但是能检测到16说明可以接收16个位的数据。可能是有地方数据处理存在错误。
  
20楼:huzimax 2003年4月16日19:56
 你已记到16后,KEY值还是0?

>>>>>>对该主题发表你的看法

本主题贴数26,分页: [第1页] [第2页]


[上一篇主题]:对AD7705怎么编程设置呀?

[下一篇主题]:各路大侠,请帮帮苦命的小弟。cygnal 中的 FATAL ERROR