林州 发表于 2013-12-19 22:24:43

红外遥控解码,引导码前出现8个小脉冲求解?

本帖最后由 林州 于 2013-12-19 22:26 编辑

E3 00 00 00 00 00 00 00 00
2701 01 01 01 01 0C 01 01
    0C 0C 0C 0C 0C 01 0C 0C
    0C 01 01 0C 01 01 01 01
    01 0C 0C 01 0C 0C 0C 0C
43 00 00 00 00 00 00 00 00
27 01 01 01 01 01 0C 01 01    //00000100
    0C 0C 0C 0C 0C 01 0C 0C   //反码11111011
    0C 01 01 0C 01 01 01 01 //10010000
    01 0C 0C 01 0C 0C 0C 0C//反码01101111
我用的定时器1100us
用外部中断1 下降沿触发
在黄色引导的前面为什么会出现8个0呢!而且这个引导码的0x27才算是3.9ms(二个下降沿之间)按说应该9ms以上啊!


下面是代码!我这没有数字示波器看不了波形,用声卡看过,出来都是正弦波不知怎么回事! 红外接收头用的是1838,3.3V供电。单片机用的m128,上拉也加了8k,接收头供电串接100欧电阻。

/******************************************************************/
/*                  定时器1中断服务函数                         */
/******************************************************************/
#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
TCNT1H = 0xFF; //reload counter high value
TCNT1L = 0xA4; //reload counter low value
irtime++;
}

/******************************************************************/
/*                  外部中断1函数                               */
/******************************************************************/
#pragma interrupt_handler ex1_isr: iv_EXT_INT1
void ex1_isr (void)//外部中断0服务函数
{
   UART_Send_Byte(irtime);//串口发送数据
   irtime=0;
}

yuyu87 发表于 2013-12-20 09:12:01

声卡,电脑里可以设置采样率的吧,默认的好像是48k,48k采样24K肯定是正弦波了,不好,提高采样率到最高水平

林州 发表于 2013-12-22 21:47:26

外部中断下降沿方式,做个试验还好,干扰太厉害,没法稳定。有做过外部中断方式,发表一下经验吧!

林州 发表于 2013-12-22 22:12:05

   调试失败的程序

1欧姆 发表于 2013-12-22 22:30:12


可轻松移植。更多功能可关注www.treeos.com.cn

/**************** (C) COPYRIGHT 2012北京光轮电子科技有限公司******************

    本软件的著作权归北京光轮电子科技有限公司所有。
    未经本软件著作权所有者许可,任何单位或个人不得以任何方式对本软件所提供的所有
程序作全部和局部复制、引用和传播。
    本软件所提供的所有程序仅供购买者本人作为学习之用,其目的是为了您能更好地学习
和理解TreeOS实时操作系统。若您自行把本软件引用到您的产品之中,运行后出现由本软件
直接或间接引起的任何不良后果,本软件著作权所有者将不会作出任何赔偿,亦不承担任何
法律责任。
    若您想在您的产品中直接使用本软件,请与软件著作权所有者联系,进行登记以获取正
式授权。
    本软件及著作权、免责声明的最终解析权归本软件著作权所有者所有。
    详情请登录:http://www.treeos.com.cn(论坛)、http://www.treeos.cn(官网)
                    或 http://www.dpjwx.com(单片机网校)。

********************************************************************************

文件名称:TreeOS_IRR.c
作者:林添孝
适用TreeOS:本软件适用于TreeOS v1.0实时操作系统。
移植时请注意标记 “//M/ ”,表示该处软件可能需要修改(Modify)。
学员若有疑问或建议,请发邮件到 treeos@sina.com 与我们联系。

版本:Ver 1.00, 2012
配置:缺省配置适用 GL210C51 v1 开发板。

功能:
红外遥控器解码程序
注意:波形读取的数据与晶振频率,T1分频有关!
1)遥控器以NEC upd6121G或HT6221为主控芯片遥控器:NEC码
2)使用T2的下降沿捕获中断,读取低电平脉冲宽度,再进行解码
4)一次键码共4Byte 32位:地址码H+地址码L+键码+键码反码; LSB(D0)先出
5)扫描的结果会把键值放在IRRkey
6)如果需要管理按键时间,开放USE_IRR_KEY_TIMER

包括:


*******************************************************************************/

/********includes**************************************************************/
#include<reg52.h> //M/

#include "TreeOS_IRR.h"

