打印

eeprom数据记不住 求教大侠们。。。。。。。。

[复制链接]
1295|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jxwhf2007|  楼主 | 2014-7-31 14:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<pic.h>
#define uchar unsigned char
#define uint  unsigned int

__CONFIG(0xFF32);

uint initnum;                                //定义一个溢出中断的变量
uchar receive;
uchar SJ;                                //eeprom数据

bit flag;
bit flag_write;

//-------------------------------------------------------
//延时子程序
void delay(uint dat)
{
        unsigned int k;
        for(k=0;k<dat;k++);
}
//--------------------------------------------------------------------------------
void init()                       
{
        ADCON0=0X00;
        ADCON1=0X06;                //PORTA口设置为I/O口
       
        CMCON=0x07;                //比较器关闭,RA0-RA3为IO
        CVRCON=0x00;                //比较器电源关闭
       
        TRISA=0X00;
        TRISB=0x00;
        TRISC=0XCF;                //串口用时 RC7/RC6必须是输入
        TRISD=0X00;                               
        TRISE=0X00;

        PORTA=0X3F;
        PORTB=0XFF;
        PORTC=0XFF;
        PORTD=0XFF;
        PORTE=0X07;
       
        INTCON=0xc0;                                //设置中断控制寄存器为11000000,始终只用到两个位开总中断,开第一外设允许中断
        PIE1=0x01;                                //使能定时器1为00000001开中断,始终只用一最后一个其他的不用理会
        TMR1L=(65536-50000)%256;        //装初傎,因为定时器1是16位的,要装满65536个数后才满加1(也就是65536us),如果设50ms(50000us)就加1,则要先装一个初值65536-50000
        TMR1H=(65536-50000)/256;        //又因为要将初值分开装在低八位和高位里,而八位只有256个数,所以对256求模得整数看有多少个256装在高八位,余下的属于低八位的就求余
        T1CON=0x01;                                //00000001在初始化中只用到最后一位就是开始启到动定时器1(设置预分频器和后分频器)
        flag=0;
        SJ=0xFF;
        flag_write=0;


        SPBRG=71;                        //设置波特率为9600BPS
        TXSTA=0X24;                //使能串口发送,选择高速波特率                //0010 0100
        RCSTA=0X90;                //使能串口工作,连续接收                        //1001 0000
        RCIE=1;                        //使能接收中断                                        //0000 0001
        RC5=0;

        receive=0xff;
}
//---------------------写EEPROM-------------------------------------------------
void WRITEEE(uchar EEadd,uchar EEdata)
{
        while(WR);                //等待写完成
        EEADR=EEadd;                //写入地址信息
        EEDATA=EEdata;        //写入数据信息
        EEPGD=0;                        //操作数据EEPROM
        GIE=0;
        WREN=1;                         //写EEPROM允许
        EECON2=0x55;                //写入特定时序
        EECON2=0xaa;
        WR=1;                         //执行写操作
        while(WR);                //等待写完成
        WREN=0;                        //禁止写入EEPROM
        GIE=1;
}
//---------------------读写EEPROM-------------------------------------------------
uchar READEE(uchar EEadd)
{
        uchar vaule;
        while(RD);                //等待读完成
        EEADR=EEadd;                //写入要读的址址
        EEPGD=0;                        //操作EEPROM
        RD=1;                        //执行读操作
        while(RD);                //等待读完成
        vaule=EEDATA;
        return vaule;        //返回读取的数据
}
//------------------------------------------------------------------------------
void interrupt time1()                        //定时器的程序,后面不用写和51单片机那样的序号,也不用就算写在主函数的后面也不用声明
{   
        if(TMR1IF)  
                {                                                                
                 TMR1IF=0;                                                //先清零,同时知道是用TMR1定时器
                 TMR1L=(65536-50000)%256;                //也要重新装一次初值,从这个初值的基础上加
                TMR1H=(65536-50000)/256;
                initnum++;                                        //加一
                if(initnum==60)                                //它每50ms产生溢出中断,20次则是一秒
                        {
                        initnum=0;                                //到了1s后清零
                           flag=1;                                        //取反,再到第二次溢出又取反电平
                        }
                }
        if(RCIE&&RCIF)                                        //判断是否为串口接收中断
                {
                RCIF=0;
                receive=RCREG;                                //接收数据并存储
                flag_write=1;
                RC5=1;
                TXREG=receive;
                while(!TRMT);       
                RC5=0;
                }
}
//-------------------------------------------------------------------------------
void main()               
{
        init();
        SJ=READEE(0);
        RC4=0;
        delay(10000);
        RC4=1;
         while(1)
        {
        PORTB=SJ;
        if(flag_write==1)
                {
                flag_write=0;
                WRITEEE(0,receive);
//                SJ=READEE(0);
                RC4=0;
                delay(10000);
                RC4=1;
                }               
        if(flag==1)
                {
                flag=0;
                PORTA=~PORTA;
//                PORTB=~PORTB;
                PORTD=~PORTD;
                }
        }
}

