Автор |
Сообщение |
|
Дата: 21 Май 2007 20:39:47
#
Есть девайс на PIC16F84A, есть hex файл прошивки, без исходников. Устройство необслуживаемое, очень часто зависает и требуется постоянный перезапуск его. Подскажите как ввести в прошивку сторожевой таймер?
Дела с ПИКами ранее имел но не до такой степени, только шил...
Если можно, то просвятите по этому вопросу или предложите вариант другим путём делать ресет через MCLR
хардверно (вот только как определять, что девайс повис?)
|
|
Дата: 21 Май 2007 21:01:49
#
Не всё так просто.
Но по файлу можно дизассемблировать, и попробывать проанализировать.
Но с большей пользой надо проанализировать состояние зависшего устройства.
Возможно WATCH_DOG и не нужен, а например, питание проваливается.
|
Реклама Google
|
|
|
Дата: 21 Май 2007 21:20:04
#
Питание стабилизированное. Возможно зависоны происходят при постоянной связи с компом и передаче обновлённых данных на девайс каждую минуту. Вот вэтот момент может повиснуть непредсказуемо (может через час, а может и сутки пахать без зависа). Вот и хотелось циклически перезапускать без участия пользователя автоматом.
|
|
Дата: 21 Май 2007 21:59:28
#
Насколько помню, средствами обычного mplab можно дизассемблировать .hex и далее работать с листингом как обычно. Грамотный программист допишет всё, что нужно для работы WDT, и соберёт программу заново так, чтобы она работала. Если такового полизости нет, лучше программу не трогать.
|
|
Дата: 21 Май 2007 22:04:34
#
Может ошибка передачи.
Тогда нужен не WD, а соблюдение протокола с контролем готовности.
|
|
Дата: 22 Май 2007 22:52:02 · Поправил: Bar_boss (22 Май 2007 22:52:46)
#
Если программа периодически подвисает, и это не связано с проблемами "железa" или питания, то проблемы скорее всего в некорректном написании программы.
А включить WATCH_DOG элементарно даже без дезассемблирования программы - в любом программаторе этот параметр может быть установлен вне кода программы. Например, возьмите IC Prog, загрузите в него hex, и установите галочку напротив WDT. Вот и всё! Кстати, этим программатором можно и дезассемблировать код - для этого есть соответствующая кнопочка на панели управления.
Кстати, если не секрет, а как организован протокол обмена с компом? Видимо RS232? Но в 84-м пике НЕТ аппаратного USARTa, следовательно там его софтовая реализация. Из практики я так и ни разу не видел стабильно работающего програмного USARTa (хотя на истину не претендую). Так что такие устройства, где есть обмен с компом, лучше реализовывать на АППАРАТНОМ USARTе, например взять микроконтроллер 16F628A. По выводам - это 100 процентный аналог. Он отличается от 84-го расположением отдельных регистров и при инициализации необходимо отключить компараторы. Но без исходника, имея только hex, перейти на 628-й будет сложно.
|
|
Дата: 23 Май 2007 00:48:07
#
Bar_boss
Считаю нужным заметить следующее: в рассматриваемой серии МК таймер WDT, привязанный к внутреннему независимому осциллятору контроллера, генерирует сигнал master reset либо wake_up (если МК в состоянии sleep) с периодом 18 ms в случае отключенного прескейлера. В связи с этим для корректной работы сторожевого таймера необходимо периодическое исполнение инструкции CLRWDT, обнуляющей счётчик WDT, в основном цикле программы с периодом, меньшим чем период работы WDT. Именно в добавлении инструкций CLRWDT в соответствующие места кода состоит необходимая правка программы, в противном случае WDT будет генерировать master reset примерно 50 раз в секунду и программа работать не будет.
alexis
Есть один неправильный, но очень простой и дешёвый способ решить Вашу проблему, если Ваша система некритична к периодическим сбоям и перезапускам. Можно просто с определённо периодичностью, например, каждый час, генерировать внешним таймером master reset, для профилактики. Означает ли Ваш вопрос в этой теме http://www.radioscanner.ru/forum/index.php?action=vthread&forum=10&topic=28963 , что Вы решили пойти именно этим путём? |
|
Дата: 23 Май 2007 11:15:34
#
Да, конечно программа без CLRWDT будет периодически сбрасываться. Тогда можно дезассемблировать и разбросать CLRWDT по телу программы.
|
|
Дата: 24 Май 2007 16:36:21 · Поправил: alexis (24 Май 2007 18:11:28)
#
Спасибо огромное за советы, но мне нужен в итоге устойчива работающий необслуживаемы девайс.
Интересно а сторожевой таймер может надёжно справлятся с зависонами? Или всё таки сделать внешний периодический ресет...
По поводу девайса - это RDS кодер для передачи текстовой информации совместно с звуковой для FM вещания. радиостанция у нас необслуживаемая и периодические зависы блока RDS честно говоря уже достали. :(
Далее - обмен данными с компа до девайса идёт через LPT порт (непонятно зачем его применили разработчики). Там три сигнала, два из них это на SCL и SDA (скорей всего данные идут на микруху 24C16, которая связана с ПИКом по этим сигналам и туда же идут сигналы с компа) и сигнал какой то обратной связи (мож готовность какая) на той ножке прицеплен светодиод на землю и он мигает раз в три секунды.
Короче вот инфа, если что-то уточнить надобно пишите...
|
|
Дата: 25 Май 2007 19:09:43
#
To Вяз.
Отправил тебе листинг оригинальной прошивки для PIC16F84. Смотри почту. ;)
|