Организация журнала событий в EEPROM
- Войдите на сайт для отправки комментариев
Втр, 27/01/2015 - 19:36
Ведется мониторинг некоторых событий. События происходят примерно 2-3 раза в день. Необходимо создать в EEPROM журнал в котором будет указываться дата и время события. Фиксировать достаточно в течении месяца, а затем по кругу. Пока приходит в голову только организации ячейки, в которой будет храниться указатель на текущий адрес. Может есть у кого более красивые идеи?
Дата же то же хранится. Найти в массиве самую позднюю дату - фигня вопрос ;0)
Дата же то же хранится. Найти в массиве самую позднюю дату - фигня вопрос ;0)
Согласен. При малом количестве данных хороший вариант. Спасибо
А много у вас во встроенном еепроме не получится .
определить макс размер данных например 6 байт (пусть у нас 512 этих байт в EEPROM = 84 события (85 - 1 так как гдето надо хранить адрес последнего события))
день, месяц, год(двухзначный), час ,минута, секунда
при настеплении события функция пише все эти числа в EEPROM начиная например с 0 адреса записываем этот адрес +6 в EEPROM в последние 2 байта
при следующем собитии адрес считываем из EEPROM и вызываем функцию записи собития и т.д. по кругу
для адреса определяем макс и мин значения шлифуем алгоритм и наслаждаемся
надеюсь понятно.
и на последок у нас еще осталось 4 байта EEPROM для других нужд
Вот если кто подскажет как записать событие что питание пропало ???
для адреса определяем макс и мин значения шлифуем алгоритм и наслаждаемся
надеюсь понятно.
и на последок у нас еще осталось 4 байта EEPROM для других нужд
Вот если кто подскажет как записать событие что питание пропало ???
Эта идея как раз и была высказана в первом сообщении. У меня секунды не учитываются. поэтому дата и время уместилась в 4 байта.
По вашему вопросу. Старт программы происходит либо после ресета, либо после пропадания питания. Смею догадаться, вас интересует аварийное пропадание питания? Можно попробовать на питание повесить конденсатор. Емкость посчитать от потребления ардуины и времени необходимого для записи состояния аварии в еепром. Конденсатор подключить через диод. При пропадании напряжения до диода, дает сигнал аварии, И пока не разрядился контенсатор, пытаемся успеть записать. Если использовать доп. питание от батареечки, тогда уж совсем просто.
Тады уж ионистор.
Из вопроса не совсем понятно что значит "питание пропало". Питание может пропасть из за аварийного отключения, либо из за отключения каким либо выключателем. Что бы посоветовать, нужно знать условия пропадания питания. Но без обвеса дополнительными детальками контроллера, явно не обойтись ИМХО.
Ведется мониторинг некоторых событий. События происходят примерно 2-3 раза в день. Необходимо создать в EEPROM журнал в котором будет указываться дата и время события. Фиксировать достаточно в течении месяца, а затем по кругу. Пока приходит в голову только организации ячейки, в которой будет храниться указатель на текущий адрес. Может есть у кого более красивые идеи?
место под журнал в EEPROM можно выделить сразу? тогда делаем циклический массив фиксированного размера. делается так:
создаем свой тип данных используя struct (фантазирую, так как нет информации о том, что за событие, информация о месяце не нужна - каждый месяц все стирается):
далее делаем массив. Можно применить распределение памяти самим компилятором:
или самому инициализировав ссылку например на начало EEPROM:
теперь объявляем глобальную переменную которая содержит индекс текущей свободной ячейки:
адрес для записи новой записи в EEPROM вычисляем так:
теперь после записи данных в EEPROM сдвигаем индекс:
чтобы успеть записать данные о факте выключения питания можно сделать двумя способами
1. записать данные до потери питания. потребуется какой-то буфер для питания МК на вермя необзодимое для записи. Нужно отделить внешний источник питания от МК диодом и один из входов МК подключить до диода. Тогда мы сможем узнать о пропаже питания по прерыванию до того момента когда разрядится буферный элемент. Буфером может быть ионистор, но нужно будет позаботиться о том, чтобы от ионистора питался только сам МК, чтобы переферия не разрядила ионистор быстрее чем нужно.
2. вариант не требует изменений в железе. Время от времени (скажем каждые 10 минут) записываем по последнему log_index событие сбоя питания без сдвига индекса. Если происходит событие - оно перетирает событие. Если происходит сбой питания - это событие остается
Но если нужны события питания в логе, тогда нужно еще созхранять в EEPROM и сам log_index
теперь после записи данных в EEPROM сдвигаем индекс:
Это конечно здорово, но при выключении питания индекс потеряется. Его либо писать тоже в епром, либо искать его исходя из того, что в журнал пишетя дата/время, и естественно последовательно. Реализовал второй вариант. В журнал (eeprom) пишется дата время без секунд, свернутое в 24 бита. и один байт для идентификации события.
2. вариант не требует изменений в железе. Время от времени (скажем каждые 10 минут) записываем по последнему log_index событие сбоя питания без сдвига индекса. Если происходит событие - оно перетирает событие. Если происходит сбой питания - это событие остается
Сбой питания может произойти совершенно случайно. И как карта ляжет в этот момент неизвестно. Может произойти во время перезаписи или между временем наступления события и записью в еепром. Учитывать или нет это, зависит от сукна на картежном столе:-)
ну вы не всю задачу описали, поэтому что-то точное рекомендовать сложно
если говорть про ваш кусок кода, то можно сделать чуть проще:
Сбой питания может произойти совершенно случайно. И как карта ляжет в этот момент неизвестно. Может произойти во время перезаписи или между временем наступления события и записью в еепром. Учитывать или нет это, зависит от сукна на картежном столе:-)
ну да. но на что это влияет? если есть понимание какую задачу решаем, все это решается. второй вариант компромиссный, он решает задачу с оговорками, но проще чем первый. смысл спорить если ваша задача не определена полностью? не ясно что нужно, какая конечная цель, какие допуски могут быть приняты и т.д. Это все важно.
ну вы не всю задачу описали, поэтому что-то точное рекомендовать сложно
если говорть про ваш кусок кода, то можно сделать чуть проще:
Это задача и вопрос были не мои. А за укорочение кода, спасибо.
Прошу прощения, но что то не могу найти библиотеку в которой
eeprom_write_block
я так понимаю avr/eeprom.h Не подскажете ссылочку
да, она, здесь описание на русском http://avr-libc.narod.ru/group__avr__eeprom.html
Странно, что никто не поднимает вопрос ограничения связанного с конечным количеством раз записи в еепром. Если указатель делать в епроме, то это будет ячейка ограничивающая время жизни всего устройства. Если лень искать по дате - обнуляйте ячейку следующую за последней записью, по ней и бутете находить место записи. Ведь в дате нет нулей, только время может принимать нулевое значение.
Странно, что никто не поднимает вопрос ограничения связанного с конечным количеством раз записи в еепром. Если указатель делать в епроме, то это будет ячейка ограничивающая время жизни всего устройства. Если лень искать по дате - обнуляйте ячейку следующую за последней записью, по ней и бутете находить место записи. Ведь в дате нет нулей, только время может принимать нулевое значение.
Дата и время объеденино в 3 байта. 6 бит на минуты, по 5 на часы и день 4 на месяцы 4 на год. Нулевыми такое слово быть не может. Такие данные легко сравнивать на больше меньше. Сделал поиск максимального значения. В следующую пишу новое значение. И так по кругу.
А ну тогда все красиво.
гарантированный ресурс EEPROM 10000 циклов записи. Если события хранятся месяц, то значит и перетираются раз в месяц, выходит ресурс 833 лет
Эх... не доживу :( А так хочется.....
К чему эти сложности с еепром,ведь гораздо удобнее для этой цели прикрутить sd и не ограничиваться никак...
Набросал класс для ведения журнала событий в EEPROM. Первый опыт работы с ардуино, так что не пинайте уж слишком. Создается структура с начальным и конечным адресом в EEPROM. Умеет записывать по кругу, в указанных адресах дату и время А так же 2 битное значения события. И естественно все это читать, и очищать.
Ну и пример использования