Использую только ассемблер.
Attiny13 через раз сохраняет данные EEPROM!?
- Сообщения: 58
- Зарегистрирован: Пн янв 08, 2007 18:23:08
Присоединяюсь к сказанному, Ни разу проблем с EEprom НЕ было.
Использую только ассемблер.
Использую только ассемблер.
- Реклама
Интересно, чего можно всунуть в 512 команд (ATtiny 13/13A) под СИии?
Я еще понимаю, за 2 килобайта (в словах - ибо команда, в среднем, двухбайтовая), но у тинек....
Я еще понимаю, за 2 килобайта (в словах - ибо команда, в среднем, двухбайтовая), но у тинек....
- Сообщения: 364
- Зарегистрирован: Сб май 25, 2013 11:52:14
Пишу тоже на ассемблере. Прерывается вообще не используются в программе, хотя при записи ставлю запрещение. Мк работает на частоте внутреннего генератора 9,6 МГц.
Спишем на брак пока.
Спишем на брак пока.
Cкинь исходник со схемой - мож посмотрю чего там на досуге. 
- Сообщения: 364
- Зарегистрирован: Сб май 25, 2013 11:52:14
Как оказалось, такая проблема действительно иногда появляется в МК Atmel. Память EEPROM до сих пор не является надежной, хотя производители заботают над этим.
Нашел кое-какую информацию по решению этой проблемы в книге Котова И. Ю., откуда привожу выдержку:
Проще всего это сделать, если отвести сохраняемой переменной несколько ячеек энергонезависимой памяти. Вероятность того, что все ячейки повредятся одновременно намного меньше. Хранить одно значение по двум адресам имеет смысл тогда, когда необходимо выявить только саму ошибку, но никак не восстановить утерянные данные. Дублирование по трем и более адресам EEPROM уже дает возможность найти и устранить проблему, когда один или несколько байтов случайно претерпели изменения. Подпрограммы, приведенные ниже, производят восстановление 8-разрядной величины, для хранения которой отведено 4 б памяти EEPROM. При считывании, сначала, проверяется условие равенства всех байтов памяти. Если значение хотя бы одного из них отличается от остальных, то данные были повреждены. В этом случае производится по парное сравнение между собой содержимого всех ячеек (всего 6 операций сравнения). В случае равенства хотя бы одной пары число, размещенное в этих двух ячейках, считается уцелевшим. Иначе данные не подлежат восстановлению.
Нашел кое-какую информацию по решению этой проблемы в книге Котова И. Ю., откуда привожу выдержку:
Проще всего это сделать, если отвести сохраняемой переменной несколько ячеек энергонезависимой памяти. Вероятность того, что все ячейки повредятся одновременно намного меньше. Хранить одно значение по двум адресам имеет смысл тогда, когда необходимо выявить только саму ошибку, но никак не восстановить утерянные данные. Дублирование по трем и более адресам EEPROM уже дает возможность найти и устранить проблему, когда один или несколько байтов случайно претерпели изменения. Подпрограммы, приведенные ниже, производят восстановление 8-разрядной величины, для хранения которой отведено 4 б памяти EEPROM. При считывании, сначала, проверяется условие равенства всех байтов памяти. Если значение хотя бы одного из них отличается от остальных, то данные были повреждены. В этом случае производится по парное сравнение между собой содержимого всех ячеек (всего 6 операций сравнения). В случае равенства хотя бы одной пары число, размещенное в этих двух ячейках, считается уцелевшим. Иначе данные не подлежат восстановлению.
- Реклама
- Сообщения: 822
- Зарегистрирован: Вс июн 02, 2013 12:23:03
мне интересен такой момент. Насколько я понимаю некоторые биты единички могут стать нулями. Наоборот я думаю никак.Viper115 писал(а):В случае равенства хотя бы одной пары число, размещенное в этих двух ячейках, считается уцелевшим. Иначе данные не подлежат восстановлению.
например мы записываем такой байт 0b00110101.
запишем его в еппром, но только не в один байт, а в три чтоб был резерв.
и например при чтение получим:
1) 0b00100100
2) 0b00000001
3) 0b00110100
применяя побитную операцию ИЛИ над этими тремя байтами получим изначальную ячейку.
a = 0b00100100 | 0b00000001 | 0b00110100;
a = 0b00110101
ну если не повезет то все биты одной и той же позиции будут битыми в разных ячейках то данные точно не восстановить.
Об этом много кто пишет, например Ревич "Программирование микроконтроллеров avr на ассемблере".Viper115 писал(а):Как оказалось, такая проблема действительно иногда появляется в МК Atmel. Память EEPROM до сих пор не является надежной, хотя производители заботают над этим.
Обычно считают, что требуется отслеживать напряжение питания (хоть аналоговым компаратором), для предотвращения записи в момент выключения питания, т.к. это гарантированное повреждение ЕЕПРОМ. Обеспечить достаточную емкость электролитических конденсаторов по питанию, для гарантированного бесопасного завершения записи, если она уже началась. А также обязательно включение BurnOut Detector (для параноиков - поставить внешний трехвыводный монитор питания) для предотвращения хаотического выполнения случайного кода при понижении напряжения питания ниже критического, что с большой вероятностью портит ЕЕПРОМ.


