打印

求助:51的红外解码移植到ATMEGA32上有改延时可是不能用

[复制链接]
1458|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lpp111|  楼主 | 2012-10-19 16:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51的红外解码移植到ATMEGA32上有改延时可是不能用,
纠结好几天了,不知道出什么问题 !!!!!!!


SIGNAL(SIG_INTERRUPT1)  //外部中断1,红外遥控
{
//PD3置位输入,下降沿触发
  unsigned char j,k,N=0;
  //  PORTC = 0xfe; //若有进入中断则亮第一个灯,若收到数据正确,亮0x55,若收到错误,亮0xfd
GICR &=~(1<<INT1);   //先关中断
  IRdelay(60);
  if (IRIN )
     {
   GICR|=(1<<INT1);//使能外部中断1
     return;
   }
                           //确认IR信号出现
while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
   {IRdelay(1);}
while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{IRdelay(1);}
for (j=0;j<4;j++)         //收集四组数据
{
  for (k=0;k<8;k++)        //每组数据有8位
  {
  
    while (!IRIN)          //等 IR 变为高电平
     {IRdelay(1);}
     while (IRIN)           //计算IR高电平时长
      {
     IRdelay(1);//
     N++;           
     if (N>30)//30
   {
    GICR|=(1<<INT1);//使能外部中断1
    return;
   }                  //0.14ms计数过长自动离开。
      }                        //高电平计数完毕               
     IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
     if (N>8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1”
     N=0;
  }//end for k
}//end for j

   if (IRCOM[2]!=~IRCOM[3])//2,3是数据码与反码 有用的
    {
// PORTC = 0xfd; //错误数据
     GICR|=(1<<INT1);//使能外部中断1
      return;
}
else  //收到数据对
{
  IROK=1;PORTC = 0x55;
}
if(IRCOM[2]==0X45 || IRCOM[2]==0X46)
{
  PORTC = 0xF0;  
}
if(IRCOM[3]==0X45 || IRCOM[3]==0X46)
{
  PORTC = 0x0f;  
}
  
  GICR|=(1<<INT1);  

}

相关帖子

沙发
acgean| | 2012-10-19 16:35 | 只看该作者
我估计延时还是不准吧. AVR 的速度快了很多
象有关时序这样的代码调试都比较有难度, 最好找调试器来帮忙

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

14

帖子

0

粉丝