|
Сохранение важных переменных в EEPROM при потере питяния |
|
|
|
Feb 8 2012, 13:05
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 20-11-09
Из: Ставрополь
Пользователь №: 53 756

|
Бодрого дня всем форумчанам. В моем проекте (на Mega640) требуется в момент пропадания общего питания сохранять 5-6 байт оперативной информации в еепром, дабы иметь возможность при подаче питания благополучно их считывать. Аппаратно для этих целей использую встроенный компаратор с внешней опорой (REF192) и делитель по питанию. В программе ставлю прерывание на компаратор, ну и пишу в еепром. Схема питания такая: +24-->+12-->diode-->condencator 2200 uF-->+5. При пропадании +24 схема детектирует просадку, вызывается прирывание. Конденсатор 2200 мкФ думаю достаточен, чтобы успеть записать в память до снижения питания ниже критического уровня. В железе показывает достаточно устойчивую работу (в лаб. условиях). Хочется услышать мнения по такой реализации, а также может нужно еще что-то в код добавлять если после успешной записи остается время (может нужно ожидать с ноги выхода компаратора смену уровня, если это была кратковременная просадка питания).
|
|
|
|
|
Feb 8 2012, 13:13
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(ATMExpert @ Feb 8 2012, 17:05)  Конденсатор 2200 мкФ думаю достаточен Это лучше подсчитать, чтобы иметь уверенность. Возможно, лучше будет перенести конденсатор на +24 или +12, если там нет мощных потребителей, ибо U^2. Цитата(ATMExpert @ Feb 8 2012, 17:05)  может нужно еще что-то в код добавлять если после успешной записи остается время (может нужно ожидать с ноги выхода компаратора смену уровня, если это была кратковременная просадка питания). Можно, только с длительным debouncing'ом от греха.
|
|
|
|
|
Feb 8 2012, 13:36
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(ATMExpert @ Feb 8 2012, 16:05)  ... если после успешной записи остается время ... Я бы ждал время за которое кондёр по питанию должен точно разрядиться. Если этого не происходит, значит "фигня" с питанием, и в этом случае вижу 3 варианта дальнейших действий: 1. ничё не делаем и работаем дальше. 2. уходим на програмный сброс. 3. "радостно" сообщаем о плохом питании с дальнейшим п1 или п2. Ну и BOD мк обязательно должен быть включён.
|
|
|
|
|
Feb 8 2012, 16:06
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 20-11-09
Из: Ставрополь
Пользователь №: 53 756

