|
К вопросу о надежности сторожа в AVR, Нужен совет |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 22)
|
Jun 1 2010, 01:26
|
Частый гость
 
Группа: Участник
Сообщений: 97
Регистрация: 24-07-08
Из: Иркутск
Пользователь №: 39 180

|
Цитата(zltigo @ May 31 2010, 19:09)  Смотрите наличие у выбранного чипа сертификата на использование в медицинском оборудовании. Если есть, посылаете всех нафиг. Если нет, то это Ваши проблемы. Добавляете Watchdog и ресетчик. Просто сертификата на микросхему, как бы очень мало. Нужен будет сертификат на все устройство. Это же не кресло с подогревом, для любимого начальника. кого поджарить советуете?
|
|
|
|
|
Oct 4 2010, 11:17
|
Участник

Группа: Участник
Сообщений: 39
Регистрация: 5-10-07
Из: Харьков, Украина
Пользователь №: 31 107

|
Цитата(DVF @ May 31 2010, 09:06)  Предполагается, что люлька ребенка будет подогреваться. насколько надежен AVR в плане надежности работы сторожа? Мне навязывают независимую (дублирующую) схему на компараторе для обеспечения надежности от "вдруг AVR зависнет вместе со сторожем)?" Отсюда вопрос: "В каких случаях может зависнуть cторож?" Подогрев через контакты реле. Столкнулся с ситуацией, когда виснет устройство (на mega32), причем так, что включенный WDT его не ресетит. Уже несколько дней извел на понимание проблемы, но пока безрезультатно. Иногда не виснет, а глючит (однократный сбой). BOD включен, WD включен... Процессор еще не менял, но до сих пор мне сбойные не попадались. Так что я бы советовал ставить внешний супервизор со своим таймаутом и пинать его от ножки проца.
|
|
|
|
|
Oct 4 2010, 12:31
|
Профессионал
    
Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364

|
Цитата Столкнулся с ситуацией, когда виснет устройство (на mega32), причем так, что включенный WDT его не ресетит. В "подвисшем состоянии" код проходит через точку сброса WDT... Цитата Так что я бы советовал ставить внешний супервизор со своим таймаутом и пинать его от ножки проца. Что помешает ему так-же "подвиснуть" как и с внутреним?
|
|
|
|
|
Oct 4 2010, 12:41
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(sbw @ Oct 4 2010, 18:17)  Столкнулся с ситуацией, когда виснет устройство (на mega32), причем так, что включенный WDT его не ресетит. В каком месте программы сбрасываете ватчдог? Надеюсь, не в прерывании?
|
|
|
|
|
Oct 4 2010, 13:26
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579

|
Цитата(Dima_G @ Oct 4 2010, 16:41)  В каком месте программы сбрасываете ватчдог? Надеюсь, не в прерывании? Все прекрасно описано в " Сторожевой таймер!..., быть ему ...или не быть?" http://electronix.ru/forum/index.php?showt...=15187&st=0
|
|
|
|
|
Oct 4 2010, 16:06
|
Участник

Группа: Участник
Сообщений: 39
Регистрация: 5-10-07
Из: Харьков, Украина
Пользователь №: 31 107