以上是程序,PIC初学者,当串口发送数据后,写入EEPROM后,马上读可以读到,但停电后,数据就没有了,什么问题,请大侠们指点!注释有问题 不理会!
沙发
yklstudent| | 2014-7-31 16:02 | 只看该作者
直接使用编译器自带的看看

使用特权

评论回复
板凳
peie| | 2014-7-31 16:22 | 只看该作者
你能确保你上电后不会把一个未知数据写入EEPROM?要考虑硬件因素引起串口读取误动作,那么你的机器每次上电都会写入一个永远不知道的值,也就是你掉电前数据在上电已经被改写。

使用特权

评论回复
地板
jxwhf2007|  楼主 | 2014-7-31 16:28 | 只看该作者
yklstudent 发表于 2014-7-31 16:02
直接使用编译器自带的看看

一样效果,不停电时操作正常,停电后再上电,EEPROM的数据就没有了!

使用特权

评论回复
5
jxwhf2007|  楼主 | 2014-7-31 16:48 | 只看该作者
peie 发表于 2014-7-31 16:22
你能确保你上电后不会把一个未知数据写入EEPROM?要考虑硬件因素引起串口读取误动作,那么你的机器每次上电 ...

确实是硬件上电时把EEPROM篡改了, 我加了个写入条件就好了 ,高手,但是每次被篡改的后的数据为什么都是0呢,不是随机的数呢?

使用特权

评论回复
6
peie| | 2014-7-31 16:53 | 只看该作者
jxwhf2007 发表于 2014-7-31 16:48
确实是硬件上电时把EEPROM篡改了, 我加了个写入条件就好了 ,高手,但是每次被篡改的后的数据为什么都是 ...

串口误动作,这个误动作过程也可能是“00000000”,也可能是随机数,这个取决于你的硬件电路

使用特权

评论回复
7
peie| | 2014-7-31 16:57 | 只看该作者
建议你的串口RX端加一个上拉电阻,或者确保上电过程RX端是高电平,另一个方法,上电正常后再初始化串口功能

使用特权

评论回复
8
Rain_King| | 2014-7-31 17:46 | 只看该作者
上电,和断电时,是电压不稳定的时候,会出现这些问题,做好一些上电延时就好了............

使用特权

评论回复
9
jxwhf2007|  楼主 | 2014-8-3 22:41 | 只看该作者
peie 发表于 2014-7-31 16:57
建议你的串口RX端加一个上拉电阻,或者确保上电过程RX端是高电平,另一个方法,上电正常后再初始化串口功能 ...

受教!谢谢

使用特权

评论回复
10
donghailao| | 2014-8-4 17:53 | 只看该作者
同意8#楼,上电复位没有做好导致程序自己先跑了一圈。

使用特权

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

本版积分规则

19

主题

37

帖子

0

粉丝