打印

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

[复制链接]
5344|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在写完之后最好还是延时一点时间比较可靠。

使用特权

评论回复
5
pofu007| | 2013-9-26 15:46 | 只看该作者
eeprom_read()和eeprom_write()不用自己写吧,PIC16我都是直接调用的,楼主可以试试。

使用特权

评论回复
6
弓长月月鸟| | 2013-9-26 15:53 | 只看该作者
我也是直接调用的。看看指令之间的时间是否可靠。

使用特权

评论回复
7
shuidi_wangdan| | 2013-9-26 16:11 | 只看该作者
绝对是时序的问题!

使用特权

评论回复
8
NE5532| | 2013-9-26 16:58 | 只看该作者
楼主用编程器确认“写不进去”的时候是真的“写不进去”么?

使用特权

评论回复
9
快乐小电虫| | 2013-9-26 17:27 | 只看该作者
哈哈

使用特权

评论回复
10
opal11| | 2013-9-26 21:34 | 只看该作者
时序问题

使用特权

评论回复
11
q3742829| | 2013-9-27 10:01 | 只看该作者
学学

使用特权

评论回复
12
miaohuafeng8|  楼主 | 2013-10-8 17:11 | 只看该作者
NE5532 发表于 2013-9-26 16:58
楼主用编程器确认“写不进去”的时候是真的“写不进去”么?

恩,已经解决了。主要是电源不稳。再加上配置位设置问题,LVP没有禁掉

使用特权

评论回复
13
htx518| | 2013-10-23 11:26 | 只看该作者
请使用PICC里面的宏定义语句啊。读和写很方便的啊。变量=eeprom_read(地址);        //读EEPROM,eeprom_write(地址,数据);       //写EEPROM

使用特权

评论回复
14
htx518| | 2013-10-23 11:29 | 只看该作者
你自己写函数,还不如直接使用这两个来的方便。读:变量=eeprom_read(地址);      写:eeprom_write(地址,数据);

使用特权

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

本版积分规则

28

主题

108

帖子

0

粉丝