成为订阅者(免费)

加入29,000名其他订阅者以获得用户销售折扣和 其他免费资源。
:
:
大学教师'担心 - 您的邮件地址完全是 安全的。我保证使用它 只要 to send you MicroZine.

arduino. EEPROM.

arduino. EEPROM.(电擦除可编程阅读 只有内存)是一个高耐久的闪存块。它致力于 在会话之间保存数据(关闭电源和电源 microcontroller).


在这个页面上,你可以了解如何保护EEPROM的生活 以及显示如何保存和恢复多个数据元素的草图。

有两个可重写的记忆,比较他们的可靠记忆 能力。微控制器的闪存区域(存储器 你的计划)能够存在 重新编写(当您向Arduino下载新程序时!)。这个 但是,内存具有较低的重写能力:

  Device 内存类型 尺寸 重写
  Atmega328p(Arduino Uno) 闪光 32kB>10,000
  Atmega328p(Arduino Uno) EEPROM. 1kB >100,000

闪存寿命

有用的事情,是看多久 如果您每天10次写入普通闪存将持续。事实证明它将持续至少 10000.0 / 10.0 = 1000天或2.7岁)。当然你赢了't update a 节目每天,您将使用一个新设备进行新项目,所以它 将持续长时间比这更长。

EEPROM. 寿命

每天使用EEPROM 10次EEPROM Life将是100000/10#10000天或27岁!

在现实中,EEPROM与闪存不同,因为EEPROM是 专为更新数据而设计。程序本身将更新EEPROM以保存所需的参数 在上电和断电之间。您可以存储任何数据。校准 参数或当前仪器设置。

如何保护EEPROM

我曾经在一家设法随机失败的公司。

EEPROM. 正在持续编写 随着参数的变化,将数据保存的相同位置。这 问题是每次都始终写入节目循环,所以即使是巨大的 EEPROM的一生都写得那么多,即EEPROM磨掉了。

他们选择的解决方案是在后面移动开始写入地址 每块数据都是写的,使得EEPROM的相同区域不是 连续使用;延长了EEPROM的生活。

更好的方法是确保你只写到EEPROM 定义的时间。例如,如果用户开始校准序列 - 只在结束后才能写一次。或者,更新欠压检测或关闭启动的参数。

从未在A for循环中写入EEPROM存储器中的相同地址!

注意:从EEPROM读取不会降低内存。您可以根据需要多次读取EEPROM地址。

提示: 为了扩展EEPROM生命,首先阅读要写入的内容 - 如果 它与您想要写的价值相同,然后唐't write to it!

提示: 每次写一组数据时,都会重新阅读以确保它 写得正确。如果它失败,则重试。如果有多个 然后失败然后生成一个错误,屏幕或点亮消息 red LED.

写入一个字节需要3.3ms [源Arduino文档] - 但似乎更快(请参阅下面的程序输出)。

arduino. EEPROM.功能

EEPROM. 读写字节

EEPROM. 事务的基本单元是一个字节。要读取和编写这些字节,可以使用以下功能:

     EEPROM. .write(address, byteValue);
     EEPROM. .read(address);         // returns a byte.

EEPROM. 写一个改变的字节

     EEPROM. .update(address, bytevalue);

如果当前则此功能仅执行写入操作 值与bytevalue不同。所以它拯救你 如果您尝试将相同的字节写入EEPROM,请佩戴EEPROM。

真的,这是你应该用来保存EEPROM的功能 记忆。唯一的原因是不这样​​做的,就是它必须执行阅读 首先,它比EEPROM.WRITE操作慢。

EEPROM. 写标准类型或结构

这是单字写字节,但在那里'一个更容易写一组的方式 数据到EEPROM和使用PUT功能(GET是 相当于检索)。

PUT功能使用UPDATE功能写出一组字节。 此外,它测量用于写入的数据类型的大小 出于正确的字节数。

您可以使用此功能来写出char,int,long或float 键入对象而不知道类型对象使用的字节数。 因此,此功能跨不同的编译器(使用 不同类型尺寸)。

