打印

无线遥控解码问题

[复制链接]
2540|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
西门闩|  楼主 | 2010-12-8 09:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的是超外差发射接收,接收部分的数据脚在没有数据输入时,总是有高电平杂波,我的接收就是检测高低电平的,这样就出与了误判,有没有做过这一块的高手,帮忙想想办法,要怎么解码?
沙发
yewuyi| | 2010-12-8 10:15 | 只看该作者
印象中超外差方式,这是免不了的。

可以按照以下方式处理看看:
1、接受模块的输出脚接一个固定电阻到VCC,再接一个104电容到GND
2、软件对接收信号进行一定的处理,例如发现来信号后,可以检测一下高低电平的宽度是否满足规范,否则可当成干扰放弃。
3、软件对接收数据进行一定的处理,采用发送报文的方式,在报文尾部加入CRC8校验,对报文进行CRC校验,发现校验不对则当成接受错误放弃。

使用特权

评论回复
板凳
西门闩|  楼主 | 2010-12-8 12:31 | 只看该作者
void waitleader()
{
        uchar tmr0_number;
        if(T0IF==1)
        {
                T0SE=1;//改为下降沿触发
                TMR0=255;       
                T0IF=0;//清中断标志位
                if(T0IF==1)
                {
                        tmr0_number=tmr0_number|TMR0;
                        if(tmr0_number>838)
                        {
                                T0SE=0;//改为上降沿触发
                                TMR0=255;
                                T0IF=0;//清中断标志位
                                GIE=1;//开中断
                        }
                }
        }
}

我用TMR0来计数,进行修改输入脉冲的边沿,理论上是可以的,但是出现了一个问题,明明在初始化里面是设置的上升沿,T0IF溢出后,进入第一个if语句,在第一个if语句里面将T0SE赋值为1,设置为下降沿触发TMR0递增,但是进入不了第二个if语句,这是为什么呢?

使用特权

评论回复
地板
yewuyi| | 2010-12-8 13:06 | 只看该作者
waitleader()是什么!?

是中断函数!?

我的天,如果是中断函数,你这段代码可是问题太多了。

使用特权

评论回复
5
西门闩|  楼主 | 2010-12-8 17:59 | 只看该作者
不是中断函数,是检测引导码的,6.55mS的高电平,838uS的低电平,先修改T0SE=0选择输入脉冲的上升沿,再改为下降沿,并计算TMR0的时间值,以此来判断是否为引导码,如果为真,再修改为脉冲的上升沿,等到上升沿到来时,进入中断。
中断函数没有写出。

使用特权

评论回复
6
西门闩|  楼主 | 2010-12-9 10:39 | 只看该作者
void init()
{
        OPTION=0x28;//外部T0CKI输入,上升沿触发,分频器给WDT
        TRISA=0x10;//RA4输入
        INTCON=0x20;//允许TMR0中断,暂不开总中断
        PIE1=0;//禁止TMR1中断
        TMR0=255;//将TMR0设为最大值,来一个脉冲既可溢出
        T1CON=0;//TMR1分频比为0,暂不开启
        TMR1L=0;
        TMR1H=0;
}
void checkleader()
{
        uint tmr1_number;
        if(T0IF==1)
        {
                TMR1ON=1;//开TMR1
                TMR0=253;
                OPTION=0x38;//改为下降沿触发
                T0IF=0;//清中断标志位
                if(T0IF==1)
                {
                        tmr1_number=tmr1_number|TMR1H;
                        tmr1_number=tmr1_number<<8;
                        tmr1_number=tmr1_number|TMR1L;
                        if(tmr1_number>6545)
                        {
                                OPTION=0x28;//改为上降沿触发
                                TMR0=255;
                                T0IF=0;//清中断标志位
                                GIE=1;//开中断
                        }
                }
        }
}

现在我用TMR1计时,用TMR0计数,用来检测前导码,但是在初始化的时候定为脉冲的上升沿触发,在检测到T0IF置1后,修改为检测输入脉冲的下降沿,但是进不了第二个if语句,是怎么回事?

使用特权

评论回复
7
yewuyi| | 2010-12-9 12:29 | 只看该作者
倒塌了,你自己好好想想你这个代码够不够乱!?

想想如何合理的完全通过中断来完成这些任务!?

使用特权

评论回复
8
西门闩|  楼主 | 2010-12-9 12:56 | 只看该作者
我这个不是中断的程序,只是一个前导码的解码程序,一旦前导码解码正确,才会进入中断的。

使用特权

评论回复
9
西门闩|  楼主 | 2010-12-9 17:08 | 只看该作者
可能是软件单步仿真有问题,我刚才没有在watch里面打开porta,现在打开了,也可以进了,可是过了一会,又进入不了了,

搞得我这几天好不烦。

使用特权

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

本版积分规则

71

主题

288

帖子

1

粉丝