#1 2021-01-26 11:26:47

luminofor
Учасник
Зареєстрований: 2020-01-28
Повідомлень: 52

Запомнить состояние кнопок

Хочу запоминать состояние трех кнопок в 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 2021-01-26 13:16:04

YK1
Гість

Re: Запомнить состояние кнопок

А зачем усложнять в 2 раза ?
Не проще ли искать нужный байт начиная сначала.
Допустим у тебя по умолчанию вся память 255.  ищем байт сначала который не равен 255 и предшествует 255

В этом байте ты допустим хранишь 0bxxx...0yyy следующие биты
где
xxx....  -счетчик
yyy      - состояние кнопок

Соответсвенно читаем состояние кнопок. из yyy. Если нужно записать увеличиваем счетчик xxxx+1 и пишем состояние кнопок. Переполнили счетчик, пишем в след. байт и т.п.
Если уж бороться с кол-вом записей. то она одна на изменение состояние (не надо писать адрес)
Ну и когда дошли до упора надо записать все 255. Хотя тоже можно обойтись и без этого. Надо искать последний байт (начиная с нулевого) у которого не переполнен счетчик xxx. и так по кругу...

#3 2021-01-26 16:14:42

luminofor
Учасник
Зареєстрований: 2020-01-28
Повідомлень: 52

Re: Запомнить состояние кнопок

А что, хорошая мысль. Спасибо за идею!

Неактивний

#4 2021-01-26 21:25:54

MikeM
Учасник
З Киев
Зареєстрований: 2017-11-03
Повідомлень: 160

Re: Запомнить состояние кнопок

Я как-то делал так:
В запись включается маркер. Когда вся память чистая (заполнена единицами), маркер имеет значение 0.
Первая свободная ячейка будет иметь маркер 1.
Когда вся память заполнится записями с нулевым маркером, начинаем заполнять её с самого начала записями с единичным маркером.
Какое значение маркера является активным узнаём из первой ячейки. Когда значения маркеров в первой и последней ячейках совпадают, пора менять активное значение.
Алгоритм успешно работает в пульте управления какой-то самолётной радиостанции. Точно не помню, но кажется Р-862

Остання редакція MikeM (2021-01-26 21:29:31)

Неактивний

#5 2021-01-27 16:50:05

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: Запомнить состояние кнопок

Обычно состояние кнопок не запоминают, запоминают текущий режим выбранный этими кнопками. Запоминают также состояние переключателей. Если же нужна последовательность нажатий, например для снятия пароля, то это уже кнопочный (или клавиатурный) логгер. Ну а запись по кольцу или нет, выбирается исходя из требуемой задачи.

Неактивний

#6 2021-01-27 20:27:57

luminofor
Учасник
Зареєстрований: 2020-01-28
Повідомлень: 52

Re: Запомнить состояние кнопок

В принципе да. Имеется ввиду запомнить режим.
Делаю зарядное устройство с сенсорным дисплеем. Нужно управлять кнопками Заряд-Стоп-Разряд.
И когда питание пропадает, то Заряд или Разряд уже не восстанавливаются. То есть нужно как то хранить состояние.
Можно вообще не заморачиваться, тупо долбить в одну ячейку. 10000 циклов должно надолго хватить lol
YK1 предложил нормальную идею, я ее обдумал на предмет реализации.
Берем 7 и 6 биты под хранение состояния:
10 - Заряд
00 - Стоп
01 - Разряд
Остальные биты, с пятого 5 по 0,  под счетчик. Получаем 64 цикла
Читаем ячейку eeprom, делаем логическое И с 0x00111111, получаем циклы, прибавляем единицу и в полученном числе выставляем биты 7 и 6, записываем обратно.
Счетчик досчитал до 64х - переходим в следующую ячейку.
Есть проблема первого включения, когда все ячейки по 255, но я где то встречал решение. Идея такая.
Стираем всю eeprom и делаем контрольную сумму всей области памяти, записываем на шпаргалку. В setup() проверяем контрольную сумму с шаблонной, если совпадают, то это первый запуск и нужно записать нули во все ячейки.
Как узнать в какой ячейке находится состояние - читаем все ячейки по маске 0x00111111, находим первое с числом меньше 64.
Примерно так. Осталось накодить smile

Остання редакція luminofor (2021-01-27 20:59:37)

Неактивний

#7 2021-01-27 20:29:25

luminofor
Учасник
Зареєстрований: 2020-01-28
Повідомлень: 52

Re: Запомнить состояние кнопок