关于这个函数的真正有用的点是它也可以写 出版你自己的定义类型。如果您创建结构类型(具有批次 如果内部的变量,那么它将写入此类型的变量 EEPROM没有您必须知道类型的字节数 occupies.

如果将数据捆绑到结构中,则of ofthothot是,那么它很容易放置并从EEPROM中放置和获取它。

     EEPROM. .put(address,data);
     EEPROM. .get(address,data);

多变量EEPROM读/写

以前的成员函数对于编写单个字节或 单个结构对象(EEPROM),但通常想要切换 between sets of 数据(或存储不仅仅是单个变量)。

这对您尝试不同选项的系统特别有用 (and you don'每次都要重新编译几次来改变一些 控制参数!)。

您只想从一组以前保存的数据中进行选择。

单型方法速写1

这里的想法是在特定EEPROM地址中在EEPROM中顺序地存储一组简单类型的变量。

只需安装连接到地面和销5的按钮 arduino。在启动时,从EEPROM检索EEPROM值 发送到串行监视器。

按下按钮随机值将保存到EEPROM。到 检索值只需按Arduino上的重置按钮和 显示这些相同的数字(已从EEPROM读取)。

当您按下按钮时,您也可以看到写执行时间。

// Storing variables in EEPROM
// Sequential read / write of variables.
#include <EEPROM.h>

#define BUTTON_TEST 5
#define EEADDR 166 // Start location to write EEPROM data.

static unsigned  在 t minx,maxx,miny,maxy;

void show_vars(void) {
   Serial.print("MIN x "); Serial.println(minx);
   Serial.print("MAX x "); Serial.println(maxx);
   Serial.print("MIN y "); Serial.println(miny);
   Serial.print("MAX y "); Serial.println(maxy);
}

void setup() {

   pinMode(BUTTON_TEST,INPUT_PULLUP);
   pinMode(LED_BUILTIN,OUTPUT);
   digitalWrite(LED_BUILTIN,LOW);

   Serial.begin(115200);

   Serial.println("EEPROM variable read and write.");

   // Read EEPROM
    在 t EEAddr = EEADDR;
    EEPROM. .get(EEAddr,minx); EEAddr +=sizeof(minx);
    EEPROM. .get(EEAddr,maxx); EEAddr +=sizeof(maxx);
    EEPROM. .get(EEAddr,miny); EEAddr +=sizeof(miny);
    EEPROM. .get(EEAddr,maxy); EEAddr +=sizeof(maxy);

   show_vars();
}

void loop() {
     static unsigned long timeWas, timeNow;

      在 t r = random(100, 65535);
     minx = r;
     maxx = r+1;
     miny = r+2;
     maxy = r+3;

     Serial.println("Press button to write to EEPROM");

     if (digitalRead(BUTTON_TEST)==0) {
        digitalWrite(LED_BUILTIN,HIGH);

         在 t EEAddr = EEADDR;
        timeWas = micros();
         EEPROM. .put(EEAddr,minx); EEAddr +=sizeof(minx);
         EEPROM. .put(EEAddr,maxx); EEAddr +=sizeof(maxx);
         EEPROM. .put(EEAddr,miny); EEAddr +=sizeof(miny);
         EEPROM. .put(EEAddr,maxy); EEAddr +=sizeof(maxy);
        timeNow = micros();

        Serial.println("EEPROM Written");
        show_vars();

        Serial.print("EEPROM Write time  (us) ");
        Serial.println(timeNow-timeWas);
        Serial.print("EEPROM Write time per byte (us) ");
        Serial.println((timeNow-timeWas)/(4*sizeof(minx))); // same type.

        delay (500);
        digitalWrite(LED_BUILTIN,LOW);
     }
     delay(500);
}
[eeprom1.ino]


这里'串行监视器的输出示例:

Press button to write to EEPROM
EEPROM Written
MIN x 58478
MAX x 58479
MIN y 58480
MAX y 58481
EEPROM Write time  (us) 23300
EEPROM Write time per byte (us) 2912
Press button to write to EEPROM
Press button to write to EEPROM
Press button to write to EEPROM
Press button to write to EEPROM
EEPROM variable read and write.
MIN x 58478
MAX x 58479
MIN y 58480
MAX y 58481
Press button to write to EEPROM

较低的文本开始'MIN X'击中后的读回输出 重置按钮。第一个是'write action' after hitting the push button.

struct类型方法sketch2

这里的想法是使用结构来存储特定EEPROM地址的数据。

使用struct对象允许您将变量组合在一起并使用 EEPROM.put()并获取()访问EEPROM。这些功能使其成为 微不足道地存储和从EEPROM存储和检索结构数据。

以下程序与上述程序非常相似,但使用结构 变量而不是许多不同的。请注意如何使用 由于指针用于程序的多个结构变量 显示结构变量的内容'StoreData'.

// Storing struct variables in EEPROM
// Sequential read / write of variables.
#include <EEPROM.h>

#define BUTTON_TEST 5
#define EEADDR 166 // Start location to write EEPROM data.

// Put variables into structure.
struct 存储数据_s {
   float kp;       // kp, ki and kd store normalised values to 1000ms
   float ki;       // They are recalculated in the PID algorithm
   float kd;       // proportional to the sample time.
    在 t dt;         // SampleTime
    在 t limitR;     // limit roll
    在 t limitP;     // limit pitch
};

存储数据_s 存储数据 = {1,0.1,0,1000,30,60};

void show_vars(存储数据_s *p) {
   Serial.print("Kp "); Serial.println(p->kp);
   Serial.print("Ki "); Serial.println(p->ki);
   Serial.print("Kd "); Serial.println(p->kd);
   Serial.print("dt "); Serial.println(p->dt);
   Serial.print("LR "); Serial.println(p->limitR);
   Serial.print("LP "); Serial.println(p->limitP);
}

void setup() {

   pinMode(BUTTON_TEST,INPUT_PULLUP);
   pinMode(LED_BUILTIN,OUTPUT);
   digitalWrite(LED_BUILTIN,LOW);

   Serial.begin(115200);

   Serial.println("EEPROM struct read and write.");

   // Read EEPROM
    EEPROM. .get(EEADDR, 存储数据);
   show_vars(&存储数据);
}

void loop() {
     static unsigned long timeWas, timeNow;

      在 t r = random(100, 65535);
     存储数据.kp = r++;
     存储数据.ki  = r++;
     存储数据.kd  = r++;
     存储数据.dt  = r++;
     存储数据.limitR  = r++;
     存储数据.limitP  = r++;

     Serial.println("Press button to write struct to EEPROM");

     if (digitalRead(BUTTON_TEST)==0) {
        digitalWrite(LED_BUILTIN,HIGH);

        timeWas = micros();
         EEPROM. .put(EEADDR,存储数据);
        timeNow = micros();

        Serial.println("EEPROM Written");
        show_vars(&存储数据);

        Serial.print("EEPROM Write time  (us) ");
        Serial.println(timeNow-timeWas);
        Serial.print("EEPROM Write time per byte (us) ");
        Serial.println( (timeNow-timeWas)/(sizeof(存储数据)) );

        delay (500);
        digitalWrite(LED_BUILTIN,LOW);
     }
     delay(500);
}

[eeprom2.ino]

这里 an example of the output from the serial monitor:

Press button to write struct to EEPROM
EEPROM Written
Kp -4639.00
Ki -4638.00
Kd -4637.00
dt -4636
LR -4635
LP -4634
EEPROM Write time  (us) 46596
EEPROM Write time per byte (us) 2588
Press button to write struct to EEPROM
Press button to write struct to EEPROM
Press button to write struct to EEPROM
Press button to write struct to EEPROM
Press button to write struct to EEPROM
Press button to write struct to EEPROM
Press button to write struct to EEPROM
EEPROM struct read and write.
Kp -4639.00
Ki -4638.00
Kd -4637.00
dt -4636
LR -4635
LP -4634
Press button to write struct to EEPROM
在按下按钮后显示顶部数据,而在Arduino按重置后显示较低数据。

笔记: 如果在中检测到相同的数据,写入时间会有所不同 EEPROM。为了准确定时使用写入功能(您会写下您的 自己的put()的自己版本,但不执行读数)。

经常问的问题

如何重置EEPROM。

使用芯片擦除功能可以在编程期间擦除EEPROM。

由于它存储了无论如何,EEPROM并不真正需要重置 被编程到它中(没有EEPROM重置操作)。你是 可能想要初始化它。

一种方法是在正常程序期间对EEPROM进行写入 操作 - 或使用按钮输入表示重写(如上所述) 程序 - 但选择另一个按钮)。

或者,创建单独的草图和循环0至999,将每个字节写入0xFF。

笔记: EEPROM的删除状态为0xFF。

如何清除Arduino EEPROM。

您必须按照上面写入它或使用芯片擦除功能(串行编程期间)。

如何删除Arduino EEPROM。

与上述相同。

arduino. EEPROM. VS PROGMEM

如前所述,闪存(PROGMEM)具有较低的寿命 比EEPROM。因此,EEPROM对于应存储之间的数据非常有用 会话(或记录数据记录应用程序)。

arduino. EEPROM. vs Flash

与上述相同。

arduino. EEPROM. VS SD卡。

EEPROM. 的优点是它快速。
EEPROM. 的缺点是它很小(1k字节)

SD卡的优势在于它是巨大的(GIGA字节)。
SD卡的缺点是它很慢。
SD卡接口的缺点是它需要一个RAM缓冲器(可能是约512字节的SRAM的2个)。

SD卡需要时间写入 - 因此需要双缓冲区。写入另一个缓冲区。

EEPROM. 成员函数的比较

arduino. EEPROM.将VS更新

    更新()在单个字节上运行。
        它读取,然后仅在字节不同时写入地址。
        这是Putte()使用的字节原始函数。

    put()从地址开始写多个字节。
        写入的字节数是类型的大小。
        put()使用更新函数
            (如果它已更改为保护内存,则只会覆盖数据。

arduino. EEPROM.更新VS WRITE

   更新()在单个字节上运行。
        它读取,然后仅在字节不同时写入地址。
        这是Putte()使用的字节原始函数。      

    write()在单个字节上运行。
        它将单个字节写入地址。 

arduino. EEPROM.获得VS读取

   read()在单个字节上运行。
        它从地址读取一个字节。        

    get()从地址读取多个字节。
        读取的字节数是类型的大小。

arduino. EEPROM.写VS PUT   

    write()在单个字节上运行。
        它将单个字节写入地址。

    put()从地址开始写多个字节。
        写入的字节数是类型的大小。
        put()使用更新函数
            (如果它已更改为保护内存,则只会覆盖数据。


新的! Comments

让你说到你刚刚阅读的东西!留下下面的框中的评论。




隐私政策 | 接触 | 关于我

网站地图 | 使用条款


 ezoic. 报告此广告

访问我们的Facebook页面:

    点击这里



最近的文章

  1. 如何使用ADS1115

    使用ADS1115精度16位ADC进行教程进行低功耗。

    阅读更多

  2. arduino. 模拟输出...易模拟输出生成

    arduino. 模拟输出:如何创建最精确的PWM模拟输出以及如何创建模拟PWM正弦波。

    阅读更多

  3. 数号 和等效的快速宏。加快代码!

    了解DigitalWrite()的工作原理......现在使用17倍宏宏!

    阅读更多

  4. TCS230颜色传感芯片:如何运作以及如何使用它。

    如何使用TCS230(/ TCS3200)彩色检测器芯片并轻松将其添加到您的任何项目中。

    阅读更多

  5. 如何使用ADXL345进行运动感测等。

    使用ADXL345 Acellerometer,您可以检测到16G!您还可以了解如何使用它来点击检测等。

    阅读更多

  6. HMC5883L 3轴数字MAGENTOMTER如何运作

    HMC5883L - 如何制作数字罗盘,了解HMC5883L和QMC5883L之间的差异以及它们是否兼容。

    阅读更多



读者 Comments

"I wanted to thank
你这么好
对于所有信息
你已经提供了
你的网站 's

高超 极好的 ."

- 逃亡Potthath.

"This site really is
最好的和我最喜欢的。
我发现这里有很多很有用
项目和提示。"

- 米兰

Bursach.<at>gmail.com<

"Awesome site,
非常,非常容易和好
导航!"


-
Matt_tr. <at>
wolf359.cjb.net.


学习微控制器

"Interested in
微控制器?"

注册
免费7天指南:

自由 GUIDE : CLICK HERE


"I am a newbie to PIC
我想说
 how great your
网站一直在为我。"


- 戴夫

de_scott.<at>bellsouth.net

"Your site is a great
和完美的工作。
恭喜。"


- SURESH.

IntegratedInfosys.<at>
Yahoo.com.

"I couldn't find the correct
要定义的词语
你的网页。

非常有用,揭开,
诚实明确。

非常感谢
你的时间和作品。
问候。 "


- Anon.

回到顶部