PIC单片机EEPROM有时能写进去有时写不进去

[复制链接]
6105|13
 楼主| miaohuafeng8 发表于 2013-9-26 09:38 | 显示全部楼层 |阅读模式
本帖最后由 miaohuafeng8 于 2013-9-26 09:59 编辑

#include <pic.h>         //使用单片机PIC16F628A
//#define uchar unsigned char
unsigned char hour1;
//#define                SOFT_VALUE 250 //(140-1) //0-69
void tmint(void)  //PIC16F628A定时器0初始化函数4ms计一次
{
T0CS=0;
PSA=0;
PS2=0;
PS1=1;   //1:16  4M晶振16us计一次 250次计时4ms
PS0=1;
//PSA=0;
TMR0=6;
T0IF=0;
T0IE=1;
//PEIE=0;
}
void t1mint()  //PIC16F688定时器1初始化函数 总计500ms
{
TMR1H=0x0B;
TMR1L=0xDC;
T1CON=0b00110101;  //(FOSC/4)  8分频
PSA=0;
TMR1IF=0;
TMR1IE=1;
PEIE=1;
}
void interrupt ISR(void)
{
   if(T0IF&&T0IE)  //4M晶振计时4ms
   {
    T0IF=0;
    TMR0=6;
   
   }
   if(TMR1IF&&TMR1IE) //4M晶振计时500ms
   {
    TMR1IF=0;
    TMR1H=0x0B;
    TMR1L=0xDC;
    if(PORTA==0xff)
        PORTA=0x00;
    if(PORTA==0x00)
        PORTA=0xff;
   }
}
void IO_init(void)
{
    CMCON=0x00;
    TRISA=0x00;
    TRISB=0x00;
}
unsigned char eeprom_read(unsigned char EEAddr)
{
unsigned char ReEEPROMread;
EEADR = EEAddr;
//EECON1 |= 0b00000001;
//CFGS = 0;   //PIC18F中要用到
//GIE = 0;
RD = 1;
//NOP();
hour1 = EEDATA;  //EEPROM的读数据
RD = 0;
//GIE = 1;

return hour1 ;
}
void eeprom_write_shuju(unsigned char EEAddr2)
{
EEADR = EEAddr2;   //EEPROM的地址
EEDATA = 1;   //EEPROM的写数据
  
//EEPGD = 0;
//CFGS = 0;    //PIC18F中要用到
GIE = 0;
WREN = 1;

EECON2 = 0x55;            //必须按这样的时序
EECON2 = 0xAA;
WR = 1;
while(WR==1);   //等待写操作完成
GIE = 1;
WREN = 0;
}
void vari()
{
   hour1=0;
}
main()
{

IO_init();
vari();
tmint();
t1mint();
GIE=1;
eeprom_write_shuju(0);
while(1)                                            
{
   
}
}  


简单程序如上
往EEPRoM地址0写入数据1,却有时能写进去有时写不进去,不知是何原因
使用单片机型号PIC16F628A
逍遥派掌门 发表于 2013-9-26 10:47 | 显示全部楼层
使用CCS来编译,没有发现操作EEPRoM有任何问题。

建议使用CCS。
 楼主| miaohuafeng8 发表于 2013-9-26 10:56 | 显示全部楼层
逍遥派掌门 发表于 2013-9-26 10:47
使用CCS来编译,没有发现操作EEPRoM有任何问题。

建议使用CCS。

我试试看
huangxz 发表于 2013-9-26 14:01 | 显示全部楼层
不是这个原因,eeprom在写完之后最好还是延时一点时间比较可靠。
pofu007 发表于 2013-9-26 15:46 | 显示全部楼层
eeprom_read()和eeprom_write()不用自己写吧,PIC16我都是直接调用的,楼主可以试试。
弓长月月鸟 发表于 2013-9-26 15:53 | 显示全部楼层
我也是直接调用的。看看指令之间的时间是否可靠。
shuidi_wangdan 发表于 2013-9-26 16:11 | 显示全部楼层
绝对是时序的问题!
NE5532 发表于 2013-9-26 16:58 | 显示全部楼层
楼主用编程器确认“写不进去”的时候是真的“写不进去”么?
快乐小电虫 发表于 2013-9-26 17:27 | 显示全部楼层
opal11 发表于 2013-9-26 21:34 | 显示全部楼层
时序问题
q3742829 发表于 2013-9-27 10:01 | 显示全部楼层
 楼主| miaohuafeng8 发表于 2013-10-8 17:11 | 显示全部楼层
NE5532 发表于 2013-9-26 16:58
楼主用编程器确认“写不进去”的时候是真的“写不进去”么?

恩,已经解决了。主要是电源不稳。再加上配置位设置问题,LVP没有禁掉
htx518 发表于 2013-10-23 11:26 | 显示全部楼层
请使用PICC里面的宏定义语句啊。读和写很方便的啊。变量=eeprom_read(地址);        //读EEPROM,eeprom_write(地址,数据);       //写EEPROM
htx518 发表于 2013-10-23 11:29 | 显示全部楼层
你自己写函数,还不如直接使用这两个来的方便。读:变量=eeprom_read(地址);      写:eeprom_write(地址,数据);
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

108

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部