打印

老生常谈的pic18Feeprom问题

[复制链接]
2032|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
taijing33|  楼主 | 2015-7-20 14:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用66k22单片机,只用内部4个字节0-3存放数据。然后把6地址用作标志。
具体应用是,eeprom出厂是0xff。我判断4地址不等于0x55的话,然后进入把初始数据写入0-3.然后写入6地址0x55.这样断电后在运行,读出的6地址,就是0x55了,不会在对0-3地址进行初始化,

我上电延时了接近1秒为的是让电压稳定后再对eeprom操作。
下面是程序,问题是程序每次上电都能进入if,读出来的a的值是00.我仿真检测6地址已经写入成功了。
我现在很纳闷,到底是因为上电延时不够还是别的原因造成一开机读eeprom不对,。


a = RDE2ROM(6);  //为什么重新上电后  。读出来的是00.
if(a!=0x55)   
{   
         delay1ms();
         WTE2ROM(6, 0x55);
         a = RDE2ROM(6);   //这个地方能写对。
         WTE2ROM(0, 0);
         WTE2ROM(1, 100);
         WTE2ROM(2, 0);
         WTE2ROM(3, 40);
         
}
set_temp_max = RDE2ROM(0);
set_temp_max = (set_temp_max<<8)+RDE2ROM(1);
set_temp_min = RDE2ROM(2);
set_temp_min = (set_temp_min<<8)+RDE2ROM(3);
沙发
taijing33|  楼主 | 2015-7-20 14:31 | 只看该作者
忘记说了,对eeprom的读写在程序运行过程中是没有问题的。问题出在重新上电的时候。

使用特权

评论回复
板凳
wuhanrf| | 2015-7-20 15:57 | 只看该作者
重新上电时,已经写入的数改变了是吗?

使用特权

评论回复
地板
taijing33|  楼主 | 2015-7-20 16:56 | 只看该作者
wuhanrf 发表于 2015-7-20 15:57
重新上电时,已经写入的数改变了是吗?

是的

使用特权

评论回复
5
wuhanrf| | 2015-7-21 10:42 | 只看该作者

是不是每次都这样?


使用特权

评论回复
6
taijing33|  楼主 | 2015-7-25 15:13 | 只看该作者
写进去是正确的,。读出来的不正确,。  而且读出来的数据中包含 每隔2个地址 包含 最后写进的数据,

我一郁闷了。

使用特权

评论回复
7
taijing33|  楼主 | 2015-7-25 15:14 | 只看该作者
比如 写进去 0x11,0x22,0x33.读出来就是 0x33,0x10,0x33,

使用特权

评论回复
8
yklstudent| | 2015-7-25 19:08 | 只看该作者
好好看看自己的代码是否有问题

使用特权

评论回复
9
黑洞不黑| | 2016-11-16 10:50 | 只看该作者
本帖最后由 黑洞不黑 于 2016-11-16 10:52 编辑

unsigned char EEPROM_read(unsigned char addr)
{
    unsigned char temp;
    EEADR=addr;//写入地址
    EEPGD=0;//bit6=0,访问数据存储器
    CFGS=0;//bit7=0,访问存储器
    EECON1bits.RD=1;//启动读操作
    GIE=0;//禁止总中断
    //while(RD);//等待读取完成
    temp=EEDATA;//读取数据
    GIE=1;//打开总中断
    return temp;
}
void EEPROM_write(unsigned char addr,unsigned char data)
{
    EEADR=addr;//写入地址
    EEDATA=data;//写入数据
    EEPGD=0;//bit6=0,访问数据存储器
    CFGS=0;//bit7=0,访问存储器
    GIE=0;//关闭总中断
    WREN=1;//使能写操作
    EECON2=0x55;//必要时序
    NOP();
    EECON2=0xAA;//必要时序
    NOP();
    EECON1bits.WR=1;//启动写操作
    while(EECON1bits.WR==1);//等待写操作完成
    GIE=1;//打开总中断
    WREN=0;//禁止写操作
    EEDATA=0;
}
看看这段代码有问题吗?读出来的数一直是出厂默认值,写不进去

使用特权

评论回复
10
PIGYONG801| | 2016-11-16 16:22 | 只看该作者
明显是软件没有做好,与上电延时无关,完成一次写的时候一定要好有延时,让内部的EEPORM部分完成写的过程

使用特权

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

本版积分规则

161

主题

361

帖子

3

粉丝