打印

EEPROM掉电被清0

[复制链接]
818|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangzsa|  楼主 | 2021-4-1 20:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我按照例程序读写PIC18F25K80的EEPROM,仿真状态下,感觉读写正常(写完 再读,比较数值是正确的),但是有两个问题,就是在仿真状态下看MPLAB中EEPROM,数据不跟随我写而变化,这个很奇怪!!! 2 是掉电后重新上电,发现之前写的EEPROM全部清0了。 求指教!!! 我怀疑我写的数据没存进EEPROM区,所以和仿真器看到的不对应,而且重新上电后被清0了。 下面是读的程序,非常简单,但是就是读出来的和MPLAB中显示不一样
unsigned char EE_Read (unsigned char EE_Address)
{
        EEADR = EE_Address;
        EEADRH = 0;
        EECON1bits.EEPGD = 0;
        EECON1bits.RD = 1;
        return EEDATA;
}

使用特权

评论回复
沙发
wangzsa|  楼主 | 2021-4-1 20:55 | 只看该作者

void EE_Write (unsigned char EE_Address, unsigned char EE_Data)
{
//*************************************************
//*单字节EEPRO写程序
//*地址:EE_Address  
//*数据:EE_Data
//*************************************************

        PIR4bits.EEIF = 0;
        EEADR = EE_Address;
        EEADRH = 0;
        EEDATA = EE_Data;
        EECON1bits.EEPGD = 0;
        EECON1bits.WREN = 1;
        INTCONbits.GIE = 0;

        _asm
                MOVLW        0X55
                MOVWF        EECON2,0
                MOVLW        0XAA
                MOVWF        EECON2,0
                BSF                EECON1,1,0
        _endasm

        INTCONbits.GIE = 1;
        while (!PIR4bits.EEIF);
        PIR4bits.EEIF = 0;
        EECON1bits.WREN = 0;
}
这时写EEPROM的程序,都是参考别人的例程。自写自读比较是对的,但是和MPLAB中看的EEPROM不一致,而且掉电清0,

使用特权

评论回复
板凳
jiajs| | 2021-4-1 20:57 | 只看该作者

你可以试下microchip自带的读写EEPROM函数
void Write_b_eep( unsigned int badd,unsigned char bdata )
unsigned char Read_b_eep( unsigned int badd )

使用特权

评论回复
地板
huangchui| | 2021-4-1 20:59 | 只看该作者
你用在线汇编写的,有没有页面的问题?另外别太把仿真当回事,经常不准。

使用特权

评论回复
5
bqyj| | 2021-4-1 21:01 | 只看该作者
最近我也遇到同样的问题,我是写到EEPROM数据存储器(非程序程储器),写好数据复位后再次读出为正常,但关电后就读为0或255.请问楼主搞定没?我用中断方法也试过,同样的问题。
void write_eeprom(uchar ee2,uchar ee3)//PIC内部EEPROM写程序
{   
    //EEIE=1;
    EEIF=0;
    EEADRL=ee2;//送写入地址
    EEDATL=ee3;//送写入数据
    EEPGD=0;//选择EEPROM数据存储器
    //CFGS=0;//只选择读取EEPROM数据存储器
    NOP(); NOP(); NOP(); NOP(); NOP();
    GIE=0;
    WREN=1;
    EECON2=0x055;//写入解锁
    EECON2=0x0aa;//写入解锁
    WR=1;  
    WREN=0;
    GIE=1;
    while(WR);
    if(WRERR==0)  
}

使用特权

评论回复
6
chenho| | 2021-4-1 21:04 | 只看该作者
if(WRERR==0)  不用

使用特权

评论回复
7
zwll| | 2021-4-1 21:06 | 只看该作者
我用的芯片是PIC16F1939

使用特权

评论回复
8
xxrs| | 2021-4-1 21:07 | 只看该作者

// get 1 byte from eeprom
unsigned char Eep_Read(unsigned char eep_addr)
{
    EEADRL = eep_addr;
    EECON1bits.RD = 1;
    NOP();
    NOP();
    NOP();
    NOP();
    return EEDATL;
}

// write 1 byte to eeprom
void Eep_Wr(unsigned char eep_addr, unsigned char eep_data)
{
    EEADRL = eep_addr;
    EEDATL = eep_data;
    EECON1bits.WREN = 1;
    EECON2 = 0x55;
    EECON2 = 0xaa;
    EECON1bits.WR = 1;
    EECON1bits.WREN = 0;
    while(EECON1bits.WR)
    {
        NOP();
        NOP();
        NOP();
        NOP();
    }
}

使用特权

评论回复
9
wangzsa|  楼主 | 2021-4-1 21:11 | 只看该作者

其实还是不大明白,我再琢磨琢磨吧,多谢了哈先

使用特权

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

本版积分规则

914

主题

9040

帖子

5

粉丝