|
Цитата(Dima_G @ Oct 4 2010, 15:41)  В каком месте программы сбрасываете ватчдог? Надеюсь, не в прерывании? В прерывании готовности АЦП. Прерывание - freerun. Причем ресетится вочдог после выставления уровня на ноге. В этом же прерывании происходит передача по SPI. // отправить байт по SPI if (data_command == command_) { data_command = data_; if (transfer_address <= max_channel) // если номер канала в пределах массива { PORTB &= ~(1<<packet_control); // ~SS = 0 - начать передачу SPDR = transfer_address; // послать 1й стартовый ноль или адрес } // если за пределами массива - ничего не посылаем } else // data_command = data_ { data_command = command_; if (transfer_address == 0) { SPDR = 0; // второй стартовый ноль transfer_address++; // увеличить номер канала } else { if (transfer_address <= max_channel) // если номер канала в пределах массива { SPDR = ch_levels_address_send [transfer_address-1]; // послать уровень канала transfer_address++; // увеличить номер канала } else // if transfer_address > max_channel { PORTB |= 1<<packet_control; // ~SS = 1, завершить передачу transfer_address=0; ch_levels_address_temp = ch_levels_address_change; // переписать указатели на массивы ch_levels_address_change = ch_levels_address_send; ch_levels_address_send = ch_levels_address_temp; wdt_reset(); // <<<<<<<<<<<<---------- WD reset } } } переменная transfer_address в другом месте не обнуляется, только при старте программы. Состояние после зависа - уровень 1 на ноге выставлен, передачи нет (ни данных, ни клока). Когда происходит просто сбой - то ощущение, что меняется код программы: часть данных передается, а часть - нет. Или будто бы память (в котором хранится массив на передачу) запорота и не обновляется. Цитата(ArtemKAD @ Oct 4 2010, 15:31)  В "подвисшем состоянии" код проходит через точку сброса WDT...
Что помешает ему так-же "подвиснуть" как и с внутреним? если бы проходил - была бы передача по SPI, чего не наблюдается осциллографом. Забыл добавить, что мега работает от внешнего кварца 16мгц. Грешил на него - менял, менял конденсаторы обвязки. Но после того, как переключил на внутренний RC и оно зависло все равно - "опустились руки". Завтра попробую поменять мегу, она "не свежая" была, выпаяна из другого проекта.
|
|
|
|
|
Oct 4 2010, 16:27
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Глупо просто/тупо сбрасывать WDT в прерывании. Сбрасывать WDT нужно только после проверки условия и только при выполнении этого условия. В условии обычно проверяются флаги прохождения критически важных участков кода. Т.е. в разных местах программы взводятся битовые флаги. При проверке условия установки этих флагов WDT сбрасывается только в том случае, если установлены все эти флаги. После сброса WDT сбрасываются и флаги.
|
|
|
|
|
Oct 5 2010, 07:34
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579

|
Цитата(rezident @ Oct 4 2010, 20:27)  Сбрасывать WDT нужно только после проверки условия и только при выполнении этого условия. В условии обычно проверяются флаги прохождения критически важных участков кода. Т.е. в разных местах программы взводятся битовые флаги. При проверке условия установки этих флагов WDT сбрасывается только в том случае, если установлены все эти флаги. После сброса WDT сбрасываются и флаги. Используется для диагностики при зависании, чтобы выявить место глюка?
|
|
|
|
|
Oct 5 2010, 12:32
|
Профессионал
    
Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364

|
Цитата В случае зависания МК (который и генерирует эту частоту) либо при отгорании порта, на входе будет одно из стабильных состояний 1 или 0. Реле отключится. Шас.... МК не зависает полностью - он исполняет некий участок кода который вполне может продолжать генерить. 2) Надежность МК на порядок выше надежности реле. Подобная "защита" - хорошо разложенные грабли....
|
|
|
|
|
Oct 5 2010, 14:22
|
Профессионал
    
Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364

|
Цитата Выограли порты. Да, порты выгорали... После того, как выгорали буфера к которым они подключены.  Иногда выгорали с половиной платы в прямом смысле слова.... Цитата По моему Вас понесло с надежностью . Мне кажется вероятность появления НЛО на Тверской с пьяными тетками в тарелке намного выше. Самопроизвольных зависаний МК (без учета корявых рук) за 5 лет у меня не было. А я даже не знаю было или нет... Но то, что на нескольких десятках тысяч моих изделий на которых никогда небыло кнопки "Reset" никто за десять лет не заметил зависания - 100%... Причем выключателей питания там так-же обычно не предусматриваю...
|
|
|
|
|
Oct 5 2010, 15:18
|
Участник

Группа: Участник
Сообщений: 39
Регистрация: 5-10-07
Из: Харьков, Украина
Пользователь №: 31 107

|
Цитата(ArtemKAD @ Oct 5 2010, 13:54)  Может быть и обратная ситуация - WDT может не дать запуститься процу постоянно сбрасывая его в самом начале программы. Иногда это связано с не корректной оптимизацией кода компилятором(смотреть полученый код)... не, тогда бы светодиод мигал - между моментом сброса, когда порты отключены от нагрузки, и моментом инициализации порта, когда на него выставляется "1" для светодиода, должно проходить время тайм-аута WDT. А он горит постоянно.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|