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();
}
}
顶一下,,, 求大神{:time:} CLRWDT(); //循环存储模式数据
eeprom_write(eeprom_address,*address_light_mood);//数据写入eeprom
j=eeprom_read(eeprom_address); //读取一次,空读取,该读取会等待写入完成,避免延时 得这样处理,我用一直没有问题 试下把这两行交换下位置,看看
TRISIO=0x19; //GPIO0,GPIO3,GPIO4为输入,GPIO1,GPIO2,GPIO5为输出
GPIO=0x04; //给GPIO2赋值为1,其余赋值为0 zw_7627 发表于 2014-12-6 12:32
试下把这两行交换下位置,看看
TRISIO=0x19; //GPIO0,GPIO3,GPIO4为输入,GPIO1,GPIO2 ...
哦,我试试,这有区别吗? 我用的内部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);
}
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 09:01 编辑
millwood0 发表于 2014-12-7 02:46
My code:
仿真结果的确是对的,我也仿真过了,但实测却不对,实测始终是第二个图 zw_7627 发表于 2014-12-6 12:32
试下把这两行交换下位置,看看
TRISIO=0x19; //GPIO0,GPIO3,GPIO4为输入,GPIO1,GPIO2 ...
试了一下,没有用,想不通了,还没写进去呢,就读出来了,奇怪死了 zhutr99 发表于 2014-12-5 13:27
得这样处理,我用一直没有问题
是不是用EEPROM将配置字CPD打开就能正常读写了,烧写程序时默认擦除掉的? 对,重点检查配置字 我的CPD一直是OFF的,编程的时候应该是不会自动擦除EEPROM的吧. 配置字吧,我也是用那个函数,没问题 编程器把校正字擦除了,写入程序不完全吧。换一片新的,重写。 终于知道了,
1、配置字CDP禁止外部编程器读EEPROM,对CPU访问EEPROM无影响
2、编程器烧写程序后,单片机就已经开始运行了
页:
[1]