Как корректно записывать в RAM DS1307 информацию с учетом внезапного отключения питания ?
- Войдите на сайт для отправки комментариев
Добрый день. Имеется проект бортового компьютера, который помимо других функций считает пробег используя ЖПС. Суть в том, что данные счетчика пробега сохраняются в память RTC с батарейкой. Данные из РТЦ считываются при старте программы , потом прога работает с ними, пересчитывает новый пробег и сохраняет обратно после каждого рассчета. Вроде все работает, но довольно часто при выключении-включении из РТЦ считывается полная белиберда, а иногда все корректно. такое ощущение, что когда в процессе записи в ртц выключаетсЯ питание - происходит баг. И при следующем включении считывается что попало , и пробег некорректный. Подскажите, как грамотно разрулить ? Что то мне подсказывает что надо писать и считывать в РТЦ два одинаковых блока , но как определить какой корректный а какой нет ?
Батарейка в норме, часы тикают не сбиваются.
Вариантов много, зависит от требуемого уровня надёжности, от ресурсов и т.п. например, можно после записи блока писать его контрольную сумму, и время записи. Правильй тот у которого правильная контрольная сумма и время записи позже. Есть ещё много вариантов. Думай как тебе удобнее.
Можна и с аппаратной стороны подойти к вопросу и проверить наличие основного питания непосредственно перед записью. Контроллер как правило питают от вторичного БП с конденсаторами, обеспечивающими работу после прекращения основного питания в течении некоторого времени. Даже при небольшой емкости это время составляет более десятков миллисекунд. И его достаточно для завершения корректной записи. Таким образом надо перед записью просто проверить основное питание и не производить запись если обнаружено его пропадание. Ну и записывать максимально быстро. Проверять факт наличия основного питания зачастую удается без дополнительного вывода, например использовать вывод подтянутый к питанию как ввод.
А еще можна делать прерывания по исчезновению основного питания и пока емкости держат записать в EEPROM хоть все состояние контроллера. А после включения - восстановить все как было.
Хорошая мысля приходит опосля... Выводов свободных нету, запись идет подряд 20 байт. с проверкой питания тоже не все так просто было бы.