изменение одного бита в байте EEPROM Arduino
В моем коде есть несколько логических флагов, которые сообщают мне, были ли данные записаны в определенные места EEPROM. Мне нужно сохранить эти флаги в EEPROM и восстановить их при перезагрузке.
Действителен ли следующий синтаксис для обновления одного бита в ячейке EEPROM?
EEPROM.update (0, EEPROM.read(0)| 0x20);
т.е. я читаю ячейку «0», помещаю «1» в бит 5 и затем обновляю ячейку; '0' EEPROM. Во время работы программы будет обновляться еще несколько элементов.
@BRUCE DURANT, 👍3
Обсуждение1 ответ
Да, ваш синтаксис действительно правильный. Оператор |
— это побитовый оператор ИЛИ в 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
- Побитовый оператор в вопросе кода Arduino
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Как читать и записывать EEPROM в ESP8266
- Какой реальный срок службы EEPROM?
- Как запомнить значения переменных после перезагрузки платы Arduino Uno R3
- Получить доступ к EEPROM ATtiny с помощью кода Arduino?
- Очистка EEPROM
- Как сохранить переменную с плавающей запятой в EEPROM
как часто?, @Juraj
возможно, вам лучше сначала собрать все изменения битов и обновить значение только один раз., @DataFiddler