Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как сохранить переменную при сбросе по BODLEVEL?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Валентиныч
Контроллер на Мега16.

Задача: необходимо сохранить калибровочную переменную при сбросе камня по BODLEVEL. Переменная (калибровочная константа одного из аналоговых датчиков, подключенных к ADC), записывается при инициализации девайса в ячейку SRAM после первого опроса датчика.
Датчик измеряет атмосферное давление. Очевидно, что оно не является постоянным, что не позволяет "раз и навсегда" прописать уставку в EEPROM в качестве калировочного значения. При включении устройства (компрессор), давление в патрубке падает, и восстанавливается до атмосферного с большой задержкой - это исключает возможность вторичной автокалибровки датчика до полной остановки механики. В рабочем режиме компрессора, после короткого сброса камня по BODLEVEL, показания датчика отличаются от калибровочного режима, что приводит к дальнейшей разбалансировки системы в целом.
Можно ли каким-то образом хранить в памяти (SRAM, EEPROM) в течение какого-то времени (задержка сброса BODLEVEL от единиц микроскунд, до сотен миллисекунд) ранее считанную уставку калибровки, для того, чтобы после отработки BODLEVEL использовать ее значение без вторичной калибровки датчика?
При этом после длительной остановки компрессора и включения системы необходимо заново откалибровать датчик и скорректировать работу устройства внесением поправки по атмосферному давлению.
mse
Цитата(Валентиныч @ Jan 10 2007, 13:36) *
Можно ли каким-то образом хранить в памяти (SRAM, EEPROM) в течение какого-то времени (задержка сброса BODLEVEL от единиц микроскунд, до сотен миллисекунд) ранее считанную уставку калибровки, для того, чтобы после отработки BODLEVEL использовать ее значение без вторичной калибровки датчика?

Что-то конкретное советовать не хочу. Но у мег есть биты в MCUCSR, соотв источникам сброса. По их разнице можно о чём-то судить. Например, если установлен БОРФ, то это одно. А если ПОРФ, то, наоборот, другое.
А целостность константы в ОЗУ можно каким-нить образом контролировать, что-ли. Заклятье какое или ЦРЦ на неё наложить.
=GM=
Цитата(Валентиныч @ Jan 10 2007, 10:36) *
Контроллер на Мега16.

Задача: необходимо сохранить калибровочную переменную при сбросе камня по BODLEVEL. Переменная (калибровочная константа одного из аналоговых датчиков, подключенных к ADC), записывается при инициализации девайса в ячейку SRAM после первого опроса датчика.
Датчик измеряет атмосферное давление. Очевидно, что оно не является постоянным, что не позволяет "раз и навсегда" прописать уставку в EEPROM в качестве калировочного значения. При включении устройства (компрессор), давление в патрубке падает, и восстанавливается до атмосферного с большой задержкой - это исключает возможность вторичной автокалибровки датчика до полной остановки механики. В рабочем режиме компрессора, после короткого сброса камня по BODLEVEL, показания датчика отличаются от калибровочного режима, что приводит к дальнейшей разбалансировки системы в целом.
Можно ли каким-то образом хранить в памяти (SRAM, EEPROM) в течение какого-то времени (задержка сброса BODLEVEL от единиц микроскунд, до сотен миллисекунд) ранее считанную уставку калибровки, для того, чтобы после отработки BODLEVEL использовать ее значение без вторичной калибровки датчика?
При этом после длительной остановки компрессора и включения системы необходимо заново откалибровать датчик и скорректировать работу устройства внесением поправки по атмосферному давлению.

Что если сделать так. По включению контроллер калибрует датчик, сохраняет калибровочную константу в ячейке CALIBR, и пишет признак калибровки FLAG=0x131313 в три байта, можно и в один, не суть. Если произошёл сброс по BODLEVEL, то программа прежде всего должна проверить флаг на соответствие значению 0x131313. Если совпадает, то значит недавно был сброс по BODLEVEL, если нет - значит имеем первое включение после перерыва и надо заново калиброваться. Вероятность того, что после выключения питания в этих ячейках останется определенное значение очень мала. Скорее всего там всегда будут нули.
prottoss
Цитата(Валентиныч @ Jan 10 2007, 17:36) *
Контроллер на Мега16.

Задача: необходимо сохранить калибровочную переменную при сбросе камня по BODLEVEL
задача стара как Биллли Гей... А что, резервное питание ни как не можно?
Валентиныч
Цитата(prottoss @ Jan 10 2007, 20:03) *
А что, резервное питание ни как не можно?
Наверное, можно, но в реальном железе его просто нет.
Но я уже решил проблемку так, как посоветовал mse - используя флаги, которые устанавливает сам камень по сбросу BOD, и WTD, кстати, тоже. Спасибо!
При стартовой калибровке сразу пишу уставку в SRAM и EEPROM.
Если при работе прошел reset от супервизора или собаки, и начинается перезагрузка камня, анализирую наличие/отсутствие флагов WDRF и BORF, и если хотя бы один из них выставлен - вместо калибровки просто читаю записанное в EEPROM значение переменной. При reset по включению питания указанные флаги сброшены.
Учитывая, что среднегодовое число включений системы не более 500, EEPROMа должно хватить лет на 200. biggrin.gif
GDI
при старте программы проверяем причину сброса, если это POR, то производим калибровку и дублируем константу в еепром, если причина сброса BOD, то пропускаем подпрограмму калибровки и считываем константу из еепром и работаем дальше. В процессе работы используем копию константы в ОЗУ.


эээ, блин, уже и сам догадался.. smile.gif
Oldring
Может быть лучше всего при запуске контролировать факт останова механики и стабильность давления? И если механика работает или давление еще нарастает - то останавливать механику и выжидать пока давление стабиллизируется? Потому что мало ли на какое именно время и как сильно проседало питание?
SasaVitebsk
Цитата(=GM= @ Jan 10 2007, 18:37) *
Что если сделать так. По включению контроллер калибрует датчик, сохраняет калибровочную константу в ячейке CALIBR, и пишет признак калибровки FLAG=0x131313 в три байта, можно и в один, не суть. Если произошёл сброс по BODLEVEL, то программа прежде всего должна проверить флаг на соответствие значению 0x131313. Если совпадает, то значит недавно был сброс по BODLEVEL, если нет - значит имеем первое включение после перерыва и надо заново калиброваться. Вероятность того, что после выключения питания в этих ячейках останется определенное значение очень мала. Скорее всего там всегда будут нули.


Там будут не нули, но будут значения определённые. Например 00ff00ff или 0ff0. Короче я так делал ещё на at90s1200. Сохраняются значения, признак и сохраняется CRC на эти значения. При чтении - проверяется признак достоверных данных и если он установлен контролируется CRC.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.