Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: EEPROM. Счетчик времени наработки.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Spym
Доброго времени суток.

Требуется хранить в энергонезависимой памяти количество запусков станка и время наработки, для чего предполагается использовать что-то вроде Atmel AT24C02B.

Запись значений в EEPROM производится при отключении питания, пока конденсаторы держат 5В.

С целью увеличить ресурс памяти, была мысль организовать работу с ней следующим образом:

Изначально во все ячейки записаны 0x00.
При отключении устройства пишем значения в ближайшие свободные ячейки.
При последующем включении читаем последнюю ячейку перед 0x00.
Если после прочитанной ячейки нет свободных, записываем во все ячейки 0x00 (т.е. следующая запись с первой ячейки).

(Скорость в данном случае не критична).
Возможно, кто решал схожие задачи?
defunct
Цитата(Spym @ Jul 13 2008, 01:37) *
(Скорость в данном случае не критична).
Возможно, кто решал схожие задачи?

IMHO для такой задачи лучше взять AT93C46
aaarrr
Цитата(Spym @ Jul 13 2008, 02:37) *
Если после прочитанной ячейки нет свободных, записываем во все ячейки 0x00 (т.е. следующая запись с первой ячейки).

...и теряем все данные в случае проблем с записью (а они могут быть, т.к. Вы собираетесь переписывать все, что займет значительное время).

У современных EEPROM'ов весьма приличный ресурс (у того же AT24C02B 1 млн. записей), экономить его нужно разумно.
Flasher
Может процессор со встроенным EEPROM?
aaarrr
Цитата(defunct @ Jul 13 2008, 02:56) *
IMHO для такой задачи лучше взять AT93C46

Чем лучше?
defunct
Цитата(aaarrr @ Jul 13 2008, 01:57) *
Чем лучше?

ценой, количеством циклов записи, пословной организаций, и интерфейс быстрее (2Mhz).

Другой хороший вариант - DS13xx с батарейкой и с NVRAM и обновлять каждую секунду по прерыванию от DSки.
aaarrr
Цитата(defunct @ Jul 13 2008, 03:03) *
ценой, количеством циклов записи, пословной организаций, и интерфейс быстрее (2Mhz).

Цена одинаковая - около 0. Количество записей совпадает. Интерфейс на меге придется делать программно.
sgs
Цитата(aaarrr @ Jul 13 2008, 04:20) *
Цена одинаковая - около 0. Количество записей совпадает. Интерфейс на меге придется делать программно.


Ну, на самом деле, 93С46 будет подороже. чем 24С02. А вот насчет интерфейса - пожалуйста, поподробнее. Кажется, на большинстве ATMega SPI интерфейс аппаратный? Кстати, 24С02 не стоит использовать - сейчас минимальный кристалл, рекомендованный производителями - 24С04. Что касается удобства и простоты сохранения данных - лучше, на мой взгляд, использовать SPI память типа 93C46 или 25040A (или людой другой емкости) - она просто быстрее в обмене, чем I2C. Для увеличения ресурса записи можно посмотреть рекомендации Atmel'а "AVR101: High Endurance EEPROM Storage". Но в своей практике я предпочитаю продукцию RAMTRON - FM24C04 или FM24C16. Их основное преимущество - отсутствие 5 мсек задержки на запись и 1Е12 циклов записи в одну ячейку, что перекрывает любые мыслимые потребности... Кстати, у RAMTRON'а есть и SPI память, если хочется побыстрее. Цена вполне сопоставима с 93С46 и в полтора раза выше, чем у AT24C16.
aaarrr
Цитата(sgs @ Jul 13 2008, 11:01) *
А вот насчет интерфейса - пожалуйста, поподробнее. Кажется, на большинстве ATMega SPI интерфейс аппаратный?

SPI аппаратный, но microwire он делать не умеет.
dx40
А чем не подходит стандартная реализация?
Разбиваем всю память на десяток - сотню ячеек для записи. Сначала забиваем все ячейки нулями. По включении ищем наибольшее значение счетчика, запоминаем номер ячейки. По выключению записываем в следующую ячейку.

Можно немного улучшить - записываем значения раз в час, каждый раз в следующую ячейку, а по включению можно будет исправить ошибку, если вдруг записалось что-то не то.
Spym
Цитата
А чем не подходит стандартная реализация?

Так и хотел сделать.

С EEPROM вроде все ясно.
Я стал смотреть в сторону FRAM... Оправдано ли её применение здесь, или стоит остановиться на EEPROM...?
dx40
Цитата(Spym @ Jul 13 2008, 21:31) *
Так и хотел сделать.

