三国小兵 发表于 2017-7-28 15:58:37

单片机程序EEPROM不理解,请各位帮忙看下

有以下问题:1,cs为校验和,为何要加校验和   ;
                  2,Read_EEPROM(sizeof(struct meter_para),&meter_para.meter_number,eepadd_meter_para);             数据长度,变量,地址,
                  3,unsigned char judg_eeprom_init(void)//eeprom为何要加EEPROM判断,是用来判断 新的存储器,把出厂的数据写进去吗
void energy_add(void)
{
unsigned chartemp_pulse,cs;

temp_pulse=pulse_constant_01kwh;
if(real_energy.pulse>=temp_pulse)
{
   real_energy.pulse-=temp_pulse;
   //real_energy.moto_flag=1;
   //moto_time++;//
   bcdadd(real_energy.energy,4);
   kwh_flag++;
   if(kwh_flag>=2)//0.1kwh back energy
   {
      down_save=0;
      kwh_flag-=1;
      cs=xaoyanghe_cs(real_energy.energy,5);
      real_energy.cs=cs;
      DI();
      Write_EEPROM(sizeof(struct real_energy),&real_energy.energy,eepadd_real_energy);
      Write_EEPROM(sizeof(struct real_energy),&real_energy.energy,eepadd_back_real_energy);
      EI();
   }
   
}

}

void eeprom(void)
{
unsigned char cali_data;
unsigned buff,relay;
if(judg_eeprom_init())
   {
   Read_EEPROM(sizeof(struct meter_para),&meter_para.meter_number,eepadd_meter_para);
   Read_EEPROM(sizeof(struct real_energy),&real_energy.energy,eepadd_real_energy);
   buff=xaoyanghe_cs(real_energy.energy,5);
      if(buff!=real_energy.cs)
      {
         Read_EEPROM(sizeof(struct real_energy),&real_energy.energy,eepadd_back_real_energy);
      }
   }

else
   {
    L_default();
   }
}

unsigned char judg_eeprom_init(void)//eeprom
{
unsigned char temp;
Read_EEPROM(1,&temp,eepadd_iniflag);
if(temp==0xaa)
   return 0xff;
else
{
if(temp==0xaa)
   return 0xff;
   else
   return 0x00;
}
//if(real_energy.relay_flag)
//{
//   CTR_ON=1;
//   CTR_OFF=0;
//}
// else
   // {
   // CTR_ON=0;
   // CTR_OFF=1;
//}
}

void L_default(void)
{
unsigned char i,buff=0;
for(i=0;i<sizeof(meter_para.meter_number);i++)
    meter_para.meter_number=0x00;//

meter_para.prg_password=prg_password0;//pro_password
meter_para.prg_password=prg_password1;
meter_para.prg_password=prg_password2;
meter_para.prg_password=prg_password3;

meter_para.pulse_constant=pulse_constant_L;//晥泿翍魥厞B曽
meter_para.pulse_constant=pulse_constant_M;
meter_para.pulse_constant=pulse_constant_H;

Write_EEPROM(sizeof(struct meter_para),&meter_para.meter_number,eepadd_meter_para);
Read_EEPROM(sizeof(struct real_energy),&real_energy.energy,eepadd_real_energy);
buff=xaoyanghe_cs(real_energy.energy,5);
      if(buff!=real_energy.cs)//
      {
         Read_EEPROM(sizeof(struct real_energy),&real_energy.energy,eepadd_back_real_energy);
         //buff=xaoyanghe_cs(real_energy.energy,5);
      //if(buff!=real_energy.cs)//
         // {
          for(i=0;i<5;i++)
             real_energy.energy=0x00;//
             real_energy.cs=0x00;
             real_energy.moto_flag=0x00;
             real_energy.relay_flag=0xaa;//
          //       }
      }
       real_energy.relay_flag=0xaa;
Write_EEPROM(sizeof(struct real_energy),&real_energy.energy,eepadd_real_energy);
Write_EEPROM(sizeof(struct real_energy),&real_energy.energy,eepadd_back_real_energy);
}

tcm123 发表于 2017-7-28 16:05:11

加个标志表明保存过参数,没标志就用默认参数或提示出错。 加校验和是为了保证数据正确性,防止有些字节意外出错了

三国小兵 发表于 2017-7-28 16:28:22

tcm123 发表于 2017-7-28 16:05
加个标志表明保存过参数,没标志就用默认参数或提示出错。 加校验和是为了保证数据正确性,防止有些字节意 ...

eepadd_iniflag请问这个是标志吗,是读存储器里的标志吗

三国小兵 发表于 2017-7-28 17:05:32

谁帮看看啊,解读下原理

kebaojun305 发表于 2017-7-28 17:35:15

本帖最后由 kebaojun305 于 2017-7-28 17:37 编辑

三国小兵 发表于 2017-7-28 16:28
eepadd_iniflag请问这个是标志吗,是读存储器里的标志吗

明显是 eeprom 的初始化标志   上电的时候读取这个标志位,如果不对,就用默认值初始化eeprom一次,如果标志位置位了,就读取eeprom参数。
页: [1]
查看完整版本: 单片机程序EEPROM不理解,请各位帮忙看下