Форум » Программирование микроконтроллеров. » Сторожевой таймер WDT » Ответить

Сторожевой таймер WDT

Дмитрий2212: Подскажите пожалуйста где-то на форуме видел тему посвященную WDT, а найти сейчас не могу.Если правильно понимаю для его работы необходимо следующее: -включить его -поставить перед ним предделитель (если нужно) и все При его переполнении происходит сброс на нулевой адрес РС и все? Если есть еще какието моменты прошу помочь разобраться.

Ответов - 30

MAZ: В программе разбросать сброс clrwdt, чтобы гарантировано сбросил до срабатывания таймера.

Дмитрий2212: Да, спасибо MAZ это я понимаю

Дмитрий2212: Изменяется ли содержание регистров общего назначения при сбросе WDT


Evgeny Korabelnikov: Изменяется ли содержание регистров общего назначения при сбросе WDT Если рассуждать в общем виде, то в регистрах общего назначения оперативно сохранятся те состояния, которые присутствовали на момент начала этого вида сброса. Если речь идёт о регистрах общего назначения, которые задействованы в программе, то в них сохранятся те состояния, которые "выставила программа" на момент начала этого вида сброса. Естественно, что в процессе дальнейшего исполнения программы, от своего начала (то есть, после WDT-сброса), эти значения могут так или иначе измениться (как именно, зависит от логики программы). Если речь идёт о регистрах общего назначения, которые не задействованы в программе, то в них сохранятся те случайные значения, которые "выставлены" в результате текущей инициализации ПИКа. В большинстве случаев, состояния регистров общего назначения, которые присутствуют на момент WDT-сброса, не важны (за исключением выхода, по срабатыванию WDT, из режима SLEEP), так как программа исполняется от своего начала, но могут быть и "спецслучаи" (мне пока ни один такой не попадался). В случае выхода из SLEEP по факту срабатывания WDT, перехода на начало программы не происходит, а вместо этого, программа исполняется далее (от того "места", из которого произошёл "уход" в SLEEP).

Дмитрий2212: Спасибо за ответ. Меня интересует ,например такой случай; Некое подчиненное ПИКу устройство включается и выкл по стробу (импульс подали ---включилось по следующему импульсу выключилось) Если происходит сброс WDT т.е устройство было включено оно выключится. Избегая этой ситуации я устанавливаю бит в регистре общего назначения ( бит вкл устройства), и перед подачей импульса на вкл проверяю его, но тогда в начале программы я не могу обнулить этот регистр.Как решаются такие прблемки

igor: Лично я не понял суть вопроса. Шире можно обрисовать ситуацию? Под сбросом WDT понимается переполнение сторожевого таймера?

Дмитрий2212: Ну да ,переполнение.Неправильно выражаюсь .Точнее сказать срабатывание WDT.После замечания сам понял что написал глупости. Некое подчиненное ПИКу устройство включается и выкл по стробу (импульс подали ---включилось по следующему импульсу выключилось) Если происходит переполнение WDT т.е устройство было включено оно выключится. Т.е в начале программы включается, а при переполнении WDT программа снова на старт и соответственно опять подаст импульс который не нужен. Избегая этой ситуации я устанавливаю бит в регистре общего назначения ( бит вкл устройства), и перед подачей импульса на вкл проверяю его, но тогда в начале программы я не могу обнулить этот регистр.Как решаются такие прблемки

igor: Я понимаю ситуацию так. Работают два устройства. Одно управляет другим(ведущее и ведомое). По каким то причинам, произошёл сброс программы ведомого устройства на начало( переполнение WDT, пропадание питания и т.д.) Как сделать так, чтобы ведомое устройство после сброса, автоматом перешло в то состояние, в котором оно находилось до сброса? Я вижу здесь два пути. 1. Записывать в EEPROM ведомого устройства байт состояния. Например 1 - вкл., 2 - выкл. Это нужно делать каждый раз при получении команды от ведущего. И при старте после сброса проверять этот байт. Но если, команды вкл/выкл подаются очень часто, то в этом случае, можно быстро выработать ресурс стирание/запись в EEPROM. Количество циклов стирание/запись ограничено. 2. Записывать бит состояния не в EEPROM а во FLASH - память. Это гораздо выгоднее. Но опять же, смотря с каким контроллером Вы работаете. Некоторые не допускают возможности такой записи.

