打印
[AVR单片机]

调了两天没调通,请帮我分析这个红外解码程序

[复制链接]
2613|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hfd999|  楼主 | 2010-1-20 20:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hfd999 于 2010-1-20 20:22 编辑

我知道这样做不是很好,但我应经我知道这样做不是很好,但我应经调了两天了,才迫不得已上来问,根据51的红外接收程序移植到mega16,调了两天都没调通,具体表现为一直显示0,但是用示波器能看到接收的波形,是不是没有进入中断?论坛的高手们,请帮我分析一下,程序有点乱,将就着看吧。万分感谢!!

调制波形



全部代码
10-01-20-3.rar (4.29 KB)

//ICC-AVR application builder : 2010-1-15 1:20:47
// Target : M16
// Crystal: 8.0000Mhz
#include "iom16v.h"
#include "macros.h"
#include "declare.h"
#include "define.h"
extern uchar key_code;//遥控键值
void main(void)
{
CLI();
init_devices();//MCU初始化
LCD1602_init();//液晶初始化
SEI();
  
LCD1602_set_xy( 0,1 );
LCD1602_write_data(1+0x30);
while(1)
{
  LCD1602_set_xy( 0, 0);
  LCD1602_write_data(key_code/100+0x30);
  LCD1602_write_data(key_code%100/10+0x30);
  LCD1602_write_data(key_code%100%10+0x30);
  //delay_nms(250);
}
}
#include "iom16v.h"
#include "macros.h"
#include "declare.h"
#include "define.h"

uchar key_code=0;//遥控键值
uchar buf_key_code=0;//键值暂存
uint key_bit_count=0;//键编码脉冲计数
uint count=0;//定时中断次数计数
uint buf_count=0;//定时中断计数暂存
uchar ir_status=0;//脉冲接收器所处的状态,0:无信号,1:数据编码接收区
uchar buf_INT0_PIN;//INT0的管脚状态

void init_devices(void)
{
//INT0_port |= INT0_EN;    //上拉      
INT0_DDR  &= ~INT0_EN;    //输入
//INT0_DDR |= INT0_EN;  
TCCR1B = 0x00; //停止
TCNT1H = 0xFF; //10uSec,
TCNT1L = 0xF6;
//TCCR1B = 0x02; //8分频
MCUCR = 0x02;//下降沿触发
GICR  = 0x40;//INT0使能
TIMSK = 0x80; //T1中断使能
}

#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)//2
{
TCNT1H = 0xFF;
TCNT1L = 0xF6;
count++;//定时器中断次数累加
}
#pragma interrupt_handler int0_isr:iv_INT0
void int0_isr(void)//6
{
TCCR1B = 0x02;//开定时器中断
if(count>60 && count<450)//如果信号合法
  {
  buf_count = count;//则放入buf_count,count清0,对下一个脉冲信号计时
  count = 0;
  }
  
delay_nus(108);  //延时100us以消除下降沿跳变抖动
buf_INT0_PIN = INT0_PIN & INT0_EN;
if(buf_INT0_PIN == 0)//INT0引脚稳定为低电平,则表法确实是信号
  {                          
  count=10; //count重新计时,因上面延时了100us,故要补偿10次TO中断
  }
  
  
if(buf_count>60 && buf_count<450)//若收到的信号合法,则再进行信号分析
  {
  if(ir_status == 0)//如果之前未收到引导码
    {
    if(buf_count>350 && buf_count<450)//判断是否引导码4ms
      {
      ir_status=1;//系统标记
      buf_count=0;
      }
    }
   
  else if(ir_status == 1)//进入数据编码接收
    {
      if(key_bit_count < 8)//收到数据少于8位,则将收到的数据写入buf_key_code
      {
        if(buf_count>150 && buf_count<250)
        {
          buf_count = 0;
          buf_key_code |= 0x01;//收到1
          buf_key_code <<= 1;
          key_bit_count++;//数据脉冲累加
        }
        else if(buf_count>60 && buf_count<150)//收到0
        {
          buf_count=0;
          buf_key_code <<= 1;//收到0
          key_bit_count++;
        }
      }
        
      else //若收完8位数据则做以下处理
      {   
        ir_status=0;//接收状态返回到空闲
        key_code=buf_key_code;
        key_bit_count=0;
        buf_key_code=0;
        buf_count=0;
        TCCR1B = 0x00;
      }
    }
}

}

