搜索
bottom↓
回复: 24

315M再超生软件编解问题

[复制链接]

出0入0汤圆

发表于 2008-8-20 16:16:09 | 显示全部楼层 |阅读模式
我在用315M再超生接收模块时用视波器看到数据输出脚不停的输出方波(不是干扰信号),测试出是摸块输出的方波(不是接收到的用有信号)。然后在数据输出脚接了个39k电阻上拉,软件解码仁然跳出(只捕获到启示信号,然后就是大于启示信号的高电平跳出),解不出码来。请问各位高人,输出脚怎么处理掉方波,有经验的朋友希望告诉我方波频率。
小弟 实验事实证明软件编码正确。

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

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

出0入0汤圆

发表于 2008-8-20 16:31:20 | 显示全部楼层
“超再生”

出0入0汤圆

发表于 2008-8-20 16:33:56 | 显示全部楼层
应该是供电电源的干扰导致的吧,我原来用开关电源供电时碰到过这种情况,改用模拟电源就好了

出0入0汤圆

发表于 2008-8-20 16:53:56 | 显示全部楼层
超再生本来就是这样的.去看看无线通信的书.先看我的帖子也行,看完再看书.
http://www.cdle.net/bbs/dispbbs.asp?boardid=11&Id=4052

简单的说下关键:无线通信与有线通信是完全不同的,无线通信在无信号时,接收方要假定为收到任意电平/信号.
解决办法:构造数据包,前面加前导码和起始码.前导码数目一般用100~400

出0入0汤圆

发表于 2008-8-20 17:53:20 | 显示全部楼层
超再生 再超生? ^_^

出0入0汤圆

发表于 2008-8-20 19:23:08 | 显示全部楼层
先有超再生接收技术,后来才发展到现在在量使用的超外差式,不过超再式灵敏度最高,在遥控及其它领域还是有大量使用的。

出0入0汤圆

发表于 2008-8-20 20:40:27 | 显示全部楼层
应该是超再生接收方式产生的"超噪声",相当于调频收音机收不到台时的那种声音.用2262,2272做编解码就行了.

出0入0汤圆

 楼主| 发表于 2008-8-22 12:09:16 | 显示全部楼层
.

出0入0汤圆

 楼主| 发表于 2008-8-22 12:09:18 | 显示全部楼层
经过几天的测试,问题任然没有解决,我把我的编解码程序贴上来。看那位高人指导下。
编码用的51,12MHZ 解码用的AVR m8 1MHZ
编码程序。
#include <REGX51.H>
#include  <intrins.h>

#define   uchar unsigned char
#define   uint  unsigned int

#define          IR_WF         P1_3//数据发射端口

#define          IR            P1_0//指示灯
   

uchar  data           btt=0;
uint   data       count=0;       //延时计数器
static    uint    endcount=0; //终止延时计数
uchar  bdata      flag=0;      //红外发送标志
uchar  bdata          IR_SendBuf[5]={0x01,0xfe,0x57,0x58,};

uchar   bdata       timp=0;

delay_mm(uint ms)
{                                                        // 延时子程序
        uchar i;
        while(ms--)
        {
                for(i = 0; i< 250; i++)
                {
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                }
        }
}

void SendIRdata(void)
{
  int i;
  uchar  bdata  irdata=0;
  uchar  bdata         tklme=0;
////////////////////////////////////////////////
  for(tklme=50;tklme>0;tklme--)        //发送50次前导码
  {
  endcount=40;//发送1ms
  count=0;
  IR_WF=1;
  TR0=1;
  do{}while(count<=endcount);
   
  //停止3ms
  IR_WF=0;
  TR0=0;
  endcount=120;
  count=0;
  TR0=1;
  do{}while(count<=endcount);

  TR0=0;
  endcount=0;
  irdata=0;
  }
//////////////////////////////////////
//发送1ms的起始码
         
  endcount=40;
  count=0;
  IR_WF=1;
  TR0=1;
  do{}while(count<=endcount);
   
  //不发送4ms
  IR_WF=0;
  TR0=0;
  endcount=160;
  count=0;
  TR0=1;
  do{}while(count<=endcount);

  TR0=0;
  endcount=0;
  irdata=0;


//////////////////发送4字节数据///////////////////////
for(btt=0;btt<4;btt++)
{
  irdata=IR_SendBuf[btt];
  for(i=0;i<8;i++)
  {
    //先发送500us(即解码中0.5ms的低电平)
     endcount=20;
     count=0;
         IR_WF=1;
         TR0=1;
     do{}while(count<=endcount);

         TR0=0;
         endcount=0;
         count=0;
       
    //停止发送信号(即解码中的高电平)
     if(irdata-(irdata/2)*2)  //判断二进制数个位为1还是0
     {
       endcount=60;  //1为宽的高电平1500US
     }
    else
     {
     endcount=40;   //0为窄的高电平1000us
     }

        IR_WF=0;
        TR0=1;
    do{}while(count<endcount);
       
        TR0=0;
        count=0;
        endcount=0;
        irdata=irdata>>1;
  };
}

//////////////////////////////////////////////
  TR0=0;
  count=0;
// endcount=100;
// IR_WF=1;
// TR0=1;
//  do{}while(count<endcount);
//  TR0=0;
  endcount=0;
//  count=0;
  IR_WF=0;
}
//定时器0;25us中断一次
void timer0(void) interrupt 1 using  2//25us
{
TH0=0xff;
TL0=0xf4;
count++;
}