С EEPROM вроде все ясно.
Я стал смотреть в сторону FRAM... Оправдано ли её применение здесь, или стоит остановиться на EEPROM...?


А зачем? Встроенной ЕЕРROM должно хватить. Только стирать её всю не надо, а по заполнению переписывать ячейки сначала. Ну и стандартные рекомендации - не использовать нулевой адрес, включить BOD.
Serjio
Если писать во внутреннюю память, то при записи раз в 10 минут ресурсов хватит почти на 2 года (пишем статически в одну ячейку), но 10 минут, как показывает практика, мало. Желательно раз в 10 сек, чтобы не терялась наработка.Можно использовать, как написано выше - тогда ресурсов хватит надолго, либо использовать FRAM(типа FM24С04 -27 руб. или с часами и проч.. FM3104 - 114руб.)
delamoure
Цитата(Spym @ Jul 13 2008, 20:31) *
Так и хотел сделать.

С EEPROM вроде все ясно.
Я стал смотреть в сторону FRAM... Оправдано ли её применение здесь, или стоит остановиться на EEPROM...?



Не забивайте голову выбором - юзайте FRAM.
Razubaev
Serjio: "...ресурсов хватит почти на 2 года..."

Пожалейте эксплуататоров. В результате придется каждый год менять.
Serjio
Это не рекомендация - это предупреждение, сперва считайте, потом выводы делайте. Мы давно уже перешли на FRAM и довольны...
prm
ИМХО количество запусков лучше считать при подаче питания. Спросите, а как же сбросы контроллера? Если прибор имеет хорошее питание, то их число минимально и ими можно принебречь.

Делал года три назад приборчик маленький, в нем записть во внутреннюю EEPROM контроллера осуществляется каждые 2-3 минуты. Прибор до сих пор работает и "умирать" не собирается.

В ответственных приложениях лучше использовать FRAM. Много плюсов имеет. Да и скорость записи выше, чем у еепром.

Отличный вариант хранить не большой объем данных в часах.
aaarrr
Цитата(prm @ Jul 15 2008, 07:40) *
Отличный вариант хранить не большой объем данных в часах.

ИМХО, самый плохой вариант, если нужно считать время наработки. Кончится батарейка и данные будут утеряны безвозвратно.
Artem Polonsky
Если не критична точность - можно просто обновлять значение в EEPROM с соответствующей периодичностью. При обновлении раз в минуту получается 500000 записей на год работы (и это учитывая лишь время включения станка).
defunct
Цитата(aaarrr @ Jul 15 2008, 11:57) *
ИМХО, самый плохой вариант, если нужно считать время наработки. Кончится батарейка и данные будут утеряны безвозвратно.

Можно копировать данные из часов во внутренний eeprom при включении питания.
Если RTC критично, батарейку поменяют когда она сядет (потеряем максимум один интервал).
aaarrr
Если правильно (без стирания всего и вся разом) организовать кольцевую запись, то достаточно будет обычной EEPROM (той же AT24C02B, например). И никаких FRAM'ов, RTC и тому подобного не потребуется.
prm
Цитата(aaarrr @ Jul 15 2008, 14:57) *
ИМХО, самый плохой вариант, если нужно считать время наработки. Кончится батарейка и данные будут утеряны безвозвратно.


Смотрим в сторону FM31xx от Ramtron. Часы + Память в одном флаконе. Замечательное решение!
aaarrr
Цитата(prm @ Jul 15 2008, 15:38) *
Смотрим в сторону FM31xx от Ramtron. Часы + Память в одном флаконе. Замечательное решение!

1. NRND
2. 10 year Data Retention
3. Дороже отдельного EEPROM + RTC (а новые еще дороже).
prm
Вариантов привели огромное количество. Думаю автор поста сможет выбрать из предложенных вариантов наиболее подходящий.
MALLOY2
А чем неустраевает внутриняя EEPROM меги128 ?
akl
Здравствуйте. Для решения аналогичной задачи остановился на MSP430F1121A+часовой кварц+индикатор TIC33+стабилизатор 3V.
Формат представления 999999 59 . Ток потребления 18 мкА.
ukpyr
Цитата
при записи раз в 10 минут ресурсов хватит почти на 2 года

это что за станок такой, который включается/выключается каждые 10 минут круглосуточно ?
даже если писать раз в час, внутреннего eeprom хватит минимум на 5 лет, если организовать кольцевой буфер на 10 записей - то на 50 лет. думаю станок раньше загнется smile.gif .
Serjio
Курим datasheet на мегу8 (и прочие меги) : 512 Bytes EEPROM
Endurance: 100,000 Write/Erase Cycles

Предположим, что писать будем раз в 10 минут. т.е. при отсчитывании очередных 10 мин. производится запись суммарной наработки в eeprom.
Если станок обессточивается во время работы, то максимальное неучтенное время - почти 10 мин. (Это как повезет). При наихудшем стечении обстаятельств за (предположим) неделю было 10 отключений (обед + конец смены)*5рабочих дней вы можете потерять 10*10=100 минут наработки. Мы в свое время выводы сделали и наработку считаем в FRAM по 10 сек. Теперь, если писать все время в одну ячейку (EEPROM), то ее хватит 100000*10/(60*24*365)=1.9 Года
(Это соответственно при непрерывной работе станка), но кто даст гарантию, что станок не будет работать в 3 смены. Если станок необходим в производстве, то так оно и будет. Простои оборудования-это убытки. Кольцевой буфер конечно может спасти, но за счет усложнения мат обеспечения, и если есть свободные ресурсы (по таймингу, по свободной памяти программ и EEPROM).
aaarrr
Цитата(Serjio @ Jul 16 2008, 00:39) *
Кольцевой буфер конечно может спасти, но за счет усложнения мат обеспечения, и если есть свободные ресурсы (по таймингу, по свободной памяти программ и EEPROM).

ИМХО, кольцевой буфер или другой вид резервирования в любом случае нужен. Иначе рискуете потерять все просто при неудачном стечении обстоятельств.
Serjio
вполне достаточно трех одинаковых переменных, и при старте их сравнивать между собой, делая выводы.
Petka
Цитата(Serjio @ Jul 16 2008, 00:39) *
Кольцевой буфер конечно может спасти, но за счет усложнения мат обеспечения, и если есть свободные ресурсы (по таймингу, по свободной памяти программ и EEPROM).

Appnote AVR101 "High endurance EEPROM storage"
Maik-vs
Вот как я представляю себе это 07.gif Прошу критиковать. (применение FRAM, батареек - простите, это другая песня, речь идёт именно об использовании родного ППЗУ в кристалле).

В EEPROM выделяем буфер N слов. Слово 4 байта ( 3 байта число минут, хватит на 32 года, 1 байт CRC). При прошивке расписываем буфер нулями с правильным CRC.

При включении прибора ищем ближайшее слово с правильным CRC. (адрес P) Его значение переписывааем в RAM, там наращиваем каждую минуту. Дальше ищем от P+1 до P-2 по кольцу слово с правильным нулём (в смысле CRC), адрес Q. Если нет - пишем нуль+CRC в P+1 .. P-2 пока получится.

Во время работы каждую минуту записываем значение времени в Q с проверкой. Не получилось - ищем/организуем следующее слово для записи, как описано выше.

Что получается. Буфер содержит "хвост" из счётчиков последних включений с правильным CRC. По жизни EEPROM исчерпывает ресурс, и тогда получается неверный CRC. Вся эта байда работает, пока не испортятся все слова буфера, кроме одного. Тогда в нём содержится счётчик наработки на момент исчерпания ресурса. Точность 1 минута, потери возникают при включении меньше, чем на минуту и при каждом выключении. То есть прибор при нормальной работе включается на десятки минут.
Чтобы не писать каждую минуту и избежать потерь при выключении, можно организовать контроль питания и буферный кондёр такой, чтобы хватило на запись. Но это уже третья песня smile.gif

Что хочется узнать. Как портятся ячейки EEPROM - становятся FF, 00 или ещё как-то? Для проверки правильности записи - CRC или ещё что-то?
aaarrr
Цитата(Serjio @ Jul 16 2008, 10:26) *
вполне достаточно трех одинаковых переменных, и при старте их сравнивать между собой, делая выводы.

Это менее надежно. Тем более, что это должны быть не переменные, а структуры со своим CRC.
delamoure
Цитата(prm @ Jul 15 2008, 14:38) *
Смотрим в сторону FM31xx от Ramtron. Часы + Память в одном флаконе. Замечательное решение!



А вы пробовали?
Кстати, народ, обратите сразу внимание на несколько неудобную реализацию reset у этих чипов.
sgs
Цитата(Maik-vs @ Jul 16 2008, 12:36) *
Вот как я представляю себе это 07.gif Прошу критиковать. (применение FRAM, батареек - простите, это другая песня, речь идёт именно об использовании родного ППЗУ в кристалле).

В EEPROM выделяем буфер N слов. Слово 4 байта ( 3 байта число минут, хватит на 32 года, 1 байт CRC). При прошивке расписываем буфер нулями с правильным CRC.
....
Что хочется узнать. Как портятся ячейки EEPROM - становятся FF, 00 или ещё как-то? Для проверки правильности записи - CRC или ещё что-то?


Поскольку изначально предлагалось писать в 24С02, то вопрос использования внутреннего EEPROMа не поднимался. Для использования EEPROM я применял лет пять назад следующий алгоритм: 3 зоны памяти - 2 байта, 256 байтов и 4х256. В первой зоне - два старших байта (3 и 2) сохраняемого числа. Они пишутся с разрядкой 1/65536 относительно частоты записи. Во втором блоке - средний байт (1), причем адрес внутри блока определяется байтом (2). Младший байт пишется в массив 1024(4х256) по адресу, определяемому байтом (1) и младшими разрядами байта (2). Запись в каждую зону - строго по изменению соответствующего байта. Таким образом, живучесть каждой записи определяется живучестью записи самого младшего байта - 600 000 Х 1024, что дает порядка 20 лет неперывной записи с периодом в 1 секунду... Естественно, применялась 24С16 - 2К байтов. Свободные ячейки пошли на служебные параметры процессора... Правда, такой вариант применим только при наличии внешней EEPROM, поскольку надежность записи напрямую зависит от объема памяти. Еще одна проблема внутреннего EEPROMа - запись в одну ячейку за раз, в то время, как 24 серия имеет буфер на 8-16-32 байта одновременной записи.
IJAR
Для Вашей задачи есть готовое устройство
http://www.fractal.com.ru/index.php?p=devi...p;ssp=IND1-2.7x
Spym
Уже готова разводка под FM25C160 (FRAM).
Планирую записывать время наработки 1 раз в секунду, используя 2 ячейки (запись в каждую ячейку через раз), то есть в случае отключения питания в процессе записи счетчик потеряет не более 1 секунды.
sgs
Цитата(Spym @ Jul 24 2008, 14:53) *
Уже готова разводка под FM25C160 (FRAM).
Планирую записывать время наработки 1 раз в секунду, используя 2 ячейки (запись в каждую ячейку через раз), то есть в случае отключения питания в процессе записи счетчик потеряет не более 1 секунды.

Для FRAM'а существенно напряжение питания: 4.5 ..5.5 В. Если питание будет ниже 4.5 В во время обращения к чипу (все равно - по записи или чтению), вы рискуете потерять не только данные в ячейке обращения, но и во всех связанных с ней ячейках строки регенерации - конкретно для FM25C160 - 4 байта в 4-х разных банках. Поэтому производитель настоятельно рекомендует (page 3) контролировать питание и принимать меры, чтобы хотя бы сигнал CS был "1" при пониженном напряжении. В своих схемах я перед обращением к FRAM'у проверяю уровень "сырого" питания (до стабилизатора), выбранный так, чтобы времени разряда конденсатора фильтра до минимального входного напряжения стабилизатора хватило на операцию записи/чтения. При этом важные данные хранятся блоками с CRC. Кстати, не стоит полагаться на внутренние подтягивающие резисторы выводов процессоров - обязательно подтягивайте CS резистором 10..100 КОм к плюсу питания.
Боинг749
Цитата(Spym @ Jul 13 2008, 01:37) *
Доброго времени суток.

Требуется хранить в энергонезависимой памяти количество запусков станка и время наработки, для чего предполагается использовать что-то вроде Atmel AT24C02B.

Запись значений в EEPROM производится при отключении питания, пока конденсаторы держат 5В.

С целью увеличить ресурс памяти, была мысль организовать работу с ней следующим образом:

Изначально во все ячейки записаны 0x00.
При отключении устройства пишем значения в ближайшие свободные ячейки.
При последующем включении читаем последнюю ячейку перед 0x00.
Если после прочитанной ячейки нет свободных, записываем во все ячейки 0x00 (т.е. следующая запись с первой ячейки).

(Скорость в данном случае не критична).
Возможно, кто решал схожие задачи?


Если нужно писать более одного байта то лучше использовать FLASH.. Тем более что она и пишется быстрей (4.5мС против 8-9мС у EEPROM)
Igor26
Цитата(Боинг749 @ Aug 25 2008, 16:59) *
Если нужно писать более одного байта то лучше использовать FLASH.. Тем более что она и пишется быстрей (4.5мС против 8-9мС у EEPROM)

Послушайте уважаемый. Вы темы читаете полностью, или только заголовки? Интересно, на сколько тем вы еще ответите за сегодня.
Боинг749
Цитата(Igor26 @ Aug 25 2008, 16:06) *
Послушайте уважаемый. Вы темы читаете полностью, или только заголовки? Интересно, на сколько тем вы еще ответите за сегодня.

Человек спросил, я ему дал совет из своего опыта....Хотел помочь
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.