Дмитрий2212: Да спасибо.Так это себе примерно и представлял.

igor: Ещё одна мысль посетила. Если переключения происходят не очень часто, то можно на свободный порт повесить ёмкость через резистор. В начале программы, этот порт работает на вход. А в основном теле программы он работает на выход. Суть такая. Если ведомый получил команду ВКЛ., то порт устанавливаем в "1" - ёмкость при этом заряжается до напряжения питания. Если ведомый получил команду ВЫКЛ., то порт устанавливаем в "0" - ёмкость при этом разряжается. Т.е. ёмкость является элементом памяти. Теперь, если по каким то причинам произошёл сброс на начало программы, то мы в начале программы, опрашиваем порт к которому подключена ёмкость. Если "1", то ВКЛ., если "0" то ВЫКЛ.

Дмитрий2212: Может чуть чуть не понял,нужен строб длительностью 1с.Раз подали вкл,второй раз --выкл.Переключения в принципе не происходят за все время работы ( за исключением аварийных режимов,сброс подчиненного устройства при зависании, за этим следит программа ведущего устройства).Вопрос решить проблему при срабатывании WDT ведущего ПИКа.Как грамотно построить программу чтобы наверняка после выхода на начало определить состояние ВКЛ\ВЫКЛ

magistr000: Дмитрий2212 пишет: Как грамотно построить программу чтобы наверняка после выхода на начало определить состояние ВКЛ\ВЫКЛ Записи в eeprom/flash не помогут - они не атомарные. Самый простой способ - устройство сигнализирует свое состояние. Т.е. включили устройство и оно подало на вход пика сигнал, выключили - сняло сигнал. Таким образом пик всегда будет знать включено устройство или нет (подавать следующий импульс или нет)

Evgeny Korabelnikov: Вариант (в детали не вдавался. Рассуждаю в общем виде. Авось поможет. А если не поможет, то всё-равно пойдёт на пользу). Можно использовать бит регистра STATUS с названием -TO (флаг переполнения WDT. Он имеет инверсное значение, так как перед названием бита есть "-"). После инициализации ПИКа -TO = 1, а в случае WDT-сброса, он устанавливается в 0. В начале ПП START организуется проверка его состояния. Если 1, то программа исполняется далее. Если переполнение WDT (-TO = 0), то "закольцовка" в "плавающей, кнопочной" задержке, в цикл которой входит команда clrwdt (она устанавливает бит -TO в 1). Вплоть до нажатия/отжатия кнопки "Вкл" (или "Пуск", или "Возобновление работы", или с другим названием). Естественно, что вместо "пинка", способствующего выходу из "закольцовки", можно использовать не кнопку, а что-то ещё.

Илья: в регистре STATUS есть 4 бита, по которым можно определить из-за чего попали в сброс. Если делать по уму, то должно быть примерно так: Если был сброс по питанию (включение устройства), то делать инициализацию периферии, нужных регистров и переменных (правильнее чистить RAM и нужное инициализировать), и далее идем (условно) на START Если сброс по WDT, то (значения портов и переменных в правильном состоянии) пропускаем инициализацию и идем на START Если сброс по MCLR, то ... Возможны варианты. Например, программа выполнена в виде автомата состояния (есть некое состояние устройства в которое поподаем после неких а)манипуляций с кнопками, б)временных интервалов, в) и пр.), то в этом случае при "стандартном" способе после WDT вы бы попали на СБРОС, проинициализировали программу и остались бы в исходном состоянии. и "начинай все сначала" - жми кнопки и попадай в куда нужно. Если анализировать причину попадания на адрес СБРОСа, то вы можете быстро ускакать туда где были до сброса без внешних проявлений как для периферии, так и для пользователя. Т.е. принимая во внимание что при WDT ни порты ни переменные не изменились уйти на нужную ветку программы. Если просто втупую хранить состояние системы в некой ячейке RAM, то по сбросу (POR) состояние RAM в общем случае не определено, и возможно, что там окажется значение по которому вы примете решение что был не POR, а WDT и предпримите неверные действия. Итого. Используйте ресурсы МК, которые специально реализованы для этого.