void main(void)
{
  uchar  v=0;
delay_mm(100);
  count = 0;
  flag = 0;
  IR_WF= 0;

  TMOD = 0x01; //设定时器0为16位模式1
  IE0=1;
  ET0 = 1; //定时器0中断允许

TH0=0xff;
TL0=0xf4;

TR0 = 0;

EA = 1; //允许CPU中断

  while(1)
  {
IR= 0;
for(v=15;v>0;v--)
delay_mm(100);
IR_WF=0;  //发送前端口低
IR= 1; //指示灯亮

SendIRdata();

for(v=15;v>0;v--)
delay_mm(100);
  }
}
解码部分:
//包含所需头文件
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdint.h>
#include <avr/wdt.h>


#define FREQ         1
#define BIT(x)        (1<<(x))


#define  uchar   unsigned  char
#define  uint    unsigned  int

uchar  sttf=0;
uchar  sreg=0;
uchar  sfgh1=0;
uchar  bitcnt=0;

uint   newFall=0;
uint   oldFall=0;
uchar  fiasf=0;
uchar  data0=0;
uchar  uc_overcon=0;

unsigned long   vvvv=0;
unsigned int    ui_ringt=0;
unsigned int    ui_Falling=0;

unsigned char IR[8]={0x11,0x22,0x33,0x44,0x55,};


void DelayMs(uint t)
{
uint  p;
for(p=t;p>0;p--)
_delay_loop_2(FREQ * 250);
}

//定时器T1溢出中断服务程序
//#pragma interrupt_handler timer1_ovf_isr:9
//void timer1_ovf_isr(void)
SIGNAL(SIG_OVERFLOW1)
{
        uc_overcon++;
       
}

//定时器T1输入捕捉中断服务程序
//#pragma interrupt_handler timer1_capt_isr:6
//void timer1_capt_isr(void)
SIGNAL(SIG_INPUT_CAPTURE1)
{       

if(PINB&_BV(PB0))
{
ui_ringt=ICR1;
TCCR1B=0x00;
TCCR1B|=0X82;//设置成下降沿中断
uc_overcon=0;//益出计数器开始记数
}
else
{
ui_Falling=ICR1;
TCCR1B=0x00;
TCCR1B|=0xC2;//设置成上升沿中断
vvvv=(unsigned long)ui_Falling-(unsigned long)ui_ringt;//+(unsigned long)uc_overcon*0x10000/500;
ui_Falling=0;
ui_ringt=0;
uc_overcon=0;
}

/////////////////////header信号高电平4MS/////////////////////////
if((vvvv>3800) && (vvvv<4100))
{
bitcnt=0;       
data0=0;
vvvv=0;
fiasf=0;
}

if((vvvv>850) && (vvvv<1050)) // "0"信号高电平1MS
{
sttf=0;
vvvv=0;
bitcnt++;
data0=(data0>>1)+sttf;

}

if((vvvv>1400) && (vvvv<1600)) //“1”信号高电平1.5MS
{
   sttf=1;
   vvvv=0;
   bitcnt++;
   data0=((data0>>1)+sttf);
}

///////////////大于头信号时间退出/////////////////////////
if(vvvv>4200)
{   
        TCCR1A = 0x00;
    TCCR1B = 0x00;

    TCNT1H = 0x00;
    TCNT1L = 0x00;

    ICR1H  = 0x00;
    ICR1L  = 0x00;//输入捕捉匹配值
       
    TCCR1A = 0x00;
    TCCR1B = 0x81;//启动定时器
       
   
        bitcnt=0;
    vvvv=0;
    return;
}


if(bitcnt==7) //接收8位数据满
    {
        loop_until_bit_is_set(UCSRA,UDRE);
    UDR=data0;
        IR[0]=data0;
        data0=0;
    }
       
else if(bitcnt==15) //接收16位满
    {
        loop_until_bit_is_set(UCSRA,UDRE);
    UDR=data0;
        IR[1]=data0;
        data0=0;
    }
else if(bitcnt==23) //接收24位满
    {
        loop_until_bit_is_set(UCSRA,UDRE);
    UDR=data0;
        IR[2]=data0;
        data0=0;
    }
       
else if(bitcnt==31) //接收32位满
    {
        loop_until_bit_is_set(UCSRA,UDRE);
    UDR=data0;
        IR[2]=data0;
        data0=0;
    sreg = SREG;
    cli(); //禁止所有中断
        TCCR1A = 0x00;
    TCCR1B = 0x00;

    TCNT1H = 0x00;
    TCNT1L = 0x00;

    ICR1H  = 0x00;
    ICR1L  = 0x00;//输入捕捉匹配值
       
    TCCR1A = 0x00;
    TCCR1B = 0x81;//启动定时器
       
        SREG=sreg;
    bitcnt=0;
    }
else if(bitcnt>=32) //接收8位满
    {
        loop_until_bit_is_set(UCSRA,UDRE);
    UDR=data0;
        sreg = SREG;
    cli(); //禁止所有中断
        TCCR1A = 0x00;
    TCCR1B = 0x00;

    TCNT1H = 0x00;
    TCNT1L = 0x00;

    ICR1H  = 0x00;
    ICR1L  = 0x00;//输入捕捉匹配值
       
    TCCR1A = 0x00;
    TCCR1B = 0x81;//启动定时器
        SREG=sreg;
    vvvv=0;
        data0=0;
    bitcnt=0;
        }


}


