Ви не увійшли.
Сторінки 1
Хочу запоминать состояние трех кнопок в eeprom. Но так как количество циклов перезаписи eeprom ограничено, хочу сдвигать байт в котором храниться инфа о кнопках. Одновременно может быть нажата только одна кнопка. Поэтому имеем всего три состояния.
Думаю, что нужно задействовать два байта.
1. Байт по адресу (cycle_count) счетчик со значениями 255-0
2. Байт состояния по адресу (button_state) со значениями 1,2,3 или 0,1,2 - не принципиально
Изначально байт счетчика находится по адресу EEPROM.length(), а байт состояния кнопок по адресу EEPROM.length()-1
В блоке setup() читаем состояние кнопок и делаем соответсвующие им действия
В loop() каждый раз при нажатии любой кнопки значение по адресу cycle_count уменьшается на единицу (от 255 до 0), а по адресу button_state записывается новое состояние кнопок
Как только по адресу cycle_count появляется ноль, значение из button_state переносится на адрес ниже, и адрес cycle_count тоже становиться ниже.
Ну и потом, когда таким образом во все ячейки eeprom запишутся нули, запускаю процедуру стирания (стирание eeprom = запись во все ячейки значения 255)
У меня возможно нубский вопрос. Что станет когда адрес дойдет до нуля? Как ардуинка отработает переполнение? Нужно ли предусмотреть какие то проверки для этого?
Дополнение.
Забыл сказать. Как ардуинке сказать по какому адресу искать состояние кнопок. Очень просто. Читаем ячейку EEPROM.length(), если там 0, переходим к EEPROM.length() - 1 и так далее, пока найдем не пустую ячейку с адресом допустим 200. Тогда ячейка с адресом 199 будет содержать состояние кнопок
Остання редакція luminofor (2021-01-26 11:58:59)
Неактивний
А зачем усложнять в 2 раза ?
Не проще ли искать нужный байт начиная сначала.
Допустим у тебя по умолчанию вся память 255. ищем байт сначала который не равен 255 и предшествует 255
В этом байте ты допустим хранишь 0bxxx...0yyy следующие биты
где
xxx.... -счетчик
yyy - состояние кнопок
Соответсвенно читаем состояние кнопок. из yyy. Если нужно записать увеличиваем счетчик xxxx+1 и пишем состояние кнопок. Переполнили счетчик, пишем в след. байт и т.п.
Если уж бороться с кол-вом записей. то она одна на изменение состояние (не надо писать адрес)
Ну и когда дошли до упора надо записать все 255. Хотя тоже можно обойтись и без этого. Надо искать последний байт (начиная с нулевого) у которого не переполнен счетчик xxx. и так по кругу...
Я как-то делал так:
В запись включается маркер. Когда вся память чистая (заполнена единицами), маркер имеет значение 0.
Первая свободная ячейка будет иметь маркер 1.
Когда вся память заполнится записями с нулевым маркером, начинаем заполнять её с самого начала записями с единичным маркером.
Какое значение маркера является активным узнаём из первой ячейки. Когда значения маркеров в первой и последней ячейках совпадают, пора менять активное значение.
Алгоритм успешно работает в пульте управления какой-то самолётной радиостанции. Точно не помню, но кажется Р-862
Остання редакція MikeM (2021-01-26 21:29:31)
Неактивний
Обычно состояние кнопок не запоминают, запоминают текущий режим выбранный этими кнопками. Запоминают также состояние переключателей. Если же нужна последовательность нажатий, например для снятия пароля, то это уже кнопочный (или клавиатурный) логгер. Ну а запись по кольцу или нет, выбирается исходя из требуемой задачи.
Неактивний
В принципе да. Имеется ввиду запомнить режим.
Делаю зарядное устройство с сенсорным дисплеем. Нужно управлять кнопками Заряд-Стоп-Разряд.
И когда питание пропадает, то Заряд или Разряд уже не восстанавливаются. То есть нужно как то хранить состояние.
Можно вообще не заморачиваться, тупо долбить в одну ячейку. 10000 циклов должно надолго хватить
YK1 предложил нормальную идею, я ее обдумал на предмет реализации.
Берем 7 и 6 биты под хранение состояния:
10 - Заряд
00 - Стоп
01 - Разряд
Остальные биты, с пятого 5 по 0, под счетчик. Получаем 64 цикла
Читаем ячейку eeprom, делаем логическое И с 0x00111111, получаем циклы, прибавляем единицу и в полученном числе выставляем биты 7 и 6, записываем обратно.
Счетчик досчитал до 64х - переходим в следующую ячейку.
Есть проблема первого включения, когда все ячейки по 255, но я где то встречал решение. Идея такая.
Стираем всю eeprom и делаем контрольную сумму всей области памяти, записываем на шпаргалку. В setup() проверяем контрольную сумму с шаблонной, если совпадают, то это первый запуск и нужно записать нули во все ячейки.
Как узнать в какой ячейке находится состояние - читаем все ячейки по маске 0x00111111, находим первое с числом меньше 64.
Примерно так. Осталось накодить
Остання редакція luminofor (2021-01-27 20:59:37)
Неактивний
Я как-то делал так:
В запись включается маркер. Когда вся память чистая (заполнена единицами), маркер имеет значение 0.
Первая свободная ячейка будет иметь маркер 1.
Когда вся память заполнится записями с нулевым маркером, начинаем заполнять её с самого начала записями с единичным маркером.
Какое значение маркера является активным узнаём из первой ячейки. Когда значения маркеров в первой и последней ячейках совпадают, пора менять активное значение.
Алгоритм успешно работает в пульте управления какой-то самолётной радиостанции. Точно не помню, но кажется Р-862
Тоже неплохо!
Неактивний
luminofor, вы из простого делаете сложное. Сохраняйте состояние отдельно, счётчик отдельно. Состояние, как и счётчик сохраняются только при изменении. Счётчик что считает, как часто изменяется?
Неактивний
luminofor, вы из простого делаете сложное. Сохраняйте состояние отдельно, счётчик отдельно. Состояние, как и счётчик сохраняются только при изменении. Счётчик что считает, как часто изменяется?
Счетчик считает, сколько раз я записал состояние сенсорных кнопок в ячейку.
Допустим состояние меняется примерно 10 раз в сутки. Что при ресурсе одной ячейки 10000 циклов дает 1000 циклов записи. Это почти три года безотказной работы, если писать все время в одну ячейку.
Насчет просто или сложно... Тут уже предложили два варианта, плюс мой первоначальный. Вопрос в квалификации программиста. Моя квалификация надеюсь хотя бы та троечку, так что буду выбирать из того, что смогу реализовать
Неактивний
Делаю зарядное устройство
Ну и в чем проблема запитать ардуинку (или что там у вас) от заряжаемого аккумулятора на время отключения питания и не искать себе приключений?
luminofor пише:Делаю зарядное устройство
Ну и в чем проблема запитать ардуинку (или что там у вас) от заряжаемого аккумулятора на время отключения питания и не искать себе приключений?
Не, ну тут вы не правы. Это вообще запутает схему дополнительными стабилизаторами и гальваническими развязками. Проще добавить пару строчек кода
Неактивний
А это на кой хрен, можно поинтересоваться?
Первый пост, первые два предложения
И вообще, уже не актуально. Накодил, проверил, работает!. Думаю при планируемом использовании, ячейки хватит лет на 20-30
Остання редакція luminofor (2021-01-28 14:46:47)
Неактивний
Пишите в память только тогда когда текущее состояние кнопки отличается от уже записанного. Чтение епрома то практически не органичено. По такой схеме вам 100к записей хватит лет на 100. Только от дребезга не забудьте избавится.
Неактивний
Сторінки 1