搜索
bottom↓
回复: 16

PIC片内EEPROM遇到的奇怪问题

[复制链接]

出0入0汤圆

发表于 2014-12-5 09:59:10 | 显示全部楼层 |阅读模式
代码如下,遇到了两个问题:
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();
        }
}       

出0入0汤圆

 楼主| 发表于 2014-12-5 10:00:11 | 显示全部楼层
顶一下,,,

出0入0汤圆

 楼主| 发表于 2014-12-5 11:37:14 | 显示全部楼层
求大神

出0入0汤圆

发表于 2014-12-5 13:27:03 | 显示全部楼层
                CLRWDT();                         //循环存储模式数据
                eeprom_write(eeprom_address,*address_light_mood);  //数据写入eeprom
                j=eeprom_read(eeprom_address);     //读取一次,空读取,该读取会等待写入完成,避免延时

出0入0汤圆

发表于 2014-12-5 13:27:32 | 显示全部楼层
得这样处理,我用一直没有问题

出0入0汤圆

发表于 2014-12-6 12:32:24 | 显示全部楼层
试下把这两行交换下位置,看看
TRISIO=0x19;                   //GPIO0,GPIO3,GPIO4为输入,GPIO1,GPIO2,GPIO5为输出
GPIO=0x04;                    //给GPIO2赋值为1,其余赋值为0

出0入0汤圆

 楼主| 发表于 2014-12-6 21:28:44 | 显示全部楼层
zw_7627 发表于 2014-12-6 12:32
试下把这两行交换下位置,看看
TRISIO=0x19;                   //GPIO0,GPIO3,GPIO4为输入,GPIO1,GPIO2 ...

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

出0入0汤圆

发表于 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);
}



出0入0汤圆

发表于 2014-12-7 02:46:11 | 显示全部楼层
My code:


  1.         dat=eeprom_read(2);                                        //read eeprom
  2.         while (dat==0x19) IO_FLP(LED_PORT, LED1);        //if eeprom(2)=0x19, flip led1
  3.         eeprom_write(2, 0x19);                                //otherwise, save 0x19 to eeprom(2)
  4.         while (1) {
  5.                 IO_FLP(LED_PORT, LED0);                        //flip led0
  6.         }
复制代码


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).

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-12-8 08:36:19 | 显示全部楼层
本帖最后由 xiaohunnanzi 于 2014-12-8 09:01 编辑


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

出0入0汤圆

 楼主| 发表于 2014-12-8 09:01:19 | 显示全部楼层
zw_7627 发表于 2014-12-6 12:32
试下把这两行交换下位置,看看
TRISIO=0x19;                   //GPIO0,GPIO3,GPIO4为输入,GPIO1,GPIO2 ...

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

出0入0汤圆

 楼主| 发表于 2014-12-8 09:04:22 | 显示全部楼层
zhutr99 发表于 2014-12-5 13:27
得这样处理,我用一直没有问题

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

出0入0汤圆

发表于 2014-12-8 10:21:27 来自手机 | 显示全部楼层
对,重点检查配置字

出0入0汤圆

发表于 2014-12-8 13:16:39 | 显示全部楼层
我的CPD一直是OFF的,编程的时候应该是不会自动擦除EEPROM的吧.

出0入0汤圆

发表于 2014-12-8 14:09:17 来自手机 | 显示全部楼层
配置字吧,我也是用那个函数,没问题

出0入20汤圆

发表于 2014-12-9 08:54:06 | 显示全部楼层
编程器把校正字擦除了,写入程序不完全吧。换一片新的,重写。

出0入0汤圆

 楼主| 发表于 2014-12-9 14:50:49 | 显示全部楼层
终于知道了,
1、配置字CDP禁止外部编程器读EEPROM,对CPU访问EEPROM无影响
2、编程器烧写程序后,单片机就已经开始运行了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-1 12:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表