/********全局变量**************************************************************/
//解码变量
//ui32 IRRbit; //解码位数据                //左移大于16位就出错,故弃用
ui8 IRRbit; //解码位数据
ui8 IRRbit_prt=0; //解码位指针
enum FLAG IRRkeep=RESET; //持键标志
ui8 IRRkeyval=0; //键值


//接收数据
ui16 edgetime; //波形边沿T1读数
ui8 ov_counter=0;//记录T1溢出的次数

ui16 IRRaddr;//遥控器的设备地址

/******************************************TreeOS Real-Time Operating System****
Function Name:
Description: 捕获中断服务子程序:
Input      :
Output       :
Return       : 返回键码

//捕获中断,用于遥控器输入:INT0
//设置为falling edge
//1)遥控器以upd6121G或HT6221为主控芯片遥控器
//2)每帧108ms.
//3)引导区:9msL+4.5msH
//4)位定义:0(1.12ms):0.56msL+0.56msH;1(2.24ms):0.56msL+1.68msH;
//5)持续按键:9msL+2.5msH+0.56msL
//6)测量接收波形中下降沿脉宽
//7)一次键码共4Byte 32位:地址码+地址码反码+键码+键码反码; LSB(D0)低位先收
//8)扫描的结果会把键值放在IRRkeyval
////////////注意,经常有干扰脉冲进来!////////////////
*******************************************************************************/
void IRR_capt_isr(void)
{
ui16 value;//2次下降沿中断之间的时间差,T1每个记数代表1(11.0592M/12分频)=1.085us

//timer 1 input capture event, read (int)value ;
TR1=0;//STOP T1
value=TL1;            //Read low byte first (important)
value|=(ui16)TH1 << 8; //Read high byte and shift into top byte

//读完数据后使能中断嵌套.计算时间较长,以免阻塞其他中断响应

//计算2次下降沿中断时间差,T1每个记数代表1(11.0592M/12分频)=1.085us
//value=(ui32)value-(ui32)edgetime+((ui32)ov_counter<<16);//*0x10000;
//ov_counter=0;
//edgetime=value;

//判断引导区
if(value>BOOT_MIN && value<BOOT_MAX)
   {
          IRRbit_prt=0;//位指针清零
          IRRkeep=RESET;
          //IRRbit=0;        //接收数据清0
          IRRbit=0; //接收数据清0
          IRRbit=0;
          IRRbit=0;
          IRRbit=0;
       }
//数据位
else if(value>L_MIN && value<L_MAX)//收到0
   {
          IRRbit_prt++;//位指针
       }
else if(value>H_MIN && value<H_MAX)//收到1
   {
          //if(IRRbit_prt<32) IRRbit|=(1<<IRRbit_prt);                 //左移大于16位就出错,故弃用
          IRRbit|=(1<<(IRRbit_prt&0x07));        //即除以8和求8的余数,计算大为简化
          IRRbit_prt++;//位指针
       }
//持续按键
else if(value>KEEP_MIN && value<KEEP_MAX)
   {
          IRRkeep=SET;//设置键保持标志
       }

TL1=0;   //T1计数器清零
TH1=0;
TR1=1;   //T1开始计数
}


/******************************************TreeOS Real-Time Operating System****
Function Name:
Description: 取键码子程序: 已收满32位,判断键值
               4个字节,从高到低排序:键码反码,键码,地址低字节,地址高字节
Input      : IRRbit:解码值
Output       :
Return       : 返回键码
*******************************************************************************/
/*ui8 get_IRRkey(void)
{
ui8 i, val;
ui16 addr;
                   //先判断数据反码是否正确
                                   i=IRRbit>>24;
                                   val=IRRbit>>16;
                                   //if(i!=(~val)) return 0; //反码错误,返回
                                  
                                   //判断双字节用户地址码是否正确
                                   i=IRRbit>>8;
                                   addr=(IRRbit<<8);
                                   addr|=i;
                                   //if (addr!=IRR_CUSTOM_CODE) return 0;//地址码错误          

                                   //返回键值
                                   return val;       

                                  


}*/
       
/******************************************TreeOS Real-Time Operating System****
Function Name:
Description: 红外遥控器全局任务扫描程序
Input      :
Output       : 遥控器键值IRRkeyval
Return       :
*******************************************************************************/
void scan_IRR_key(void)
{

if (IRRbit_prt>=32)//已收满32位,取键值               //IRRbit_prt读写是原子操作
        {
       //IRRkeyval=get_IRRkey();   
       if(IRRbit!=~IRRbit)IRRkeyval=0; //反码错误           //IRRbit[ ]读写是原子操作
       else if ((((ui16)IRRbit<<8)|IRRbit) != IRR_CUSTOM_CODE) IRRkeyval=0;//地址码错误
       else IRRkeyval=IRRbit;//键码
       IRRbit_prt=0;
        }

}

