EEPROMAnything. Как записать в EEPROM дробное или длинное целое значение 2

Что же такое ?

EEPROM (Electrically Erasable Programmable Read-Only Memory) — электрически стираемое перепрограммируемое ПЗУ(ЭСППЗУ), один из видов энергонезависимой памяти. Wiki

Что же это означит, и для чего его использовать?

Предположим, Вам, нужно сохранить некоторое значение переменной в память так, чтобы после выключения/ включения контроллера это значение осталось. Именно для такой цели и используется EEPROM. Данные, записанные в EEPROM, не стираются после отключения питания от микроконтроллера.

В разных контроллерах — разный объем памяти EEPROM(сравнительная таблица контроллеров Atmel)

1 адрес в EEPROM = 1 байт

В стандартном наборе  имеется библиотека EEPROM

eeprom1.png Пример записи в EEPROM

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*
* EEPROM Write
*
* Stores values read from analog input 0 into the EEPROM.
* These values will stay in the EEPROM when the board is
* turned off and may be retrieved later by another sketch.
*/
 
#include
 
// the current address in the EEPROM (i.e. which byte
// we're going to write to next)
int addr = 0;
 
void setup()
{
}
 
void loop()
{
// need to divide by 4 because analog inputs range from
// 0 to 1023 and each byte of the EEPROM can only hold a
// value from 0 to 255.
int val = analogRead(0) / 4;
 
// write the value to the appropriate byte of the EEPROM.
// these values will remain there when the board is
// turned off.
EEPROM.write(addr, val);
 
// advance to the next address. there are 512 bytes in
// the EEPROM, so go back to 0 when we hit 512.
addr = addr + 1;
if (addr == 512)
addr = 0;
 
delay(100);
}
/*
* EEPROM Write
*
* Stores values read from analog input 0 into the EEPROM.
* These values will stay in the EEPROM when the board is
* turned off and may be retrieved later by another sketch.
*/

#include

// the current address in the EEPROM (i.e. which byte
// we're going to write to next)
int addr = 0;

void setup()
{
}

void loop()
{
// need to divide by 4 because analog inputs range from
// 0 to 1023 and each byte of the EEPROM can only hold a
// value from 0 to 255.
int val = analogRead(0) / 4;

// write the value to the appropriate byte of the EEPROM.
// these values will remain there when the board is
// turned off.
EEPROM.write(addr, val);

// advance to the next address. there are 512 bytes in
// the EEPROM, so go back to 0 when we hit 512.
addr = addr + 1;
if (addr == 512)
addr = 0;

delay(100);
}

Пример чтения из EEPROM

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/*
* EEPROM Read
*
* Reads the value of each byte of the EEPROM and prints it
* to the computer.
* This example code is in the public domain.
*/
 
#include
 
// start reading from the first byte (address 0) of the EEPROM
int address = 0;
byte value;
 
void setup()
{
// initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
}
 
void loop()
{
// read a byte from the current address of the EEPROM
value = EEPROM.read(address);
 
Serial.print(address);
Serial.print("t");
Serial.print(value, DEC);
Serial.println();
 
// advance to the next address of the EEPROM
address = address + 1;
 
// there are only 512 bytes of EEPROM, from 0 to 511, so if we're
// on address 512, wrap around to address 0
if (address == 512)
address = 0;
 
delay(500);
}
/*
* EEPROM Read
*
* Reads the value of each byte of the EEPROM and prints it
* to the computer.
* This example code is in the public domain.
*/

#include

// start reading from the first byte (address 0) of the EEPROM
int address = 0;
byte value;

void setup()
{
// initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
}

void loop()
{
// read a byte from the current address of the EEPROM
value = EEPROM.read(address);

Serial.print(address);
Serial.print("t");
Serial.print(value, DEC);
Serial.println();

// advance to the next address of the EEPROM
address = address + 1;

// there are only 512 bytes of EEPROM, from 0 to 511, so if we're
// on address 512, wrap around to address 0
if (address == 512)
address = 0;

delay(500);
}

Данная библиотека позволяет записать 1 байт(это 2^8=256 вариантов) данных в конкретный адрес.

Что это означает?

Рассмотрим несколько примеров:
1. Число 22. Число 22 меньше 255 , а значит это 1 байт данных

2. Число 2222. Число 2222 больше 255, а следовательно больше 1 байта(12 бит) и записать при помощи примера в 1 адрес уже не получится

3. Число 22.22. С этим числом еще сложнее, нужно делить на 2 части, целая и дробная, и записывать их в два адреса.

Чтобы упростить задачу записи таких чисел воспользуемся готовой библиотекой EEPROMAnything

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include
#include // for type definitions
 
template int EEPROM_writeAnything(int ee, const T& value)
{
const byte* p = (const byte*)(const void*)&value;
unsigned int i;
for (i = 0; i < sizeof(value); i++)
EEPROM.write(ee++, *p++);
return i;
}
 
template int EEPROM_readAnything(int ee, T& value)
{
byte* p = (byte*)(void*)&value;
unsigned int i;
for (i = 0; i < sizeof(value); i++)
*p++ = EEPROM.read(ee++);
return i;
}
#include
#include // for type definitions

template int EEPROM_writeAnything(int ee, const T& value)
{
const byte* p = (const byte*)(const void*)&value;
unsigned int i;
for (i = 0; i < sizeof(value); i++)
EEPROM.write(ee++, *p++);
return i;
}

template int EEPROM_readAnything(int ee, T& value)
{
byte* p = (byte*)(void*)&value;
unsigned int i;
for (i = 0; i < sizeof(value); i++)
*p++ = EEPROM.read(ee++);
return i;
}

Данная библиотека позволяет записывать в EEPROM разные типы данных. Для этого объявляется структура данных, которая может содержать переменные разного типа!

Пример чтения/записи в EEPROM с использованием EEPROM_readAnything

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include
#include ".h"
 
struct config_t//структура записываемых данных
{
long alarm;
int mode;
} configuration;
 
void setup()
{
EEPROM_readAnything(0, configuration);
// ...
}
void loop()
{
// let the user adjust their alarm settings
// let the user adjust their mode settings
// ...
 
// if they push the "Save" button, save their configuration
if (digitalRead(13) == HIGH)
EEPROM_writeAnything(0, configuration);
}
#include
#include "EEPROMAnything.h"

struct config_t//структура записываемых данных
{
long alarm;
int mode;
} configuration;

void setup()
{
EEPROM_readAnything(0, configuration);
// ...
}
void loop()
{
// let the user adjust their alarm settings
// let the user adjust their mode settings
// ...

// if they push the "Save" button, save their configuration
if (digitalRead(13) == HIGH)
EEPROM_writeAnything(0, configuration);
}

Загрузить библиотеку EEPROM_readAnything

2 комментс для “EEPROMAnything. Как записать в EEPROM дробное или длинное целое значение

  1. Ответить поправка Мар 10, 2016 09:14

    2. Число 2222. Число 2222 больше 255, а следовательно больше 1 байта(9 байт)
    2. Число 2222. Число 2222 больше 255, а следовательно больше 1 байта(9 БИТ)

Добавить комментарий