MikeM пише:

Я как-то делал так:
В запись включается маркер. Когда вся память чистая (заполнена единицами), маркер имеет значение 0.
Первая свободная ячейка будет иметь маркер 1.
Когда вся память заполнится записями с нулевым маркером, начинаем заполнять её с самого начала записями с единичным маркером.
Какое значение маркера является активным узнаём из первой ячейки. Когда значения маркеров в первой и последней ячейках совпадают, пора менять активное значение.
Алгоритм успешно работает в пульте управления какой-то самолётной радиостанции. Точно не помню, но кажется Р-862

Тоже неплохо!

Неактивний

#8 2021-01-28 09:19:32

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: Запомнить состояние кнопок

luminofor, вы из простого делаете сложное. Сохраняйте состояние отдельно, счётчик отдельно. Состояние, как и счётчик сохраняются только при изменении. Счётчик что считает, как часто изменяется?

Неактивний

#9 2021-01-28 09:55:41

luminofor
Учасник
Зареєстрований: 2020-01-28
Повідомлень: 52

Re: Запомнить состояние кнопок

Green пише:

luminofor, вы из простого делаете сложное. Сохраняйте состояние отдельно, счётчик отдельно. Состояние, как и счётчик сохраняются только при изменении. Счётчик что считает, как часто изменяется?

Счетчик считает, сколько раз я записал состояние сенсорных кнопок в ячейку.
Допустим состояние меняется примерно 10 раз в сутки. Что при ресурсе одной ячейки 10000 циклов дает 1000 циклов записи. Это почти три года безотказной работы, если писать все время в одну ячейку.

Насчет просто или сложно... Тут уже предложили два варианта, плюс мой первоначальный. Вопрос в квалификации программиста. Моя квалификация надеюсь хотя бы та троечку, так что буду выбирать из того, что смогу реализовать

Неактивний

#10 2021-01-28 10:20:57

г0сть
Гість

Re: Запомнить состояние кнопок

luminofor пише:

Делаю зарядное устройство

Ну и в чем проблема запитать ардуинку (или что там у вас) от заряжаемого аккумулятора на время отключения питания и не искать себе приключений?

#11 2021-01-28 10:21:04

luminofor
Учасник
Зареєстрований: 2020-01-28
Повідомлень: 52

Re: Запомнить состояние кнопок

Блиин!!! Господа, я жестоко ошибался! Еще раз посмотрел даташит. Это флеш имеет 10000 циклов перезаписи, а eeprom 100000!
Так что буду писать в одну ячейку и не выносить мозг!
lol

Неактивний

#12 2021-01-28 10:29:51

luminofor
Учасник
Зареєстрований: 2020-01-28
Повідомлень: 52

Re: Запомнить состояние кнопок

г0сть пише:
luminofor пише:

Делаю зарядное устройство

Ну и в чем проблема запитать ардуинку (или что там у вас) от заряжаемого аккумулятора на время отключения питания и не искать себе приключений?

Не, ну тут вы не правы. Это вообще запутает схему дополнительными стабилизаторами и гальваническими развязками. Проще добавить пару строчек кода

Неактивний

#13 2021-01-28 11:21:58

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: Запомнить состояние кнопок

luminofor пише:

Счетчик считает, сколько раз я записал состояние сенсорных кнопок в ячейку.

А это на кой хрен, можно поинтересоваться?

Неактивний

#14 2021-01-28 14:44:09

luminofor
Учасник
Зареєстрований: 2020-01-28
Повідомлень: 52

Re: Запомнить состояние кнопок

Green пише:

А это на кой хрен, можно поинтересоваться?

Первый пост, первые два предложения

И вообще, уже не актуально. Накодил, проверил, работает!. Думаю при планируемом использовании, ячейки хватит лет на 20-30
lol

Остання редакція luminofor (2021-01-28 14:46:47)

Неактивний

#15 2021-03-23 11:36:40

gfo
Учасник
Зареєстрований: 2021-03-20
Повідомлень: 8

Re: Запомнить состояние кнопок

Пишите в память только тогда когда текущее состояние кнопки отличается от уже записанного. Чтение епрома то практически не органичено. По такой схеме вам 100к записей хватит лет на 100. Только от дребезга не забудьте избавится.

Неактивний

#16 2021-04-15 11:09:15

novator
Забанений
Зареєстрований: 2021-04-15
Повідомлень: 5

Re: Запомнить состояние кнопок

Тогда ячейка с адресом будет содержать состояние кнопок.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму