Хотел бы посоветоваться. Проектирую устройство на Ардуине. Столкнулся с необходимостью записывать в энергонезависимую память раз в минуту несколько байт данных по одним и тем же адресам. Казалось бы, есть 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 - из той же оперы, только кварц внешний и калибровать нужно самостоятельно.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения