Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Аппартный сброс и ОЗУ
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
stapleman
Здравствуйте.
У меня имеется несколько вопросов по поводу аппаратного сброса:
1. Что происходит с ОЗУ контроллера при аппаратном сбросе.
2. Если ОЗУ обнуляется, то можно ли это обнуление запретить.
3. Обнуляются ли регистры общего назначения.

А в целом проблема заключается в следующем:
Мне необходимо сохранить в контроллере некое значение. Затем сделать резет контроллера (питание при этом не сбрасывается гарантированно). И чтобы это значение потом прочитать. Вся загвоздка заключается в том, чтобы не использовати EEPROM, так он имеет конечное число циклов перезаписи, и не хочется чтобы через пару лет устройство перестало работать.
Сергей Борщ
Цитата(stapleman @ Mar 20 2009, 19:13) *
1. Что происходит с ОЗУ контроллера при аппаратном сбросе.
Ничего.
Цитата(stapleman @ Mar 20 2009, 19:13) *
2. Если ОЗУ обнуляется, то можно ли это обнуление запретить.
Даташит  - наша библия. В даташите нет ни слова об обнулении. Раздел System Control and Reset
Цитата(stapleman @ Mar 20 2009, 19:13) *
3. Обнуляются ли регистры общего назначения.
Нет. См. п.2
Цитата(stapleman @ Mar 20 2009, 19:13) *
Мне необходимо сохранить в контроллере некое значение. Затем сделать резет контроллера (питание при этом не сбрасывается гарантированно). И чтобы это значение потом прочитать.
Интересно, как вы отличите это значение от мусора, который будет в том месте после включения питания?
smk
char my_variable __attribute__ ((section (".noinit")));

Вот так получается в WinAVR. Использую для подсчета числа засыпаний при пробуждении от вочдога.
Скопидор
Не меняется ни ОЗУ ни РОН.

P.S. А проверить было в "железе" не судьба? Ведь это дело 5-ти минут
stapleman
Цитата(smk @ Mar 20 2009, 21:28) *
char my_variable __attribute__ ((section (".noinit")));

Вот так получается в WinAVR. Использую для подсчета числа засыпаний при пробуждении от вочдога.


Спасибо большое. Я тоже WINAVR использую, поэтому такой ответ мне очень помог.
PS Можно ли где-нибудь про такие штуки типа __attribute__ ((section (".noinit"))); почитать на русском?
SasaVitebsk
Цитата(Сергей Борщ @ Mar 20 2009, 22:24) *
Интересно, как вы отличите это значение от мусора, который будет в том месте после включения питания?

Если имеется аппаратный PowerFail, то возможно, путём выделения спец зоны озу с контролем по типу контроля протокола.
galjoen
Цитата(Сергей Борщ @ Mar 20 2009, 21:24) *
Интересно, как вы отличите это значение от мусора, который будет в том месте после включения питания?

1. Там можно CRC на данные хранить.
2. Можно флаг EXTRF проверять (если внешний BOD не используется).
А вообще состояние ОЗУ после включения не такое уж и случайное. Пробовал по нему защиту от копирования делать (не на АВР). Получалось.
defunct
Цитата(Сергей Борщ @ Mar 20 2009, 20:24) *
Интересно, как вы отличите это значение от мусора, который будет в том месте после включения питания?

Можно по флажку POR в регистре MCUSR(MCUCSR). Если взведен - было отключение питания
Сбрасывать флажек надо вручную.
AlexCrush
Вообще, с ОЗУ контроллера при сбросе действительно ничего не происходит.
Более того, при выключении питания тоже содержимое ОЗУ сохраняется некоторое время (несколько минут) невредимым.
Я это использую в одной разработке следующим образом: есть некое состояние системы, которое вообще было бы неплохо (но не обязательно) восстанавливать после сбоев питания. Однако в EEProm для данного состояния места нет, да и состояние меняется слишком часто чтобы позволить себе запись в ЕЕПром.
Выход - храним состояние в ОЗУ. А при старте МК проверяем, в порядке ли состояние в ОЗУ. Если нет - не беда, "холодный" старт. Если же в порядке - ну повезло, старт будет "горячий".
Проверка правильности выполняется просто - контрольная сумма, пересчитываемая при каждой записи в "охраняемую" область ОЗУ.
Позднее на плату добавился ионистор для поддержки питания МК в течение нескольких десятков секунд для того чтобы сохранить всё в ЕЕПром, при этом обнаружился эффект: при разрядке ионистора и падении напряжения питания до 2.4 в МК вырубается BOD-ом, при этом МК почти перестает потреблять энергию и оставшиеся 2.4 падают до 0.5в в течение нескольких часов. Всё это время состояние ОЗУ сохраняется! Т.е. если ус-во включить - то происходит горячий старт с поднятием состояния из ОЗУ.
Вот такие пироги.
woroba
Цитата(AlexCrush @ Mar 22 2009, 15:16) *
Более того, при выключении питания тоже содержимое ОЗУ сохраняется некоторое время (несколько минут) невредимым.

Спасибо за идею, как раз ломал голову как сохранить состочние МК(запись вEEPROM не укладывается по времени)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.