查看: 119|回复: 4

[其他] arduino nano内置eeprom寿命问题

[复制链接]
  • TA的每日心情
    无聊
    2020-1-18 12:13
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2020-7-28 16:19 | 显示全部楼层 |阅读模式
    一直以来,都是用nano做一些小东东近来想用到计数功能,那就要用到内置的eeprom
    但看到书上,网上说寿命只有10万次
    但我要计数的数值要以数百万计

    就要配合12864屏,写了一个程序
    读出数据,加1,再显示数据,最后写回去

    已经计数100多万了,还没出现数据错乱
    那就证明eeprom的读写寿命已到100多万,还是好的

    我的计数位是8位,可以达到1亿

    有没有人知道eeprom的读写寿命是到底是多少次???
  • TA的每日心情
    擦汗
    2019-7-29 00:08
  • 签到天数: 47 天

    [LV.5]常住居民I

    发表于 2020-7-28 16:57 | 显示全部楼层
    10万次是保证寿命,超过了类似于过保质期而已。

    另外这1亿的计数器(约么30位二进制),就算有一个位坏掉了,也有很大概率你是看不出的:
    a. 不同权重位的写入频次不一样(只有1->0才算一次),只有低字节磨损得快;
    b. 只要不是低字节的最低位损坏,每次加一都还是能动作的,所以说不易察觉。

    真正测试次数,应该不停的写随机数、互补数,然后每次都进行比对
  • TA的每日心情
    奋斗
    2020-7-28 17:05
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2020-7-28 17:06 | 显示全部楼层
    优化下程序,不要每次都读写。
  • TA的每日心情
    无聊
    2020-1-18 12:13
  • 签到天数: 2 天

    [LV.1]初来乍到

     楼主| 发表于 2020-7-28 17:42 | 显示全部楼层
    #include <EEPROM.h>
    #include <Arduino.h>
    #include "lcd12864_S.h"

    int eepadr=1000;//adr=1000
    int da01=0;
    int da23=0;
    int da45=0;
    int da67=0;


    int v0=0;
    int v1=0;
    int v2=0;
    int v3=0;
    int v4=0;
    int v5=0;
    int v6=0;
    int v7=0;
    int v8=0;
    int v9=0;
    long v10=0;

    int vt=0;
    long vbt=0;
    int ww1[4];
    int ww2[4];
    int ww3[4];
    int ww4[4];
    int ww5[4];
    //int vd=0;
    //int ve=0;
    //int vf=0;
    boolean out1=false;
    boolean out2=false;  //P2
    boolean out3=false;
    boolean out4=false;    //true
    boolean out5=false;
    boolean out6=false;
    boolean out7=false;
    boolean out8=false;
    boolean out0=false;
    //

    void setup()
    {

        Serial.begin(9600);
        LCD12864_Reset();                //初始化液晶
    //    pinMode(2,OUTPUT);
    //    pinMode(3,OUTPUT);
    //    pinMode(4,OUTPUT);
    //    pinMode(5,OUTPUT);
    //    pinMode(6,OUTPUT);//
        pinMode(7,OUTPUT);//红绿灯
        pinMode(8,OUTPUT);//
        pinMode(9,OUTPUT);//蜂鸣器
    /*
    EEPROM.write(eepadr, 0);
    EEPROM.write(eepadr+1, 0);
    EEPROM.write(eepadr+2, 0);
    EEPROM.write(eepadr+3, 0);
    EEPROM.write(0, 0);
    EEPROM.write(1, 0);
    EEPROM.write(2, 0);
    EEPROM.write(3, 0);
    EEPROM.write(5, 0);
    EEPROM.write(5, 0);
    */



    }
    void loop()
    {

      v0=EEPROM.read(0);
      v1=EEPROM.read(1);
      v2=EEPROM.read(2);
      v3=EEPROM.read(3);
      v4=EEPROM.read(4);
      v5=EEPROM.read(5);
      
      v9=v0+v1*10+v2*100+v3*1000+v4*10000+v5*100000;
      da01=EEPROM.read(eepadr);
      da23=EEPROM.read(eepadr+1);
      da45=EEPROM.read(eepadr+2);
      da67=EEPROM.read(eepadr+3);

    v10=da01+da23*100+da45*10000+da67*1000000;


    /*

    wwtt[0]=v7/1000+48;
    vt=v7%1000;
    wwtt[1]=vt/100+48;
    vt=vt%100;
    wwtt[2]=vt/10+48;
    vt=vt%10;
    wwtt[3]=vt+48;
                                     
    LCD12864_SET_Address(1,7);
    LCD12864_Data_Write(wwtt[0]);
    LCD12864_Data_Write(wwtt[1]);
    LCD12864_Data_Write(wwtt[2]);
    LCD12864_Data_Write(wwtt[3]);


    */

    v0=v0+1;
    if(v0==10)
    {
    v0=0;
    v1=v1+1;
    }
    if (v1==10)
    {
    v1=0;
    v2=v2+1;
    }

    if (v2==10)
    {
    v2=0;
    v3=v3+1;
    }
    if (v3==10)
    {
    v3=0;
    v4=v4+1;
    }
    if (v4==10)
    {
    v4=0;
    v5=v5+1;
    }
    if (v5==10)
    {
    v5=0;

    }


    EEPROM.write(0, v0);
    EEPROM.write(1, v1);
    EEPROM.write(2, v2);
    EEPROM.write(3, v3);
    EEPROM.write(4, v4);
    EEPROM.write(5, v5);

    LCD12864_SET_Address(4,6);
    LCD12864_Data_Write(v5+48);
    LCD12864_Data_Write(v4+48);
    LCD12864_Data_Write(v3+48);
    LCD12864_Data_Write(v2+48);
    LCD12864_Data_Write(v1+48);
    LCD12864_Data_Write(v0+48);

    da01=da01+1;

    if(da01==100)
    {
    da01=0;
    da23=da23+1;
    }

    if(da23==100)
    {
    da23=0;
    da45=da45+1;
    }

    if(da45==100)
    {
    da45=0;
    da67=da67+1;
    }

    if(da67==100)
    {
    da67=0;

    }
    EEPROM.write(eepadr, da01);
    EEPROM.write(eepadr+1, da23);
    EEPROM.write(eepadr+2, da45);
    EEPROM.write(eepadr+3, da67);

    LCD12864_SET_Address(3,5);
    LCD12864_Data_Write(da67/10+48);
    LCD12864_Data_Write(da67%10+48);
    LCD12864_Data_Write(da45/10+48);
    LCD12864_Data_Write(da45%10+48);
    LCD12864_Data_Write(da23/10+48);
    LCD12864_Data_Write(da23%10+48);
    LCD12864_Data_Write(da01/10+48);
    LCD12864_Data_Write(da01%10+48);


    delay(10);
    }
  • TA的每日心情
    无聊
    2020-1-18 12:13
  • 签到天数: 2 天

    [LV.1]初来乍到

     楼主| 发表于 2020-7-28 17:44 | 显示全部楼层
    本帖最后由 阳康小子 于 2020-7-28 17:53 编辑

    以上是代码,临时写的,不简捷,能运行就行,
    eeprom的0   1   2  3   4  5 B,分别是v9的个,十,百,千,万,十万位的数值

    eeprom的1000    1001   1002    1003 B,分别是v10的    个十位,百千位,万十万位,百万千万位
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    5分钟带你快速了解新一代开发板:M5STACK
    5分钟带你快速了解新一代
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    创客火首发无人机编队套装,开启不一样的人工智能教育
    创客火首发无人机编队套装
    2017年国务院发布《新一代人工智能发展规划》,提出要广泛开展人工智能科普活动,在中
    未见过的TFT屏,是什么驱动芯片?
    未见过的TFT屏,是什么驱
    这两块屏是从POS机里拆的,准备做几个锂电池组电压监测,在网上没找到资料,在这里问
    win10系统显示不出端口信息,编译后显示serial port not selected。
    win10系统显示不出端口信
    求各位哥哥帮忙,小兄弟实在不懂是win10系统的原因,还是需要安装什么驱动程式?具体
    更智能的电脑远程开关机-基于继电器
    更智能的电脑远程开关机-
    我只是刚刚入门的萌新,所以有不足请指出 先展示下 功能:开关机,开关机检测,
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表