Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Многократная запись значения счётчика в EEPROM микроконтроллера
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
koluna
Здравствуйте!

Требуется производить достаточно часто запись данных в EEPROM микроконтроллера ATmega88 (значение многобайтного счётчика).
Каким образом это лучше осуществлять с учётом того, что ресурс ячеек памяти всего 100000 циклов?
Применить какое-либо кодирование?

Благодарю заранее!
_Pasha
Делал подобные вещи таким образом, чтобы нужный блок данных писАлся в EEP только по факту падения напряжения питания.

Еще вариант - счетчик моточасов(вернее, "мотосекунд") - обновлялся в EEP только по факту остановки двигателя.


А так можно записывать по указателю, хранимому там же, в еепроме. Не прошел верификацию - инкремент указателя и запись в "девственную" область smile.gif
koluna
Цитата(_Pasha @ Jul 28 2009, 09:49) *
Делал подобные вещи таким образом, чтобы нужный блок данных писАлся в EEP только по факту падения напряжения питания.


АЦП/компаратор?
Успеют ли записаться 8 байт?

Цитата
А так можно записывать по указателю, хранимому там же, в еепроме. Не прошел верификацию - инкремент указателя и запись в "девственную" область smile.gif


Это уже интересно smile.gif
Vishv
Цитата(n_bogoyavlensky @ Jul 28 2009, 11:41) *
Здравствуйте!

Требуется производить достаточно часто запись данных в EEPROM микроконтроллера ATmega88 (значение многобайтного счётчика).
Каким образом это лучше осуществлять с учётом того, что ресурс ячеек памяти всего 100000 циклов?
Применить какое-либо кодирование?

Благодарю заранее!

Что значит -часто?
Если писать в одни и те же ячейки 1 раз в сек. непрерывно то ресурс израсходуется за 11,5 суток!!!
И еще не факт, что израсходуется....
koluna
Цитата(Vishv @ Jul 28 2009, 10:32) *
Что значит -часто?


На этот вопрос нет точного ответа
Частота переменная, варьируется в широких пределах (<< 0.2 Гц) и полностью зависит от внешних условий...
Два 32 разрядных счётчика.
Запись, думаю, не более 400 раз в день. Хотя, может быть и больше, конечно...

Цитата
Если писать в одни и те же ячейки 1 раз в сек. непрерывно то ресурс израсходуется за 11,5 суток!!!
И еще не факт, что израсходуется....


Ясное дело...
Непомнящий Евгений
Выделяете под хранение счетчика N "слотов" в епроме и пишите последовательно. Таким образом, ресурс будет 100000 * N.
Проблема - как определить актуальный слот. Можно в каждом слоте выделить один бит и по нему (а точнее по переходу) определять последний
Ledmaster
Цитата(n_bogoyavlensky @ Jul 28 2009, 11:41) *
Требуется производить достаточно часто запись данных в EEPROM микроконтроллера ATmega88 (значение многобайтного счётчика).
Каким образом это лучше осуществлять с учётом того, что ресурс ячеек памяти всего 100000 циклов?
Применить какое-либо кодирование?

Ресурс EEPROM определяется не количеством операций записи, а количеством циклов стирания. Если речь идет о последовательном счете, можно воспользоваться решением, давным давно разработанным для счетчиков пробега автомобиля:каждое состояние счета отличается от предыдущего записью одного бита в одном из N байт, выделенных под хранение состояния счетчика. Если исходное состояние ячеек памяти после стирания равно 0xFF, значение каждого байта можно последовательно изменять на 0xFE, 0xFC, 0xF8 ... 0x00. Таким образом, в один байт можно записать 8 различных значений кода, а в N байт максимальное число 8^N! Например, для N=8 емкость такого счетчика равна 16.7 миллиона, что соответствует 3 байт обычного двоичного представления, зато СТИРАТЬ EEPROM ВООБЩЕ НЕ ПРИДЕТСЯ!
aaarrr
Цитата(Ledmaster @ Jul 28 2009, 20:26) *
Таким образом, в один байт можно записать 8 различных значений кода, а в N байт максимальное число 8^N! Например, для N=8 емкость такого счетчика равна 16.7 миллиона

