搜索
bottom↓
回复: 9

关于用捕获读取红外编码的问题?帮忙找一下原因。

[复制链接]

出0入0汤圆

发表于 2013-12-5 09:25:10 | 显示全部楼层 |阅读模式
写一程序,用STC12C5A60S2读取红外编码值。以前在PIC上用定时器实现过。现用STC的捕获来实现,代码如下。 搞了好久就是不能读取红外编码。大家帮忙找一下原因。谢谢!!

捕获中断能进入,启始码也能读取。但读数据码1和0时,就很难测到,但多按几下遥控器也能运行到测试代码。我想问题就在这里,数据码不能完整读取,但程序上找不出问题。红外接收器用1838,在其电源脚和接地脚上接了一220微的电容。以前在PIC上测试时能正常工作。捕获端口用高阻输入模式和双向IO模式都一样。接上拉电阻试了也一样,估计硬件电路问题不大。

/*此处为晶振为11.0592M时的取值,如用其它频率的晶振时,要改变相应的取值。*/
unsigned int Imax=12902;//14ms
unsigned int Imin=5529;//6ms
unsigned int Inum1 =645;//0.7ms
unsigned int Inum2 =1474;//1.6ms
unsigned int Inum3 =2765;//3ms

void init()//初始化函数
{
                P0M1=0;
                P0M0=0;           //设P0口设为推挽输出

                P2M1=0;
                P2M0=0xFF;           //设P2口设为推挽输出

                P1M1=0x08;           //P1.3为输入
                P1M0=0;
               
                P1=0xff;
                DU=0;//数码管段选
                BZ=1;
                WE3=1;//数码管位选
                WE2=1;
                WE1=1;
                WE0=1;
                SW0=1;// 按钮
                SW1=1;
                OUT=1;//继电器断开
        
                CMOD=0x80;//PCA计数脉冲为系统时钟的12分频。
                CCAPM0=0x11;//允许下降沿捕获,允许 CCON 中的 CCFn 触发中断

                EA=1;
                ET0=1;
                AUXR &= 0x7F;                //定时器时钟12T模式
                TMOD &= 0xF0;                //设置定时器模式
                TMOD |= 0x01;                //设置定时器模式
                IPH=0x80;          //把PCA中断设为高优先级
                IP=0x80;
}

void Rf_PCA0_Int(void) interrupt 7//遥控接收函数
{
            
   if (CCF0==1)

   {                  
         
       tc=CCAP0H<<8+CCAP0L;        //提取中断时间间隔时长。
        // CCAP0H = 0x00;                  
         //CCAP0L = 0x00;
           CL = 0x00;      //清PCA计数器
       CH = 0x00;
           CR=1;   //启动计数器
           CCF0=0;/*中断标志清零*/
       if(rfif==0)
       {               
                 /*寻找启始码*/
                if((tc>Imin)&&(tc<Imax))
                {
                        m=0;
                        rfif=1;          //测试代码在这里按遥控器能很快测试到,说明启始码能识别到。       
                }
        }

                /*找到启动码后,进入解码流程*/     
                if(rfif==1)          
                {                  
                   
                   if((tc>Inum2)&&(tc<Inum3))
                    {
                        rf_buff[m/8]=rf_buff[m/8]>>1|0x80; m++;/*取码1,m除8取值*///   
                    }
                    if((tc>Inum1)&&(tc<Inum2))
                    {
                        rf_buff[m/8]=rf_buff[m/8]>>1; m++;/*取码0*/        // 测试代码在这里按遥控器很难测试到,但多按两次也能测试到。说明问题取码可能存在问题。       
                    }
       
                    /*取码完成后判断码是否正确*/
                    if(m==32)
                    {
                        m=0;  rfif=0;
                        if((rf_buff[2]&rf_buff[3])==0)
                        {
                         rfok=1; //测试代码在这里按遥控器不能测试到
                        }
                    }
                }
                if(rfok==1)
                {       
                        rf_interpretation();//遥控键值解释
                        rfdataif(); //遥控判断函数
                        rfok=0;
                }
               
            
         }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-12-5 09:51:36 | 显示全部楼层
我用stm8的输入捕获就没搞定,直接用中断+定时器了。这样流程更简洁。

出0入0汤圆

发表于 2013-12-5 10:08:49 | 显示全部楼层
我实在没心思看代码。
能说的是:我在M3上用i/o下降沿中断+自由运行的计数器,解过NEC编码,工作非常稳定,唯一要注意处理的是,计数器回滚到零的情况。

出0入0汤圆

 楼主| 发表于 2013-12-5 10:09:50 | 显示全部楼层
wxl 发表于 2013-12-5 09:51
我用stm8的输入捕获就没搞定,直接用中断+定时器了。这样流程更简洁。

其实用捕获跟中断是差不多的,以前PIC上是用电平变化中断,实现过,现在在STC上用捕获代码基本上没变化。但就是不知道哪里出错了。呵呵

出0入0汤圆

 楼主| 发表于 2013-12-5 10:12:52 | 显示全部楼层
mowin 发表于 2013-12-5 10:08
我实在没心思看代码。
能说的是:我在M3上用i/o下降沿中断+自由运行的计数器,解过NEC编码,工作非常稳定, ...

谢谢,我一进入中断,先读取计数值,然后就把计数器给清了。

出0入0汤圆

发表于 2013-12-5 10:54:09 | 显示全部楼层
用示波器看看MCU输入的波形对不对.
红外接收头是高增益运放,容易产生自激.

出0入0汤圆

 楼主| 发表于 2013-12-5 11:41:43 | 显示全部楼层
Firman 发表于 2013-12-5 10:54
用示波器看看MCU输入的波形对不对.
红外接收头是高增益运放,容易产生自激. ...

没有示波器呀!

出0入0汤圆

发表于 2013-12-5 13:26:43 | 显示全部楼层
加个整形的元件再输入试试,如果没示波器
以前读书的时候搞过超声波传感器,记得当时看每一级的放大都是用波形看的。有些波形需要调的

出0入0汤圆

 楼主| 发表于 2013-12-5 21:35:06 | 显示全部楼层
yaho007 发表于 2013-12-5 13:26
加个整形的元件再输入试试,如果没示波器
以前读书的时候搞过超声波传感器,记得当时看每一级的放大都是用 ...

换了一个接收头还是一样的情况,换成中断加定时器也还是一样的情况,应该是代码上还有问题,大家帮忙找找原因呀!

出0入0汤圆

 楼主| 发表于 2013-12-6 14:17:53 | 显示全部楼层
自己已经找到原因。tc=CCAP0H<<8+CCAP0L;        //提取中断时间间隔时长。改成tc=CCAP0H*256+CCAP0L;     
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 14:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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