Attiny13 через раз сохраняет данные EEPROM!?

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Сообщения: 58
Зарегистрирован: Пн янв 08, 2007 18:23:08

Сообщение kuber »

Присоединяюсь к сказанному, Ни разу проблем с EEprom НЕ было.
Использую только ассемблер.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15750
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Интересно, чего можно всунуть в 512 команд (ATtiny 13/13A) под СИии? 8)
Я еще понимаю, за 2 килобайта (в словах - ибо команда, в среднем, двухбайтовая), но у тинек.... :cry:
Реклама
Потрогал лапой паяльник
Сообщения: 364
Зарегистрирован: Сб май 25, 2013 11:52:14

Сообщение Viper115 »

Пишу тоже на ассемблере. Прерывается вообще не используются в программе, хотя при записи ставлю запрещение. Мк работает на частоте внутреннего генератора 9,6 МГц.
Спишем на брак пока.
Друг Кота
Аватара пользователя
Сообщения: 15750
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Cкинь исходник со схемой - мож посмотрю чего там на досуге. 8)
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Сообщения: 364
Зарегистрирован: Сб май 25, 2013 11:52:14

Сообщение Viper115 »

Как оказалось, такая проблема действительно иногда появляется в МК Atmel. Память EEPROM до сих пор не является надежной, хотя производители заботают над этим.
Нашел кое-какую информацию по решению этой проблемы в книге Котова И. Ю., откуда привожу выдержку:

Проще всего это сделать, если отвести сохраняемой переменной несколько ячеек энергонезависимой памяти. Вероятность того, что все ячейки повредятся одновременно намного меньше. Хранить одно значение по двум адресам имеет смысл тогда, когда необходимо выявить только саму ошибку, но никак не восстановить утерянные данные. Дублирование по трем и более адресам EEPROM уже дает возможность найти и устранить проблему, когда один или несколько байтов случайно претерпели изменения. Подпрограммы, приведенные ниже, производят восстановление 8-разрядной величины, для хранения которой отведено 4 б памяти EEPROM. При считывании, сначала, проверяется условие равенства всех байтов памяти. Если значение хотя бы одного из них отличается от остальных, то данные были повреждены. В этом случае производится по парное сравнение между собой содержимого всех ячеек (всего 6 операций сравнения). В случае равенства хотя бы одной пары число, размещенное в этих двух ячейках, считается уцелевшим. Иначе данные не подлежат восстановлению.
Реклама
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Сообщение amd9800 »

Viper115 писал(а):В случае равенства хотя бы одной пары число, размещенное в этих двух ячейках, считается уцелевшим. Иначе данные не подлежат восстановлению.
мне интересен такой момент. Насколько я понимаю некоторые биты единички могут стать нулями. Наоборот я думаю никак.

например мы записываем такой байт 0b00110101.

запишем его в еппром, но только не в один байт, а в три чтоб был резерв.

и например при чтение получим:
1) 0b00100100
2) 0b00000001
3) 0b00110100

применяя побитную операцию ИЛИ над этими тремя байтами получим изначальную ячейку.

a = 0b00100100 | 0b00000001 | 0b00110100;
a = 0b00110101

ну если не повезет то все биты одной и той же позиции будут битыми в разных ячейках то данные точно не восстановить.
Реклама
Друг Кота
Сообщения: 6014
Зарегистрирован: Чт ноя 26, 2009 11:16:50
Откуда: Москва

Сообщение SmarTrunk »

Viper115 писал(а):Как оказалось, такая проблема действительно иногда появляется в МК Atmel. Память EEPROM до сих пор не является надежной, хотя производители заботают над этим.
Об этом много кто пишет, например Ревич "Программирование микроконтроллеров avr на ассемблере".

Обычно считают, что требуется отслеживать напряжение питания (хоть аналоговым компаратором), для предотвращения записи в момент выключения питания, т.к. это гарантированное повреждение ЕЕПРОМ. Обеспечить достаточную емкость электролитических конденсаторов по питанию, для гарантированного бесопасного завершения записи, если она уже началась. А также обязательно включение BurnOut Detector (для параноиков - поставить внешний трехвыводный монитор питания) для предотвращения хаотического выполнения случайного кода при понижении напряжения питания ниже критического, что с большой вероятностью портит ЕЕПРОМ.
Ответить

Вернуться в «AVR»