Evgeny Korabelnikov: Илья, чую что в сути (а это главное) Вы разбираетесь, но все-таки хочу уточнить. Если речь идет о ПИКах среднего семейства, то судя по соответствующему справочнику, в регистре STATUS "дислоцируется" не 4, а 2 "сбросовых" бита (-TO и -PD. См. стр.5-6), а остальные "сбросовые" биты "дислоцируются" в регистре PCON (см. стр.5-8). Если речь идет о ПИКах 18-й серии, то в регистре STATUS вообще нет "сбросовых" битов. Они "передислоцированы" в регистр RCON (см. стр.50 и стр.79 даташита PIC18Fxx2). То, что по факту изменения состояния флага (любого), можно "сигануть туда, куда нужно" (условно), не вызывает никаких сомнений. Весь вопрос в том, чтобы грамотно (и в нужном "месте") организовать соответствующую проверку и "сигануть именно туда, куда нужно". Если Вы желаете, чтобы Вас наиболее эффективно поняли НАШИ мужики, советую воздержаться от употребления такого широкого понятия как "переменные" (я этим понятием принципиально не пользуюсь), ведь ими может быть всё, содержимое чего можно изменить. Если речь идет об оперативной памяти, то это содержимое регистров специального и общего назначения. Если речь идет об энергонезависимой памяти, то это содержимое ячеек EEPROM-памяти данных и Flash-памяти программ. Согласитесь со мной, что понятийное "сваливание" всего этого в одну "кучу" вовсе не способствует эффективному взаимопониманию. На мой взгляд, можно/нужно "плюнуть" (условно) на "стереотипные упрощения" и изъясняться как можно более конкретно/детально. Истинные "хулиганы" (то есть, наиболее "жизнеспособные") владеют этим в совершенстве (этому нужно капитально учиться). Понимаю, что это очень хлопотно/трудоёмко, но если Вы желаете чтобы Вас по-настоящему поняли/оценили, то альтернативы этому просто нет. Ещё раз спасибо за то, что с Вашей помощью, многие из НАШИХ заимели и вовсю пользуются PicKit2 (мы добро помним). Искренне желаю Вам успехов.

Илья: да, чуть сумбурно выразился под переменными имел в виду те данные, которые располагаются в РОН. Да, 4 бита статуса сброса это обычно 2шт в STATUS и 2шт в PCON у нового семейства PIC16F1xxx их есть аж 8 штук (2 в STATUS и 4 в PCON: сброс из-за переполнения/опустошения стека, сброс по выполнению инструкции RESET, -RMCLR, -POR, -BOR, -TO, -PD) Но смысл не в том где конкретно и что лежит, а в том как пользоваться. Для топикстартера, надеюсь, наш разговор будет полезным. Еще. Не соглашусь с высказыванием, что нужно разбросать clrwdt по программе. Цель WDT не в том чтобы его сбрасывать где не поподя, а предотвратить случайные зависоны (в данном случае не рассматриваю штатную возможность просыпания из Sleep по WDT и другие случаи обдуманного сброса по WDT). Программа не должна сбоить вообще. Когда программа отлажена и не сбоит, тогда имеет смысл включить WDT для аномальных случаев. А то встречаются случаи когда с помощью WDT пытаются вылечить кривую программу. Но это тема отдельного обсуждения.

Дмитрий2212: Программа отлажена и работает, но в состав схемы входят элементы которые создают сильные помехи. Кроме того считаю что зависание программы и зависание ПИКа разные вещи.Если "постараться" то программа зависнет и с включенным WDT. Хотелось бы черпануть какую-то информацию о построении помехоустойчивых цепочек например по выходу MCLR.а также по разводке плат.

Sergey Roslik: Это вам надо в раздел "Обмен информацией и идеями", там обсуждаются защиты от помех. http://pic.borda.ru/?1-14-0-00000034-000-0-0-1273743722 http://pic.borda.ru/?1-14-0-00000051-000-0-0-1274800742

Evgeny Korabelnikov: И на форуме при сайте Виталия Антонова (ссылка на него есть на главной странице моего сайта. Работаем "в связке") кое-что тоже есть. Я там предложил, пока не реализованный на практике, довольно-таки "экзотический" (условно) способ борьбы с короткими, импульсными помехами, "проскакивающими" по Uпит., с использованием модуля LVD (он есть в ПИКах 18-й серии). Ну а самый лучший способ борьбы с электромагнитными помехами (наводками от "того-сего". Условно) - качественное экранирование.