相关帖子

沙发
司徒老鹰| | 2010-1-21 22:52 | 只看该作者
太麻烦了

使用特权

评论回复
板凳
laslison| | 2010-1-22 09:41 | 只看该作者
问个问题还那么多前奏,不过问题确实很长

使用特权

评论回复
地板
Karlshen| | 2010-1-24 18:27 | 只看该作者
代码全贴出来了,还是部分?

使用特权

评论回复
5
www0903| | 2010-1-26 00:25 | 只看该作者
本帖最后由 www0903 于 2010-1-26 00:34 编辑

程序看了,有点乱
1)建议注释不要紧跟语句,且注释对齐
2)子程序缩进再明显一点,如
3)根据你的程序,建议先在计时中断输出脉冲,测试中断是否准确.
4)建议用电平触发方式,51分为下降沿触发和低电平触发.
5)确认有结束位
6)建议自己检查后再看以下程序
7)QQ:50467500 欢迎一起讨论


#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)//2
{
TCNT1H = 0xFF;
TCNT1L = 0xF6;

count++;//定时器中断次数累加
}

#pragma interrupt_handler int0_isr:iv_INT0
void int0_isr(void)//6
{
        TCCR1B = 0x02;                                                        //开定时器中断
        buf_count = count;
        
          delay_nus(108);                                                   //延时100us以消除下降沿跳变抖动
        buf_INT0_PIN = INT0_PIN & INT0_EN;
        if(buf_INT0_PIN == 0)                                                //INT0引脚稳定为低电平,则表法确实是信号
          {                          
                   count=10;                                                 //count重新计时,因上面延时了100us,故要补偿10次TO中断
  
                if(buf_count>50 && buf_count<470)                        //若收到的信号合法,则再进行信号分析
                 {
                          if(ir_status == 0)                                //如果之前未收到引导码
                           {
                                    if(buf_count>300)                        //判断是否引导码4ms
                                     {
                                              ir_status=1;                        //系统标记
                                              buf_key_code = 0;
                                              key_bit_count = 0;                //从头再来
                                     }
                           }
           
                          else
                            {
                                      if(key_bit_count < 8)                                //收到数据少于8位,则将收到的数据写入buf_key_code
                                      {
                                               if(buf_count>150)
                                        {
                                                 buf_key_code |= 0x01;                //收到1
                                                 buf_key_code <<= 1;
                                                  key_bit_count++;                //数据脉冲累加
                                        }
                                               else
                                                       if(buf_count>60)                //收到0
                                                {
                                                         buf_key_code <<= 1;        //收到0
                                                         key_bit_count++;
                                                }
                                      }
               
                                     else                                                 //若收完8位数据则做以下处理
                                      {   
                                               ir_status=0;                                //接收状态返回到空闲
                                               key_code=buf_key_code;
                                               key_bit_count=0;
                                               buf_key_code=0;
                                               buf_count=0;
                                               TCCR1B = 0x00;
                                      }
                           }
                }
        }
}

使用特权

评论回复
6
laslison| | 2010-1-26 11:59 | 只看该作者
那几条建议很好:)

使用特权

评论回复
7
qqhuacong| | 2010-1-29 23:35 | 只看该作者
我也做过呀,刚开始以为是程序的问题。后来换了个另种接收头就OK了呀。有的红外头输出是反向。

使用特权

评论回复
8
liaowencong| | 2014-4-9 16:04 | 只看该作者
MCUCR寄存器不是选择中断方式的,EICRA才是。中断方式配置错了,时序也就错了。

使用特权

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

本版积分规则

3

主题

5

帖子

0

粉丝