xiaohunnanzi 发表于 2014-12-5 09:59:10

PIC片内EEPROM遇到的奇怪问题

代码如下,遇到了两个问题:
1、烧写程序后一上电,GPIO2就为1,一直不变;第二次上电GPIO还是1;
2、如果在eeprom_read和eeprom_write之间加数秒延时,烧写后刚上电GPIO为0;第二次上电为1;

而且发现在MPLAB中改写CPD配置字效果一样,烧写器是ICD2.5USB,在烧写时默认把EEPROM擦除了的;
这就很奇怪了,有没有人帮忙解答下,谢谢咯

#include <pic.h>   
#include <pic12f629.h>

void main()
{
        unsigned int i = 0, data = 0;

        TRISIO=0x19;                   //GPIO0,GPIO3,GPIO4为输入,GPIO1,GPIO2,GPIO5为输出
        GPIO=0x04;                    //给GPIO2赋值为1,其余赋值为0
        CMCON=0x07;            //比较器控制寄存器设置关,配置为数字I/O口
        OPTION_REG=0x88;    //将分频器赋值给看门狗 18ms
        WPU=0X00;                   //禁止上拉电平

        GPIO2=1;

        data = eeprom_read(2);
        while (0x19 == data){CLRWDT();}
//        for (i=60000;i!=0;i--)CLRWDT();

        eeprom_write(2,0x19);
        GPIO2=0;

        while(1)
        {
                CLRWDT();
        }
}       

xiaohunnanzi 发表于 2014-12-5 10:00:11

顶一下,,,

xiaohunnanzi 发表于 2014-12-5 11:37:14

求大神{:time:}

zhutr99 发表于 2014-12-5 13:27:03

                CLRWDT();                         //循环存储模式数据
                eeprom_write(eeprom_address,*address_light_mood);//数据写入eeprom
                j=eeprom_read(eeprom_address);   //读取一次,空读取,该读取会等待写入完成,避免延时

zhutr99 发表于 2014-12-5 13:27:32

得这样处理,我用一直没有问题

zw_7627 发表于 2014-12-6 12:32:24

试下把这两行交换下位置,看看
TRISIO=0x19;                   //GPIO0,GPIO3,GPIO4为输入,GPIO1,GPIO2,GPIO5为输出
GPIO=0x04;                  //给GPIO2赋值为1,其余赋值为0

xiaohunnanzi 发表于 2014-12-6 21:28:44

zw_7627 发表于 2014-12-6 12:32
试下把这两行交换下位置,看看
TRISIO=0x19;                   //GPIO0,GPIO3,GPIO4为输入,GPIO1,GPIO2 ...

哦,我试试,这有区别吗?

online9930 发表于 2014-12-6 21:40:10

我用的内部EEPROM程序,也是在论坛找到的,一直用没有发现问题,
/***************************************************
函数名称: E2Readbyte
功能描述:读取一字节数据
入口参数:EEAddr,地址
出口参数:
返回值 :      
其它说明:                               
***************************************************/
u8 E2Readbyte(vu8 EEAddr)
{
        EEADR = EEAddr;       //写入地址         
        EEPGD = 0;            //访问EEPROM存储区
        RD = 1;
        return EEDATA;
}       

/***************************************************
函数名称: E2Writebyte
功能描述:写入一字节数据
入口参数:EEAddr,地址;EEdata,数据
出口参数:
返回值 :      
其它说明:                               
***************************************************/
void E2Writebyte(vu8 EEAddr,vu8 EEdata)
{
        asm("CLRWDT");
        while(WR);
        EEADR= EEAddr;      //写入地址
        EEDATA = EEdata;      //写入数据
        EEPGD = 0;            //访问EEPROM存储区
        WREN = 1;             //充许擦除

        EECON2 = 0x55;      //写入密钥
        EECON2 = 0xaa;
        WR = 1;               //开始写操作
        asm("nop");
        asm("nop");

        WREN = 0;
        while(WR);
}



millwood0 发表于 2014-12-7 02:46:11

My code:


        dat=eeprom_read(2);                                        //read eeprom
        while (dat==0x19) IO_FLP(LED_PORT, LED1);        //if eeprom(2)=0x19, flip led1
        eeprom_write(2, 0x19);                                //otherwise, save 0x19 to eeprom(2)
        while (1) {
                IO_FLP(LED_PORT, LED0);                        //flip led0
        }


Essentially, it flips LED1 (=GPIO1) if eeprom(2) = 0x19; Otherwise, it writes 0x19 to eeprom(2) and then flips LED0(=GPIO0).

The simulation:

1) the waveform on the top is for the first execution (eeprom uninitialized);
2) the waveform on the bottom is from the 2nd and thereafter executions (eeprom has been initialized).

xiaohunnanzi 发表于 2014-12-8 08:36:19

本帖最后由 xiaohunnanzi 于 2014-12-8 09:01 编辑

millwood0 发表于 2014-12-7 02:46
My code:




仿真结果的确是对的,我也仿真过了,但实测却不对,实测始终是第二个图

xiaohunnanzi 发表于 2014-12-8 09:01:19

zw_7627 发表于 2014-12-6 12:32
试下把这两行交换下位置,看看
TRISIO=0x19;                   //GPIO0,GPIO3,GPIO4为输入,GPIO1,GPIO2 ...

试了一下,没有用,想不通了,还没写进去呢,就读出来了,奇怪死了

xiaohunnanzi 发表于 2014-12-8 09:04:22

zhutr99 发表于 2014-12-5 13:27
得这样处理,我用一直没有问题

是不是用EEPROM将配置字CPD打开就能正常读写了,烧写程序时默认擦除掉的?

dzrs0620 发表于 2014-12-8 10:21:27

对,重点检查配置字

zhutr99 发表于 2014-12-8 13:16:39

我的CPD一直是OFF的,编程的时候应该是不会自动擦除EEPROM的吧.

honger518 发表于 2014-12-8 14:09:17

配置字吧,我也是用那个函数,没问题

mon51 发表于 2014-12-9 08:54:06

编程器把校正字擦除了,写入程序不完全吧。换一片新的,重写。

xiaohunnanzi 发表于 2014-12-9 14:50:49

终于知道了,
1、配置字CDP禁止外部编程器读EEPROM,对CPU访问EEPROM无影响
2、编程器烧写程序后,单片机就已经开始运行了
页: [1]
查看完整版本: PIC片内EEPROM遇到的奇怪问题