Да ну? Можно записать 8 различных, но не любых. Так что количество состояний будет равно количеству бит, т.е. 64-м.
Rst7
Цитата
Да ну? Можно записать 8 различных, но не любых. Так что количество состояний будет равно количеству бит, т.е. 64-м.


Тут видимо имелось в виду вот что - состояний у такого счетчика действительно 8^N (если каждый байт соответствует восьмеричной цифре). Только в этом случае ресурс по младшему байту лучше всего в 8 раз - ведь каждые 8 раз его надо стирать.
singlskv
Цитата(Ledmaster @ Jul 28 2009, 20:26) *
Таким образом, в один байт можно записать 8 различных значений кода, а в N байт максимальное число 8^N! Например, для N=8 емкость такого счетчика равна 16.7 миллиона, что соответствует 3 байт обычного двоичного представления

Цитата(aaarrr @ Jul 28 2009, 21:01) *
Да ну? Можно записать 8 различных, но не любых. Так что количество состояний будет равно количеству бит, т.е. 64-м.

Цитата(Rst7 @ Jul 28 2009, 21:35) *
Тут видимо имелось в виду вот что - состояний у такого счетчика действительно 8^N (если каждый байт соответствует восьмеричной цифре).

Господа, там их 9(ДЕВЯТЬ) состояний байта:
0xFF, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00

другое дело что для удобства работы алгоритма и для всяких проверок удобно сократить количество до 8...
Цитата
Только в этом случае ресурс по младшему байту лучше всего в 8 раз - ведь каждые 8 раз его надо стирать.

это можно частично обойти прилично повысив живучесть
для 32бит счетчика пишем 8байт для старших 24бит и 8байт для младшего байта
Итого, стирание 1 раз за 64 записи
при заявленных ~400раз в день
имеем 100000 / 1000 * 64 = 16000 дней = ~43года
ну пусть 1000раз в день
имеем 100000 / 400 * 64 = 6400 дней = ~17лет
Ledmaster
Цитата(Rst7 @ Jul 28 2009, 23:35) *
Тут видимо имелось в виду вот что - состояний у такого счетчика действительно 8^N (если каждый байт соответствует восьмеричной цифре). Только в этом случае ресурс по младшему байту лучше всего в 8 раз - ведь каждые 8 раз его надо стирать.
Имелось в виду следующее: в любом байте можно поменять (без стирания) любой бит с 1 на 0 (но не наоборот!). Здесь я действительно погорячился, количество состояний такого счетчика будет равно количеству используемых бит ( значение счетчика равно количеству нулей ), соответственно, по заполнении всего поля нулями, необходима операция стирания с записью старших разрядов счетчика обычным кодом. Но даже в случае использования всего 8 байт эта операция понадобится в 64 раза реже ( для 400 записей в сутки это более 40 лет ресурса).
Была в электронных одометрах еще какая-то хитрость, надо повспоминать, давно это было unsure.gif
singlskv
Цитата(Ledmaster @ Jul 28 2009, 23:56) *
Но даже в случае использования всего 8 байт эта операция понадобится в 64 раза реже ( для 400 записей в сутки это более 40 лет ресурса).
Была в электронных одометрах еще какая-то хитрость, надо повспоминать, давно это было unsure.gif
8байт нужно именно на младший разряд (8битный), тогда в 64 раза лучше.
Итого: 16 байт на 32битный счетчик.
volodya
Можно использовать NVRAM, хотя это лишний корпус + батарейка, зато на ограничен ресурс.
К примеру DS1307(2) - часы + память.
XVR
Цитата(volodya @ Jul 29 2009, 09:24) *
Можно использовать NVRAM, хотя это лишний корпус + батарейка, зато на ограничен ресурс.
К примеру DS1307(2) - часы + память.
Тогда уж FRAM (от Ramtron), у нее ресурс тоже практически неограничен, и батарейка не нужна. Осталось узнать у топикстартера устроит ли его дополнительная внешняя м/сх.
_Pasha
Цитата(n_bogoyavlensky @ Jul 28 2009, 09:12) *
АЦП/компаратор?
Успеют ли записаться 8 байт?

