求助:pic16f1828为什么高频接收头码会出错?

2019-03-25 19:13发布

高手请指教,这段程序我在其他型号芯片用过,ok的!用pic16f1828在proteus仿真也是没问题的,但是到了实际板子上就出错了,头码要么完全匹配上(不管怎么定义头码),要么就匹配不上。小弟是想自己玩玩高频接收发送,下面有相应的部分原理图及代码。有懂的请指教,谢谢! 接收原理图 接收原理图


#include<htc.h>
#define uint unsigned int
#define uchar unsigned char
__CONFIG(0x0612);

#define _XTAL_FREQ 4000000UL
uint temp[]={0x00,0x00,0x00,0x00};
uint date_buffer[4];
uint k=0,i,id;
uint j=0,t=0,flag=0;
#define        EepromAdd                           0x00                                 //各个页的其始地址定义
void init()
{
        asm("CLRWDT");
        OPTION_REG=0x0F;
        ANSELA=0x00;
        TRISA=0x2f;
        PORTA=0x28;
        WPUA=0XFF;
        ANSELB=0x10;
        ANSELC=0x00;
        TRISC=0x00;
        PORTC=0b00010000;
        IOCAP=0x00;
        IOCAN=0x00;
        CM1CON0=0x00;
        CM2CON0=0x00;       
}       
void delay_ms(uint x)
{
        uint a,b;
        for(a=x;a>0;a--)
                for(b=108;b>0;b--);
}       
               
void main()
{
        init();
        while(1)
        {
                asm("CLRWDT");
                if(RA2==1)
                {
                        __delay_us(500);                //为了接受发码中间时刻的高低信号
                        while(j<20)        //20ms的同步头判断
                        {
                                j++;
                                if(RA2==0)
                                        break;
                               
                                __delay_ms(1);       
                        }
                        RA2=0;
                        if(j!=20)
                        {
                                j=0;
                        }       
                        else if(j==20)
                        {
                                //RC0=1;
                                while(t<20)
                                {
                                        if(RA2==1)
                                                break;
                                        t++;
                                        __delay_ms(1);
                                }
                                __delay_ms(1);
                                if(t!=20)
                                {
                                        j=0;
                                        t=0;
                                }
                                else if(t==20)
                                {
                                        RC0=1;
                                        j=0;
                                        t=0;
                                        asm("CLRWDT");
                                        RC0=0;
                                        for(k=0;k<4;k++)
                                        {
                                                //RC6=1;
                                                for(i=0;i<8;i++)
                                                {
                                                        temp[k]+=RA2<<i;
                                                        __delay_ms(2);
                                                }
                                                EEPROM_WRITE(EepromAdd+k,temp[k]);
                                        }
                                        //RC6=0;
                                        for(id=0;id<4;id++)                //读出写入EEPROM的数据,此时是为了仿真检测数据是否正确
                                        {
                                                date_buffer[id]=eeprom_read(EepromAdd+id);
                                        }
                                        if(temp[0]==0x44&&temp[1]==0x33&&temp[2]==0x77&&temp[3]==0xdd)
                                        {
                                                //asm("CLRWDT");
                                                //RC0=1;
                                                flag++;
                                                __delay_ms(200);               
                                                RC0=0;
                                                if(flag==1)
                                                {
                                                        for(id=0;id<4;id++)       
                                                        {
                                                        //        EEPROM_WRITE(EepromAdd+k,temp[k]);
                                                        }
                                                }       
                                        }
                                        for(k=0;k<4;k++)
                                        {
                                                temp[k]=0;
                                        }
                                }
                                j=0;
                                t=0;
                        }       
                }
        }
}               

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
眼大5子
1楼-- · 2019-03-25 23:41
首先我要跟你说的是,论坛有一个功能叫插入代码,希望你以后发代码类文件的时候使用该功能。
QQ截图20140312081727.jpg


其次我看了下你的代码,我建议你能不能把写eeprom和读eeprom先注解掉看结果,因为操作eeprom费时,我前两天有个东西就是因为操作eeprom导致通信出错。

37度瞳眸
2楼-- · 2019-03-26 05:21
眼大5子 发表于 2014-3-12 08:24
首先我要跟你说的是,论坛有一个功能叫插入代码,希望你以后发代码类文件的时候使用该功能。

谢谢,我试试,第一次在这上面发帖,还不熟,请见谅。
37度瞳眸
3楼-- · 2019-03-26 10:18
37度瞳眸 发表于 2014-3-13 09:11
谢谢,我试试,第一次在这上面发帖,还不熟,请见谅。

依旧不行,我觉得可能是芯片问题吧,我把这代码,改成用pic16f687的就能正确接受,找不到原因,所以我只能换芯片了,谢谢指点

一周热门 更多>