Дмитрий2212: Благодарен ВСЕМ. Огромное СПАСИБО за информацию.

Evgeny Korabelnikov: Дмитрий, рад, что сказано СПАСИБО. Ради этого и работаем. Ну а это в развитие темы ПИК-помехоустойчивости. Постараюсь объяснить как можно проще (в приложении только к помехам по Uпит.). Просьба не придираться, так как тема довольно-таки сложна и "скользка" (пусть я и буду "камикадзе", лишь-бы была польза для Вас). В подавляющем большинстве случаев, помехи, по Uпит., представляют собой "пачку всплесков" (проще говоря, дребезг, в основном, аналогового характера), наиболее "выдающаяся" (по амплитуде и длительности) часть которых может привести к MCLR-сбросу или ещё к каким-то "бякам". По длительности этих "всплесков" (они имеют достаточно широкий спектр. Напоминаю про Фурье), их можно условно проклассифицировать так: - "короткие всплески", - "средние всплески", - "длительные всплески". "Короткие всплески" эффективно "давятся" ВЧ-конденсаторами относительно небольшой ёмкости. "Длинные всплески давятся" электролитами, а также и за счёт "срабатывания" кольца отрицательной, обратной связи стабилизатора. А вот со "средними всплесками" имеются проблемы, так как они эффективно не "давятся" упомянутым выше. Мотивация: ВЧ конденсаторы для этого "слабоваты", электролиты их пропускают и любой стабилизатор инерционен. Вот и получается "геморрой". На мой взгляд, самый эффективный выход из этого "интересного положения" - "штатное" подключение ВЧ-конденсаторов, в комплексе с задействованием достаточно малоинерционного (имеется ввиду его "реакция" на понижение Uпит., если источник опорного U стабилизировался) модуля LVD (детектор пониженного U, "порог" которого можно назначить в достаточно широком диапазоне U). Если LVD срабатывает, то происходит быстрое изменение состояния соответствующего флага и по факту этого, можно организовать уход в ПП прерывания (а можно организовать и достаточно частые проверки этого флага в "основном теле". Зависит от конкретики), в которой происходит отключение выхода стабилизатора и переход на "запитку" ПИКа (его "периферию", если она много "кушает", можно запитать и от "бяки") от энергии, "запасённой" в выходном (по отношению к стабилизатору) электролите сглаживающего фильтра. Если его ёмкость достаточно велика и он качественен, то ПИК, вплоть до следующей стабилизации источника опорного напряжения модуля LVD, "запитывается" от энергии электролита. Естественно, что в интервале времени этой "электролитозапитки", Uпит. ПИКа будет постепенно понижаться, но это понижение можно минимизировать увеличением ёмкости электролита. После стабилизации источника опорного U, стабилизатор автоматически подключается к ПИКу. Если после этого LVD опять сработал, то всё повторяется снова (энергия, запасенная в электролите, должна быть достаточной для того чтобы "переждать пачку всплесков/дребезга"). До тех пор, пока LVD перестанет срабатывать ("бякопачка прошла"). После этого, выход стабилизатора долговременно подключается к электролиту, и он, в течение достаточно короткого времени, полностью заряжается ("'энергопотери восполняются"), после чего, он готов к "достойному восприятию" следующей "бякопомехопачки" (или отдельной 'бяки"). "В сухом осадке", эффективная "фильтрация/сглаживание всплесков" (по Uпит.). А то, что "просочилось" ("короткие всплески" могут "проскочить"), "задавит" блокировочный ВЧ-конденсатор (или конденсаторы). Под словом "эффективная" подразумевается то, что Uпит. ПИКа, даже кратковременно, не опускается ниже порогового (между 1 и 0) уровня используемой логики (например, 5-вольтовой), и Uпит. ПИКа, при любом "раскладе", выше того уровня, который гарантирует его нормальную (условно) работу. Естественно, что в случае использования модуля АЦП, источником опорного напряжения которого программно выбрано Uпит. ПИКа, будут погрешности соответствующих измерений, но во-первых, их можно минимизировать увеличением ёмкости электролита, а во-вторых, имеется множество устройств, в которых модуль АЦП не используется (Uпит. ПИКа не критично, лишь бы оно не было ниже "порога" аппаратного нарушения работоспособности устройства). В конце концов, можно выбрать значение опорного АЦП-напряжения ниже Uпит. ПИКа и предпринять меры по его "слаботоковой" стабилизации (такие микромощные стабилизаторы есть). Успешная "кульминация" всего этого "словоблудия" такая ("мечта поэта", кстати, реализуемая): кнопка, с нормально замкнутыми контактами, включена в разрыв "проволочины", посредством которой подаётся питание на вход стабилизатора. На устройство подаётся Uпит. и оно "зафунциклировало как положено". Далее, кратковременное нажатие/отжатие этой кнопки (напоминаю про дребезг контактов), а "железяке хоть бы хны" (по-фигу). Как работала, так и продолжает работать (автолюбители, это в первую очередь для Вас. Напоминаю про стартер и т.д.). Это и есть идеал (условно) ПИК-помехоустойчивости по Uпит. Кстати, совсем не хилый ("шапками не закидаешь"). Надеюсь на то, что это будет эффективно реализовано на практике, причём, в НАШЕЙ среде. Я только высказал робкую (с надеждой на понимание) идею. Она может быть "кривая", "косая", "хромая", "сырая" или ещё какая-то (вплоть до идиотской), но на мой взгляд, лучше наличие хоть каких-то идей (а также и "генераторов идей/таранов"), чем их отсутствие. Вообще-то, исключительно важная, "стратегическая" тема ПИК-помехоустойчивости "дислоцируется" в закрытой части форума. Просьба к заинтересованным в ее более детальном обсуждении, перейти в нее. Лично я, в открытой части форума, далее, сообщений, по этой теме, оставлять не буду. И не потому, что гад (а также и Карабас Барабас, и т.п.), а потому, что это слишком важно и эта инфа предназначена, в первую очередь, для НАШИХ. Полагаюсь на модераторов. Они мужики грамотные и с опытом. Решат что к чему без моего участия.

Dimon_74: Evgeny Korabelnikov пишет: Вообще-то, исключительно важная, "стратегическая" тема ПИК-помехоустойчивости "дислоцируется" в закрытой части форума. Просьба к заинтересованным в ее более детальном обсуждении, перейти в нее. А почему я не могу зайти в эту часть форума. У меня например тоже такие проблемы с помехоустойчивостью возникают. Ставил и конденсатор на входе трансформатора (высокая сторона), и ферриты тоже (на высокой и низкой стороне трасформатора). Ну, зависания прекратились, но не плностью. Один раз из тридцати включений происходят.

MAZ: Dimon_74 пишет: А почему я не могу зайти в эту часть форума. Вам надо вступить в сообщество и стать "постоянным участником". Условия по ссылке вверху, на сайте КЕА.

magistr000: Dimon_74 пишет: У меня например тоже такие проблемы с помехоустойчивостью возникают. http://caxapa.ru/lib/emc_immunity.html

igor: То, на что дал ссылку magistr000, конечно не является панацеей от всех бед связанных с помехами, но принять к сведению стоит.

DerSpiwak: magistr000 пишет: http://caxapa.ru/lib/emc_immunity.html Отличная статейка

igor: DerSpiwak пишет: Отличная статейка Ссылка на эту статейку уже висит на форуме с 12.12.08 (полтора года). В теме "ЗАЩИТА PIC-ОВ ОТ СИЛЬНЫХ ЭЛЕКТРОМАГНИТНЫХ ПОМЕХ". Сообщение №1 от vas38.

DerSpiwak: igor пишет: Ссылка на эту статейку уже висит на форуме с 12.12.08 (полтора года). В теме "ЗАЩИТА PIC-ОВ ОТ СИЛЬНЫХ ЭЛЕКТРОМАГНИТНЫХ ПОМЕХ". Сообщение №1 от vas38 Ну и что? Тем более в закрытой части форума висит. Менее интересной она от этого не стала. Не понимаю, как расценивать Ваше сообщение.

igor: Всё новое это хорошо забытое старое. Америку и по сей день открывают.

DerSpiwak: igor пишет: Всё новое это хорошо забытое старое. Америку и по сей день открывают. 2+2=4. Банально не правда ли? Для кого то этот материал будет действительно чем то новым и полезным, независимо от того когда это все было написано и сколько провисело в какой то там теме закрытой части форума.



полная версия страницы