Если в девайсе есть понижающий преобразователь или стабилизатор, можно спокойно мерять напряжение на его входе, по достижении некоторого мин. напряжения уйти в запись. Успеют ли записаться - определяется емкостью кондера на входе питания. Реализованный по такому принципу счетчик импульсов (метраж, скорость, уставки итд) записывал 4+4+4=12 байт без проблем. Питание на входе 24 вольта, dc-dc в 5 вольт. Конденсатор 1000мкф. Как Вы понимаете, в счетчике кроме контроллера более ничего нет smile.gif
koluna
Цитата(XVR @ Jul 29 2009, 09:59) *
Тогда уж FRAM (от Ramtron), у нее ресурс тоже практически неограничен, и батарейка не нужна. Осталось узнать у топикстартера устроит ли его дополнительная внешняя м/сх.


Не устроит.

Цитата(_Pasha @ Jul 29 2009, 13:16) *
Если в девайсе есть понижающий преобразователь или стабилизатор, можно спокойно мерять напряжение на его входе, по достижении некоторого мин. напряжения уйти в запись.


По +5 В кроме контроллера ещё много чего висит. Так что не успеет записаться, я думаю. Хотя, конечно можно попробовать.
Но. У МК все выводы заняты...
_Pasha
Цитата(n_bogoyavlensky @ Jul 31 2009, 10:36) *
Но. У МК все выводы заняты...

Aref свободен ? cranky.gif Меряйте опорное 1,1 вольт.
sigmaN
Мне понравится идея сделать как в автомобильных одометрах. А если её ещё чуток модифицировать - хватит и на 100 лет ))))
Ledmaster
Цитата(sigmaN @ Jul 31 2009, 19:38) *
Мне понравится идея сделать как в автомобильных одометрах. А если её ещё чуток модифицировать - хватит и на 100 лет ))))
Я повспоминал подробности, в одометрах немножко по другому. Там, обыкновенно, используются EEPROM 24С01, у которых в цикле записи байта происходит его автоматическое стирание, поэтому побитная запись смысла не имеет. Вместо этого значение счетчика без младшего шестнадцатиричной цифры записывается в виде 16 слов, сумма которых дает полное значение. Например, число 0x1EA записывается как 0x1F 0x1F 0x1F 0x1F 0x1F 0x1F 0x1F 0x1F 0x1F 0x1F 0x1E 0x1E 0x1E 0x1E 0x1E 0x1E. Для инкремента счетчика, перезаписывается ближайшая ячейка, значение которой отличается от предыдущей. Таким образом, запись в каждую ячейку осуществляется в 16 раз реже. Этого вполне достаточно, учитывая, что ресурс 24C01 составляет миллион циклов.
xemul
Цитата(Ledmaster @ Jul 31 2009, 19:46) *
Я повспоминал подробности, в одометрах немножко по другому. Там, обыкновенно, используются EEPROM 24С01

Да любые там использовались (и 93, и 25, и 24; в "японцах" иногда попадалось что-то совершенно экзотическое). За сейчас не скажу.
Цитата
Вместо этого значение счетчика без младшего шестнадцатиричной цифры записывается в виде 16 слов, сумма которых дает полное значение. Например, число 0x1EA записывается как 0x1F 0x1F 0x1F 0x1F 0x1F 0x1F 0x1F 0x1F 0x1F 0x1F 0x1E 0x1E 0x1E 0x1E 0x1E 0x1E. Для инкремента счетчика, перезаписывается ближайшая ячейка, значение которой отличается от предыдущей. Таким образом, запись в каждую ячейку осуществляется в 16 раз реже. Этого вполне достаточно, учитывая, что ресурс 24C01 составляет миллион циклов.

Такого вообще не припомню.
Чаще всего, по-моему, встречалась схема - кольцо (16-32-64 байта) для младшего байта пробега и 3-хкратная запись старших байтов (с мажорированием при чтении). А "голова" кольца находилась (при подаче питания) по нарушению возрастающей последовательности.
Но, имхо, у топикстартера слегка другая задача, и одометрические варианты ему малополезны. Более пригодным будет вариант с указателем текущего блока, записью (с проверкой) в этот блок "до убиения" и переходом после этого на следующий блок.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2018 Invision Power Services, Inc.