打印
[AVR单片机]

AVR红外遥控问题

[复制链接]
2138|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
和平清风|  楼主 | 2013-4-26 18:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面的程序是本人之前在51单片机写过并且调试成功的红外遥控解码程序改编而来,本人用的是AVR的M16单片机,可是调试怎么也不能成功,我使用的是外部中断2,我一步一步的测试,已经可以确定进入了中断,也经过了前导码,但是每次都会在计算高电平时间那里,出现计时过长跳出去的,无论我把延时弄成多长时间,感觉那里一直都是高定平,然后跳出。把计算过长那段程序删除了,但是也是调试不成功。求高手帮帮忙啊

void inter_init()
{
               
                DDRB&=~BIT(2);//设置为带上拉输入
                PORTB|=BIT(2);
                GICR|=(0<<INT2);//清除中断2使能
                MCUCSR|=(0<<ISC2);//中断2为下降沿触发
                GIFR|=(1<<INTF2);//写1清除外部中断标志位
                GICR|=(1<<INT2);//从新使能,使能外部中断2
                SREG|=BIT(7);//开全局中断
}

void delay_ir(uint x)
{                                         //0.14ms延时8MHZ晶振
        uint i;
        while(x--)
                 for (i = 0; i<155; i++);
}

void exter2_IR()
{
                uchar IRcode[4];//红外解码数据
          uchar j,i,byte;
                uint time=0;
          DDRB&=~BIT(2);//设置为带上拉输入
                PORTB|=BIT(2);
                GICR&=~(1<<INT2);//关闭外部中断2
          if(PINB&BIT(2))//如果出现高电平,接收出错
          {
                   GICR|=(1<<INT2);//打开中断2
                   return;       
          }
          while(!(PINB&BIT(2)));        //9MS引导码,等待变为高电平

        while(PINB&BIT(2)); //4.5ms结果码,等待变为低电平            
          for(j=0;j<4;j++)
          {
                   for(i=0;i<8;i++)
                   {
                                          while(!(PINB&BIT(2)));//0.565ms的低电平,等待高电平
                                         while(PINB&BIT(2)) //计算高电平的时间
                                   {
                                             delay_ir(1);
                                       time++;
                                       if(time>=30)//计时过长,自动离开   
                                                         {                                                                 
                                                                        GICR|=(1<<INT2);
                              return;
                                                         }
                                                }
                             byte>>=1;
                             if(time>6)
                                      byte=byte|0x80;
                             else
                                      byte=byte;
                             time=0;       
                   }       
                   IRcode[j]=byte;
          }
GICR|=(1<<INT2);//从新打开外部中断2
}

相关帖子

沙发
airwill| | 2013-4-26 18:33 | 只看该作者
估计计数时间有错误吧
使用 void delay_ir(uint x) 是很糟糕的办法
经过精确的时间计算了吗, 包括调用和返回时间, 主程序的循环指令时间...
推荐应该比较好的办法, 就是读定时器

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
qin552011373 + 6 很给力!
板凳
qin552011373| | 2013-4-27 07:37 | 只看该作者
程序改动了多少?

使用特权

评论回复
地板
kerwin_zhong| | 2013-4-27 22:53 | 只看该作者
用AVR做红外接收,就不要沿用8051的做法了,难道楼主不知道AVR有个定时器可以做输入捕获么?

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
qin552011373 + 6 很给力!
5
qin552011373| | 2013-4-29 21:31 | 只看该作者
kerwin_zhong 发表于 2013-4-27 22:53
用AVR做红外接收,就不要沿用8051的做法了,难道楼主不知道AVR有个定时器可以做输入捕获么? ...

估计楼主忽略了

使用特权

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

本版积分规则

1

主题

2

帖子

0

粉丝