|
Кондер стоит по 12 вольтам. от этой же напруги питается dc-dc на 5 вольт(Мега и логика). А диод после +12 стоит, он и отсекает всю нагрузку по этой линии питания. BOD стоит внешний вместе с WDT. Я мог проверить факт попадания в процедуру прерывания тупо уменьшая входное питание от БП. Делитель расчитал вроде верно с достаточным запасом. При 19 вольтах появляется сработка. Вот п/п от компаратора: Код __interrupt void MainPowerFail(void) { asm("cli"); if ((!drv_pan.drv_on)&&(!drv_tilt.drv_on)) // если тока приводы не включены - значит можно сохранить, а иначе нет смысла {Wr_Ee_Int((int)&PanFailPos, drv_pan.pos_pan); //сохраняем данные Wr_Ee_Int((int)&TiltFailPos,drv_tilt.pos_tilt); Wr_Eeprom((int)&ErrorFlag, (SYSTEM_STATUS|POS_SAVED)); while (bit_is_set(ACSR, ACO)){} //ждемс пока питание не восстановится } } Так можно решить задачу ожидания восстановления питания?
|
|
|
|
|
Feb 8 2012, 16:25
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 20-11-09
Из: Ставрополь
Пользователь №: 53 756

|
Дык вот этой строчкой и жду вроде как:
while (bit_is_set(ACSR, ACO)){} //ждемс пока питание не восстановится Ну а если не восстановится...на сем и заканчиватся работа...
Жаль я прознал о Ramtron'e недавно. Интерфейсы в трех вариациях имеются: parall, spi i2c. По моему - наиболее идеальное решение, не считаете так?
|
|
|
|
|
Feb 8 2012, 16:31
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 20-11-09
Из: Ставрополь
Пользователь №: 53 756

|
Цитата(aaarrr @ Feb 8 2012, 20:27)  В том-то и дело, что не ждете: ждать нужно не единичного события на выходе компаратора, а нормального уровня в течение достаточно длительного времени. Иначе есть шанс вылететь совсем не вовремя. Т.е. дебоунс однозначно? Тогда в этот цикл ожидания задержку милисек так на 100 и повторно зырить состояние ноги?
|
|
|
|
|
Feb 8 2012, 16:44
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(ATMExpert @ Feb 8 2012, 20:31)  Т.е. дебоунс однозначно? Без него получится потенциальный источник проблем: если компаратор начнет болтаться (а кто его знает, как себя может повести питание при аварии?), то можно легко испортить запись в EEPROM. Цитата(ATMExpert @ Feb 8 2012, 20:31)  Тогда в этот цикл ожидания задержку милисек так на 100 и повторно зырить состояние ноги? Не задержку, а постоянно на протяжении 100 миллисекунд смотреть линию. Процессору все равно в это время больше нечем заняться.
|
|
|
|
|
Feb 8 2012, 17:48
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 20-11-09
Из: Ставрополь
Пользователь №: 53 756

|
Цитата 1. Что мешает сразу сохранять данные в EEPROM? 2. Будут ли актуальны эти данные после , например , часа простоя системы? 3. После диода стоит стабилизатор на 5 В? 1. Данные - это по сути текущие координаты привода (вертикаль и горизонт). Их имеет смысл сохранять только когда привод стоит на месте, иначе если во время движения привода пропадет питание, актуальность их в еепроме никакая, т.к. любой привод имеет некую инертность и не сразу остановится. Мы используем шаговые движки без обратной связи (без энкодеров). 2. Само собой данные будут актуальны через любое кол-во времени. 3. Да, после диода стоит стаб. 5 вольтоф Цитата Т.е. при повышении питания происходит ложная сработка? Нет, сработка происходит при понижении питания, и как уже отмечалось, в п/п прерывания от компаратора сидим и ждем пока либо питание не восстановится, либо ждем конца света))) aaarrr, твои подсказки по ожиданию выхода(невыхода) из обработки прерывания применю обязательно, спасибо! А никто и не сказал кстати, применяли ли в проектах ферроэлектрик энергонезвисимую мемори от Рамтрона?
|
|
|
|
|
Feb 8 2012, 18:04
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(ATMExpert @ Feb 8 2012, 21:44)  1. Их имеет смысл сохранять только когда привод стоит на месте, иначе если во время движения привода пропадет питание, актуальность их в еепроме никакая, т.к. любой привод имеет некую инертность и не сразу остановится. Мы используем шаговые движки без обратной связи (без энкодеров). 2. Само собой данные будут актуальны через любое кол-во времени. Вы не находите в своих словах не стыковку. Вы не знаете точно , что произошло после последних сохранённых данных.Т.е. после вкл. питания и до его внезапного отключения произошли события изменившие настройку приводов или они находились в движении в этот момент. Но у Вас в EEPROM остались старые данные. По существу Вы не знаете в каком положении находится привод. Не проще сделать -запись EEPROM затем делать шаг двигателя , запись - шаг. Так у Вас всегда есть координаты привода +/- шаг 3. Цитата Да, после диода стоит стаб. 5 вольтоф Лучше до диода
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Feb 8 2012, 19:10
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 20-11-09
Из: Ставрополь
Пользователь №: 53 756

|
Цитата(ILYAUL @ Feb 8 2012, 22:04)  Вы не находите в своих словах не стыковку. Вы не знаете точно , что произошло после последних сохранённых данных.Т.е. после вкл. питания и до его внезапного отключения произошли события изменившие настройку приводов или они находились в движении в этот момент. Но у Вас в EEPROM остались старые данные. По существу Вы не знаете в каком положении находится привод. Не проще сделать -запись EEPROM затем делать шаг двигателя , запись - шаг. Так у Вас всегда есть координаты привода +/- шаг Представляете на сколько хватит еепром если в нее писать после каждого шага? До внезапного отключения питания может происходить что угодно. При норм. питании текущие координаты лежат в ОЗУ, верно? Верно. Факт пропадания питания фиксируется? Еще как! Так вот если привод в этот момент вращался, то нет нужды сохранять эти координаты. После такого режима проводится рекалибровка привода по крайним положениям однозначно. А вот если привод стоял в это время, мы и запишем то, где он остался стоять. Ну а после подачи питания нагло прочтем сохраненное, и мы в корректных координатах. В след. версии поставлю FM25xx или FM24xx. В нее хоть можно смело писать каждый раз после команды стоп.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|