Хотел бы посоветоваться. Проектирую устройство на Ардуине. Столкнулся с необходимостью записывать в энергонезависимую память раз в минуту несколько байт данных по одним и тем же адресам. Казалось бы, есть EEPROM, однако одни сутки - это 1440 минут, а заявленное число циклов записи в EEPROM - 100 000. Соответственно, при таком режиме эксплуатации память буквально вылетит за несколько месяцев. Сейчас думаю, есть ли какие-либо доступные альтернативные аналоги EEPROM, или может проще писать данные в переменную, обеспечив Ардуину бесперебойным питанием? Энергонезависимая память используется именно в расчете на пропадание электропитания, чтобы при его включении быстро восстановить значение переменной и подкорректировать поведение устройства. Заранее спасибо за советы.
пишите в разные адреса. писать в одни и те же - это надуманная проблема. Ну, если это по каким-то причинам всё-таки не изменить, то повесьте мелкий мк, который будет разбрасывать по разным адресам, а для одурины выглядеть как еепром с одним адресом.
ну дык по маркеру какому-нибудь. например, нам надо записать 2 байта. ну пишем 4 байта, только последние два - сигнатура-счётчик, что это последние. два байта - это уже 65 с лишним тыщ вариантов.
Или же найдите еепром не 100к, например: M95M04-DR
Добавлено after 12 minutes 20 seconds: Можно вообще круто сделать, например, создать нормальный формат записи, типа: 2 байта - сигнатура, а-ля 0хAFAF -означает, что это начало записи, 2 байта - размер данных 8 байт - юникс-время (по нему узнаем и последние данные и когда ваще был сбой) N байтов - данные, количество которых определено выше 1 байт (по адресу N+13) - контрольная сумма данных
И тогда получится не только распределение по памяти, но и логирование полноценное, за некий период
ну дык по маркеру какому-нибудь. например, нам надо записать 2 байта. ну пишем 4 байта, только последние два - сигнатура-счётчик, что это последние. два байта - это уже 65 с лишним тыщ вариантов.
Надо будет прикинуть временные затраты на такое чтение и такую запись - это важно для устройства.
Цитата:
Или же найдите еепром не 100к, например: M95M04-DR
Вот это более интересный вариант, правда его придется детально изучить. Библиотек под ардуино на него нет, но даташит расписан очень подробно - можно попробовать написать библиотеку самому, хотя по правде говоря, я этим раньше никогда не занимался. Впрочем, попробовать интересно.
Цитата:
8 байт - юникс-время (по нему узнаем и последние данные и когда ваще был сбой)
Задача несколько не та - само время возникновения сбоя хранить не требуется. Тем не менее, спасибо большое за интересные идеи - есть над чем подумать.
воспользуйся тем, что в пустой памяти записано FF: или примени маркер отличный от FF, или в данных не допускай этой комбинации... пишешь по порядку, как всё заполнилось - всё стираешь и пишешь по новой. начало записи (запись делай постоянной величины или сам маркер пусть указывает на размер идущей за ним записи) находишь по отличию от FF записанной в ячейку информации.
_________________ Для тех, кто не учил магию мир полон физики Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Если использовать внешнюю EEPROM то советую посмотреть в сторону 24LC32, у которой первые 4 Кбит (512 байт) имеют повышенную долговечность (10 000 000 запись/стирание). Или можно использовать SRAM и встроенную EEPROM, а при исчезновении питания данные из SRAM переписывать в EEPROM. Как уже говорилось ранее, данные лучше записывать в новые ячейки по круговому принципу…
DS1302 с батарейкой. У нее есть несколько байт ОЗУ, которые могут использоваться для подобных дел. Лучше не придумаешь.
Увы, не пойдет. В качестве RTC в этой схеме я использую DS3231 в связи с довольно высокими требованиями к точности хода часов. Хотя ХЗ, может в ней свое ОЗУ есть. Посмотрю даташит.
Цитата:
воспользуйся тем, что в пустой памяти записано FF: или примени маркер отличный от FF, или в данных не допускай этой комбинации...
Мне надо хранить uint16_t в определенном диапазоне. Можно, конечно, попробовать как-то поиграть битами и видоизменить число с последующим обратным перекодированием. Как раньше шутили, только с появлением компьютеров был найден ответ на извечный вопрос To be or not to be, и имя ему FF. Попробую этот вариант взять в работу и провести расчеты. Всем спасибо. Идей масса, можно повыбирать.
) Там 56 байт ОЗУ (именно статическое ОЗУ, а не ЕЕПРОМ!) - вполне достаточно для небольшого блокнотика. Можно еще найти старинные ОЗУ с батарейкой серий М41/M48
Что касается DS1307 - имел опыт и больше не хочу. У меня их точность плавала до +-10 секунд в сутки - это совсем перебор.
Еще такой момент, возвращаясь к EEPROM. Может кто-то анализировал штатные Ардуиновские исходники методов записи в ее EEPROM? Может ли быть так, что данные в память контроллера пишутся не побайтно, а постранично - то есть, при попытке записи счетчик записи/стирания относится ко всем ячейкам страницы памяти?
Точность зависит от алгоритма прожки обращения к кристаллу. Для бытовых целей с возможностью коррекции хода - вполне удовлетворительный результат. Но то под ассемблером на самолапно написанной прожке - как под Си (тем более адуринкой со "штатными библиотеками") не проверял. Относительно встроенной ЕЕПРОМ адуринки - весьма недоволен остался. Может вина библиотеки, может "поджаренный кристалл"...
Точность зависит от алгоритма прожки обращения к кристаллу. Для бытовых целей с возможностью коррекции хода - вполне удовлетворительный результат.
Не очень понял. Часы идут себе и идут, а контроллер лишь обращается к RTC за данными. Или не так? У меня не чисто бытовые цели, поэтому мой выбор - DS3231. Проверено временем, его точность меня полностью устраивает. Но дополнительной памяти у него, увы, нет.
Цитата:
Относительно встроенной ЕЕПРОМ адуринки - весьма недоволен остался. Может вина библиотеки, может "поджаренный кристалл"...
А в чем недовольство, если не секрет? Проблемы с целостностью данных? За ссылки на микросхемы спасибо, хотя схему это заметно усложняет.
Программа считывает данные только при запуске и коррекции - остальное время тикает внутренний таймер в МК. Непрерывные циклы чтения вполне вероятный источник отклонений (как и схемотехника монтажа). Проверять с адуринкой - пока особо не приходилось (тем более с ее платками - там топология схемы принимается "как есть" - разве что "лишние детальки" можно выкусить, да платок с различной разводкой в продаже много встречается - это не самоделка с выверенной схемотехникой). Касательно ЕЕПРОМ - простейший контроль чистоты ЕЕПРОМ у АВРок программатором и то не всегда "чистое" выдает, а закладка данных в простой термостат под адуринкой меня весьма огорчила. Правда та адуринка была малость "поджаренная", так что не факт.
У меня не чисто бытовые цели, поэтому мой выбор - DS3231. Проверено временем, его точность меня полностью устраивает. Но дополнительной памяти у него, увы, нет.
Замените его на что-то из линейки FM31T372/374/376/378. И будет вам и RTC с погрешностью не более 2.5 минут за год (встроенный уже на заводе температурно-компенсированный кварц) и + несколько Кб FRAM. И всё это счастье в одном флаконе корпусе. И никакой мороки с кольцевыми буферами - можно писать в одни и те же адреса хоть до посинения! Ну или FM31276/FM31278 - из той же оперы, только кварц внешний и калибровать нужно самостоятельно.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения