изменение одного бита в байте EEPROM Arduino

В моем коде есть несколько логических флагов, которые сообщают мне, были ли данные записаны в определенные места EEPROM. Мне нужно сохранить эти флаги в EEPROM и восстановить их при перезагрузке.

Действителен ли следующий синтаксис для обновления одного бита в ячейке EEPROM?

EEPROM.update (0, EEPROM.read(0)| 0x20);

т.е. я читаю ячейку «0», помещаю «1» в бит 5 и затем обновляю ячейку; '0' EEPROM. Во время работы программы будет обновляться еще несколько элементов.

, 👍3

Обсуждение

как часто?, @Juraj

возможно, вам лучше сначала собрать все изменения битов и обновить значение только один раз., @DataFiddler


1 ответ


2

Да, ваш синтаксис действительно правильный. Оператор | — это побитовый оператор ИЛИ в C и C++, который используется для установки определенного бита в байте. Вот разбивка того, что делает ваша строка кода:

  • EEPROM.read(0) считывает текущее значение первого байта в EEPROM.
  • 0x20 — это шестнадцатеричное представление числа 32, что в двоичном формате равно 00100000. Это означает, что пятый бит (считая с нуля) установлен в 1, а все остальные биты установлены в 0.
  • EEPROM.read(0) | 0x20 выполняет побитовую операцию ИЛИ над текущим значением первого байта в EEPROM и 0x20. Это установит пятый бит байта в 1, а остальные биты останутся неизменными.
  • EEPROM.update(0, EEPROM.read(0) | 0x20) обновляет первый байт в EEPROM новым значением.

Итак, ваш подход к установке определенного бита в байте EEPROM верен.

Вот более подробный пример:

byte bitToSet = 5; // Номер бита для установки (0-7)
byte eepromAddress = 0; // Адрес EEPROM (0-1023 для ATmega328)

// Читаем текущее значение
byte currentValue = EEPROM.read(eepromAddress);

// Создаём маску для устанавливаемого бита
byte mask = 1 << bitToSet;

// Обновить значение
byte newValue = currentValue | mask;

// Записываем обновленное значение обратно в EEPROM
EEPROM.update(eepromAddress, newValue);

Стоит отметить, что функция EEPROM.update() достаточно умна, чтобы выполнять запись только в том случае, если новое значение отличается от старого. Это важно, поскольку EEPROM имеет ограниченное количество циклов записи. Таким образом, использование EEPROM.update() вместо EEPROM.write() может помочь продлить срок службы EEPROM.

,

Примечание: незапрограммированные значения eeprom/flash равны 0xFF, поэтому, если вы оставите их незапрограммированными, они могут работать не так, как задумано., @KIIV