int main( void )
{   
    DelayMs(100);
    cli(); //禁止所有中断
        MCUCR  = 0x00;
        MCUCSR = 0x80;//禁止JTAG
        GICR   = 0x00;
       
        TCCR1B=0x00;
       
        PORTB=0B00000000;                      //PB0(ICP)上拉使能
    DDRB =0B00000000;                      //定义输入
       
        PORTC =0B00000000;                           //定义输入
        DDRC  =0B00000000;                           //PC4上拉使能
       
        PORTD =0B00000100;
        DDRD  =0B00000010;                           
       
        TCCR1B|=0xC2;//上升沿,1/8分频
       
        TIMSK|=0X24;//定时器,和扑获中断
       
       
    UCSRB = 0x00;//禁止中断
        UCSRA = 0x00;
        UCSRC = _BV(URSEL) | 0x36;
        UBRRL = 0x05;
        UBRRH = 0x00;
    UCSRB = _BV(TXEN);//接收使能、发送使能、(调试用)
        sei();//开全局中断
       
while(1)
{
asm("nop");
}
}

出0入0汤圆

发表于 2008-8-24 15:45:09 | 显示全部楼层
前几天也在搞这个,接收灵敏度是-103dbm的模块,在无信号的时候,确实会有很多方波。
(那种低功耗的模块,灵敏度低的,在无信号时,不会有方波)

我解决的方法是,发射端在发送编码的时候,
加上一个规定宽度的同步头,我自己定为3ms,
数据编码采用曼切斯特,数据校验用DOW(DS1990A)

出0入0汤圆

发表于 2008-8-24 15:47:59 | 显示全部楼层
还有就是,这种模块本身就传输的速率有要求的,要小于10Kps,
所以发射端传输的位周期要控制好,我的是位周期512uS

出0入0汤圆

发表于 2008-8-24 17:55:22 | 显示全部楼层
楼上的可以参考  《无线电》杂志2008 第一期里的 《用单片机做的8通道无线遥控器》里面有详细的软件解决办法。

出0入0汤圆

 楼主| 发表于 2008-8-25 14:42:37 | 显示全部楼层
谢谢楼上的.我做好了全部贴上来

出0入0汤圆

发表于 2008-9-2 22:22:44 | 显示全部楼层
关注,LZ解决了吗?我现在也在弄这个,很头痛,QQ232416606,希望能交流交流

出0入0汤圆

发表于 2008-9-3 08:13:53 | 显示全部楼层
l

出0入0汤圆

发表于 2008-9-3 11:08:40 | 显示全部楼层
吐鲁番、海南岛、少林寺....再超生....

出0入0汤圆

发表于 2010-9-29 00:11:23 | 显示全部楼层
不知LZ这个问题是否解决了,如果解决了,能否如你所说,贴出来给大家分享一下。先谢了。

出0入0汤圆

发表于 2010-9-29 00:52:47 | 显示全部楼层
这是小问题,你不了解无线通信的特性罢了.

1.发射要加引导头(01010101.....),而且要很长.
2.不允许长时间的0和1

出0入0汤圆

发表于 2011-10-22 11:09:49 | 显示全部楼层
mark,正好用得到,谢谢

出0入0汤圆

发表于 2012-4-19 10:34:33 | 显示全部楼层
这几天我也在搞这个,搞得头都大了

出0入0汤圆

发表于 2013-3-15 08:50:14 | 显示全部楼层
883zly 发表于 2008-8-22 12:09
经过几天的测试,问题任然没有解决,我把我的编解码程序贴上来。看那位高人指导下。
编码用的51,12MHZ 解 ...

那个315的搞定了没? 共享下哦..

lswlc0502@qq.com

谢谢了

出0入0汤圆

发表于 2013-3-15 08:55:43 | 显示全部楼层
超再生的平时有方波出现,超外差的就会好很多,有用的信号就夹杂在其中,软件就是要从一堆比较乱的信号中找出你自己的信号。

出0入0汤圆

发表于 2013-8-1 18:58:45 | 显示全部楼层
楼主搞定了吗?分享一下看看

出0入0汤圆

发表于 2013-8-6 21:16:32 | 显示全部楼层
whimsy 发表于 2008-8-24 15:45
前几天也在搞这个,接收灵敏度是-103dbm的模块,在无信号的时候,确实会有很多方波。
(那种低功耗的模块, ...

有具体一点资料吗

出0入4汤圆

发表于 2014-10-19 19:51:06 | 显示全部楼层
不知楼主把问题解决了没有
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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

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