/***** (C) COPYRIGHT 2012Beijing GuangLun Electronic Technology Co., Ltd.****/




文件名称:TreeOS_IRR.h
作者:林添孝
适用TreeOS:本软件适用于TreeOS v1.0实时操作系统。
移植时请注意标记 “//M/ ”,表示该处软件可能需要修改(Modify)。
学员若有疑问或建议,请发邮件到 treeos@sina.com 与我们联系。

版本:Ver 1.00, 2012
配置:缺省配置适用 GL210C51 v1 开发板。


功能:
TreeOS_IRR.c的配置文件

/********防止冲突 prevent recursive inclusion**********************************/

#ifndef _TREEOS_IRR_H
#define _TREEOS_IRR_H

/********includes**************************************************************/

#include "TreeOS_typedef.h"

/********条件编译选择**********************************************************/


/********属性******************************************************************/

//计算2次下降沿中断时间差: 波形特征(NEC码)
//以下的数值与晶振频率和T2分频有关
//T1每个记数代表1/(11.0592M/12分频)=1.085us。1ms=921.66个记数
#define BOOT_MAX 13364//M/ 14.5MS.9+4.5=13.5ms //引导区
#define BOOT_MIN 11521//M/12.5MS
#define KEEP_MAX 11520//M/ 12.5MS. 9+2.5=11.5ms //持键(连发)
#define KEEP_MIN9677//M/ 10.5MS.
#define L_MAX1548   //M/1.68ms    1.12ms//脉冲数据区
#define L_MIN516      //M/0.56ms
#define H_MAX2580   //M/2.80ms   2.24ms
#define H_MIN1549   //M/1.68ms

//IRRkeytimer、IRRnokeytimer计时单位=IRR_FRAME_CYCLE+ScanWhile()拖延时间
//总时长应>(1+10%)*108ms。NEC码一帧数据时长=108ms
#define IRR_FRAME_CYCLE130//M/ 单位=T0周期(例如 1ms)

//设备地址码(用户码):由遥控器厂家给定
#define IRR_CUSTOM_CODE    0x00FF   //M/

//键值定义(具体项目再确定)

#define IRR_CH_MINUS       0x45   //M/
#define IRR_CH             0x46   //M/
#define IRR_CH_PLUS      0x47   //M/

#define IRR_PREV         0x44   //M/
#define IRR_NEXT         0x40   //M/
#define IRR_PLAY_PAUSE   0x43   //M/

#define IRR_VOL_MINUS      0x07   //M/
#define IRR_VOL_PLUS       0x15   //M/
#define IRR_EQ             0x09   //M/

#define IRR_KEY0         0x16   //M/
#define IRR_100_PLUS       0x19   //M/
#define IRR_200_PLUS       0x0D   //M/

#define IRR_KEY1         0x0C   //M/
#define IRR_KEY2         0x18   //M/
#define IRR_KEY3         0x5E   //M/

#define IRR_KEY4         0x08   //M/
#define IRR_KEY5         0x1C   //M/
#define IRR_KEY6         0x5A   //M/

#define IRR_KEY7         0x42   //M/
#define IRR_KEY8         0x52   //M/
#define IRR_KEY9         0x4A   //M/


/********IO定义****************************************************************/

/********特殊语句**************************************************************/

/********全局变量声明**********************************************************/
extern ui8 IRRbit; //解码位数据
extern ui8 IRRbit_prt; //解码位指针
extern enum FLAG IRRkeep; //持键标志
extern ui8 IRRkeyval; //键值


/********函数声明**************************************************************/
void IRR_capt_isr(void);
//ui8 get_IRRkey(void);
void scan_IRR_key(void);

#endif

/***** (C) COPYRIGHT 2012Beijing GuangLun Electronic Technology Co., Ltd.****/

SNOOKER 发表于 2013-12-22 22:42:05

你应该用示波器或逻辑分析仪,而不是用你写的有可能有问题的程序去测一个未知的波形

林州 发表于 2013-12-23 17:27:08

批评的很对,没有示波器啊!
页: [1]
查看完整版本: 红外遥控解码,引导码前出现8个小脉冲求解?