搜索
bottom↓
回复: 4

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

[复制链接]

出0入0汤圆

发表于 2017-7-28 15:58:37 | 显示全部楼层 |阅读模式
有以下问题:1,cs为校验和,为何要加校验和     ;  
                  2,Read_EEPROM(sizeof(struct meter_para),&meter_para.meter_number[0],eepadd_meter_para);             数据长度,变量,地址,
                  3,unsigned char judg_eeprom_init(void)//eeprom  为何要加EEPROM判断,是用来判断 新的存储器,把出厂的数据写进去吗
  1. void energy_add(void)
  2. {
  3. unsigned char  temp_pulse,cs;

  4. temp_pulse=pulse_constant_01kwh;
  5. if(real_energy.pulse>=temp_pulse)
  6.   {
  7.    real_energy.pulse-=temp_pulse;
  8.    //real_energy.moto_flag=1;
  9.    //moto_time++;//
  10.    bcdadd(real_energy.energy,4);
  11.    kwh_flag++;
  12.    if(kwh_flag>=2)//0.1kwh back energy
  13.      {
  14.       down_save=0;
  15.       kwh_flag-=1;
  16.       cs=xaoyanghe_cs(real_energy.energy,5);
  17.       real_energy.cs=cs;
  18.       DI();
  19.       Write_EEPROM(sizeof(struct real_energy),&real_energy.energy[0],eepadd_real_energy);
  20.       Write_EEPROM(sizeof(struct real_energy),&real_energy.energy[0],eepadd_back_real_energy);
  21.       EI();
  22.      }
  23.    
  24.   }

  25. }
复制代码
  1. void eeprom(void)
  2. {
  3. unsigned char cali_data[3];
  4. unsigned buff,relay;
  5. if(judg_eeprom_init())
  6.    {
  7.    Read_EEPROM(sizeof(struct meter_para),&meter_para.meter_number[0],eepadd_meter_para);
  8.    Read_EEPROM(sizeof(struct real_energy),&real_energy.energy[0],eepadd_real_energy);
  9.    buff=xaoyanghe_cs(real_energy.energy,5);
  10.       if(buff!=real_energy.cs)
  11.         {
  12.          Read_EEPROM(sizeof(struct real_energy),&real_energy.energy[0],eepadd_back_real_energy);
  13.         }
  14.    }

  15. else
  16.      {
  17.     L_default();
  18.      }
  19. }

  20. unsigned char judg_eeprom_init(void)//eeprom
  21. {
  22. unsigned char temp;
  23. Read_EEPROM(1,&temp,eepadd_iniflag);
  24. if(temp==0xaa)
  25.    return 0xff;
  26. else
  27.   {
  28.   if(temp==0xaa)
  29.      return 0xff;
  30.    else
  31.      return 0x00;
  32.   }
  33. //if(real_energy.relay_flag)
  34.   //  {
  35.   //   CTR_ON=1;
  36.   //   CTR_OFF=0;
  37.   //  }
  38. // else
  39.    // {
  40.    // CTR_ON=0;
  41.    // CTR_OFF=1;  
  42.   //  }  
  43. }

  44. void L_default(void)
  45. {
  46. unsigned char i,buff=0;
  47. for(i=0;i<sizeof(meter_para.meter_number[6]);i++)
  48.     meter_para.meter_number[i]=0x00;//

  49. meter_para.prg_password[0]=prg_password0;//pro_password  
  50. meter_para.prg_password[1]=prg_password1;
  51. meter_para.prg_password[2]=prg_password2;
  52. meter_para.prg_password[3]=prg_password3;

  53. meter_para.pulse_constant[0]=pulse_constant_L;//晥泿翍魥厞B曽
  54. meter_para.pulse_constant[1]=pulse_constant_M;
  55. meter_para.pulse_constant[2]=pulse_constant_H;

  56. Write_EEPROM(sizeof(struct meter_para),&meter_para.meter_number[0],eepadd_meter_para);
  57. Read_EEPROM(sizeof(struct real_energy),&real_energy.energy[0],eepadd_real_energy);
  58. buff=xaoyanghe_cs(real_energy.energy,5);
  59.       if(buff!=real_energy.cs)//
  60.         {
  61.          Read_EEPROM(sizeof(struct real_energy),&real_energy.energy[0],eepadd_back_real_energy);
  62.          //buff=xaoyanghe_cs(real_energy.energy,5);
  63.         //if(buff!=real_energy.cs)//
  64.          // {
  65.           for(i=0;i<5;i++)
  66.              real_energy.energy[i]=0x00;//
  67.              real_energy.cs=0x00;
  68.              real_energy.moto_flag=0x00;
  69.              real_energy.relay_flag=0xaa;  //
  70.           //         }
  71.         }
  72.        real_energy.relay_flag=0xaa;
  73. Write_EEPROM(sizeof(struct real_energy),&real_energy.energy[0],eepadd_real_energy);
  74. Write_EEPROM(sizeof(struct real_energy),&real_energy.energy[0],eepadd_back_real_energy);
  75. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出10入61汤圆

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

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 2017-7-28 17:05:32 | 显示全部楼层
谁帮看看啊,解读下原理

出0入8汤圆

发表于 2017-7-28 17:35:15 | 显示全部楼层
本帖最后由 kebaojun305 于 2017-7-28 17:37 编辑
三国小兵 发表于 2017-7-28 16:28
eepadd_iniflag  请问这个是标志吗,是读存储器里的标志吗


明显是 eeprom 的初始化标志   上电的时候  读取这个标志位,如果不对,就用默认值初始化eeprom一次,如果标志位置位了,就读取eeprom参数。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-3 20:18

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

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