Ви не увійшли.
Тогда ячейка с адресом будет содержать состояние кнопок.
Пишите в память только тогда когда текущее состояние кнопки отличается от уже записанного. Чтение епрома то практически не органичено. По такой схеме вам 100к записей хватит лет на 100. Только от дребезга не забудьте избавится.
А это на кой хрен, можно поинтересоваться?
Первый пост, первые два предложения
И вообще, уже не актуально. Накодил, проверил, работает!. Думаю при планируемом использовании, ячейки хватит лет на 20-30
Счетчик считает, сколько раз я записал состояние сенсорных кнопок в ячейку.
А это на кой хрен, можно поинтересоваться?
luminofor пише:Делаю зарядное устройство
Ну и в чем проблема запитать ардуинку (или что там у вас) от заряжаемого аккумулятора на время отключения питания и не искать себе приключений?
Не, ну тут вы не правы. Это вообще запутает схему дополнительными стабилизаторами и гальваническими развязками. Проще добавить пару строчек кода
Блиин!!! Господа, я жестоко ошибался! Еще раз посмотрел даташит. Это флеш имеет 10000 циклов перезаписи, а eeprom 100000!
Так что буду писать в одну ячейку и не выносить мозг!
Делаю зарядное устройство
Ну и в чем проблема запитать ардуинку (или что там у вас) от заряжаемого аккумулятора на время отключения питания и не искать себе приключений?
luminofor, вы из простого делаете сложное. Сохраняйте состояние отдельно, счётчик отдельно. Состояние, как и счётчик сохраняются только при изменении. Счётчик что считает, как часто изменяется?
Счетчик считает, сколько раз я записал состояние сенсорных кнопок в ячейку.
Допустим состояние меняется примерно 10 раз в сутки. Что при ресурсе одной ячейки 10000 циклов дает 1000 циклов записи. Это почти три года безотказной работы, если писать все время в одну ячейку.
Насчет просто или сложно... Тут уже предложили два варианта, плюс мой первоначальный. Вопрос в квалификации программиста. Моя квалификация надеюсь хотя бы та троечку, так что буду выбирать из того, что смогу реализовать
luminofor, вы из простого делаете сложное. Сохраняйте состояние отдельно, счётчик отдельно. Состояние, как и счётчик сохраняются только при изменении. Счётчик что считает, как часто изменяется?
Я как-то делал так:
В запись включается маркер. Когда вся память чистая (заполнена единицами), маркер имеет значение 0.
Первая свободная ячейка будет иметь маркер 1.
Когда вся память заполнится записями с нулевым маркером, начинаем заполнять её с самого начала записями с единичным маркером.
Какое значение маркера является активным узнаём из первой ячейки. Когда значения маркеров в первой и последней ячейках совпадают, пора менять активное значение.
Алгоритм успешно работает в пульте управления какой-то самолётной радиостанции. Точно не помню, но кажется Р-862
Тоже неплохо!
В принципе да. Имеется ввиду запомнить режим.
Делаю зарядное устройство с сенсорным дисплеем. Нужно управлять кнопками Заряд-Стоп-Разряд.
И когда питание пропадает, то Заряд или Разряд уже не восстанавливаются. То есть нужно как то хранить состояние.
Можно вообще не заморачиваться, тупо долбить в одну ячейку. 10000 циклов должно надолго хватить
YK1 предложил нормальную идею, я ее обдумал на предмет реализации.
Берем 7 и 6 биты под хранение состояния:
10 - Заряд
00 - Стоп
01 - Разряд
Остальные биты, с пятого 5 по 0, под счетчик. Получаем 64 цикла
Читаем ячейку eeprom, делаем логическое И с 0x00111111, получаем циклы, прибавляем единицу и в полученном числе выставляем биты 7 и 6, записываем обратно.
Счетчик досчитал до 64х - переходим в следующую ячейку.
Есть проблема первого включения, когда все ячейки по 255, но я где то встречал решение. Идея такая.
Стираем всю eeprom и делаем контрольную сумму всей области памяти, записываем на шпаргалку. В setup() проверяем контрольную сумму с шаблонной, если совпадают, то это первый запуск и нужно записать нули во все ячейки.
Как узнать в какой ячейке находится состояние - читаем все ячейки по маске 0x00111111, находим первое с числом меньше 64.
Примерно так. Осталось накодить
Обычно состояние кнопок не запоминают, запоминают текущий режим выбранный этими кнопками. Запоминают также состояние переключателей. Если же нужна последовательность нажатий, например для снятия пароля, то это уже кнопочный (или клавиатурный) логгер. Ну а запись по кольцу или нет, выбирается исходя из требуемой задачи.
Я как-то делал так:
В запись включается маркер. Когда вся память чистая (заполнена единицами), маркер имеет значение 0.
Первая свободная ячейка будет иметь маркер 1.
Когда вся память заполнится записями с нулевым маркером, начинаем заполнять её с самого начала записями с единичным маркером.
Какое значение маркера является активным узнаём из первой ячейки. Когда значения маркеров в первой и последней ячейках совпадают, пора менять активное значение.
Алгоритм успешно работает в пульте управления какой-то самолётной радиостанции. Точно не помню, но кажется Р-862
А что, хорошая мысль. Спасибо за идею!
А зачем усложнять в 2 раза ?
Не проще ли искать нужный байт начиная сначала.
Допустим у тебя по умолчанию вся память 255. ищем байт сначала который не равен 255 и предшествует 255
В этом байте ты допустим хранишь 0bxxx...0yyy следующие биты
где
xxx.... -счетчик
yyy - состояние кнопок
Соответсвенно читаем состояние кнопок. из yyy. Если нужно записать увеличиваем счетчик xxxx+1 и пишем состояние кнопок. Переполнили счетчик, пишем в след. байт и т.п.
Если уж бороться с кол-вом записей. то она одна на изменение состояние (не надо писать адрес)
Ну и когда дошли до упора надо записать все 255. Хотя тоже можно обойтись и без этого. Надо искать последний байт (начиная с нулевого) у которого не переполнен счетчик xxx. и так по кругу...