Андрей Смирнов
Время чтения: ~14 мин.
Просмотров: 14

Универсальный сторожевой таймер на ATtiny13

b6a475.jpg С обратной стороны ничего интересного: только дорожки, соединяющие три переходных отверстия с пинами модуля. Да не очень качественно отмытый флюс:32fbb9.jpg Модуль построен на базе далласовского чипа DS1232. Для тех, кто привык читать официальную литературу, вот даташит. Чип обеспечивает сразу три функции: мониторинг питания, сторожевой таймер и формирование правильного импульса Reset (нужных фронтов, амплитуды и длительности), даже при дребезге контактов ручной кнопки перезагрузки.Коротко и сжато о назначении выводов чипа Продавец услужливо опубликовал схему модуля и его разводку:

Как видим из схемы, линии чипа ST, RST и /RST выведены, как одноимённые, и на пины модуля. Производитель предоставил нам самое лояльное и комфортное включение чипа: максимально широкий коридор питающих напряжений (от 4,5 до 5V) и максимально возможный таймаут сторожевого таймера (1,2 секунды). Теперь становится понятной схема подключения модуля к нашей условной ардуине: — линии Vcc и Gnd на модуле подключаются к двум одноимённым линиям на arduino; — линия /RST на модуле подключается к пину RST на ардуине — линия ST подключается к любому свободному пину, желательно без аппаратного ШИМ, — допустим, у меня это пин 2. Набросаем простенький скетч для проверки модуля. Я (исключительно для наглядности) при инициализации программно мигаю встроенным светодиодом. Этого можно было не делать, светодиод мигнёт и без нас. Но так — нагляднее и понятнее новичкам. При значении задержки 1150 миллисекунд (в моём конкретном случае) или меньших, наша ардуина спокойно крутится в рабочем цикле, ей ничто не мешает. Светодиод, мигнув вначале, не светится — перезагрузок нет. Как только мы увеличим эту задержку хотя бы до 1200 миллисекунд (или внесём значительную задержку в процедуру Setup), мы увидим, что светодиод начнёт циклически вспыхивать: время для собаки становится критическим и она перезагружает ардуину. В реальных же условиях рабочего скетча, достаточно внести строчкув самый конец основного цикла, чтобы сторожевой модуль, подключённый к пину 2, чувствовал себя спокойно. При инициализации ардуины все пины передёргиваются, поэтому собаке абсолютно всё равно, на каком логическом уровне зависло устройство: таймер был запущен и, значит, перезагружающий импульс неминуемо придёт.Выводы. 1. Нужен ли сторожевой таймер в принципе? Если в проектируемом вами устройстве зависания могут привести к негативным последствиям, то да. С ним система будет, очевидно, более устойчивой, чем без него. 2. Является ли внешний сторожевой таймер панацеей? Конечно, нет. Он более эффективен, чем внутренний, имеющийся во многих микроконтроллерах, но и он не панацея. Для достижения максимальной эффективности его работы, важно его подключить в правильное место вашей системы. Лучше не подключать его к линиям, на которых сигналы формируются аппаратно (ШИМ, различные аппаратные порты со стробами), а также к сигналам внешнего или внутреннего тактового генератора. Ну и абсолютно бессмысленно подключать его к линиям, работающим на вход — так мы будем контролировать не свой микроконтроллер, а что-то другое. 3. Есть ли минусы у этого сторожа? Главным минусом внешнего сторожевого таймера, в общем случае, является потребность в выделении для его работы одного пина на вашем устройстве. Хотя на практике, этого очень часто удаётся избежать: если ваш микроконтроллер что-то постоянно пишет или рисует на дисплее, что-то постоянно посылает в порты, формирует какие-то управляющие импульсы для внешних устройств — подключайте сторожевую собаку к этим линиям, — ей абсолютно безразличны частота и скважность импульсов, ей лишь бы была постоянная движуха. Главным минусом конкретно этой реализации таймера я назову, пожалуй, довольно короткий контрольный таймаут. Бывают случаи, когда хотелось бы иметь запас хотя бы в 3-5 секунд. 4. Надо ли покупать именно этот watchdog? Ну, каждый решит для себя. Сторожевую собаку, совершенно точно, можно получить дешевле $3. Кому-то проще купить один лишь только обозреваемый выше чип и с помощью ЛУТ сделать такой модуль самому. Кому-то проще взять легендарный 555 и сделать сторожевой таймер на рассыпухе: плюсы — дёшево и доступно, минусы — больше возни и времязадающие электролитические конденсаторы, а, значит, с годами гарантированно поплывут все параметры. Кому-то проще сделать одновибратор с таймером вообще на полупроводниках. Тут каждый решает сам. Здесь же за вполне посильные деньги мы получаем полностью готовое и рабочее устройство с нормированными параметрами. Так что резонность покупки каждый оценит самостоятельно. Моей же задачей было рассказать о таких устройствах, о принципах их работы и, возможно, дать кому-то творческий импульс для самостоятельного построения новых интересных самоделок. Никто ничего не предоставлял и не спонсировал, всё куплено на свои.UPD: Пока писал обзор, продавец неожиданно поднял цену. Упс. Будем считать это временным приступом жадности. На этот товар у него периодически бывает скидка. Ну и ничто не мешает искать этот товар у какого-то другого продавца. ГлавнаяПрограммирование AVRAVR Урок 53. Watchdog Timer (WDT). Часть 1

&nbsp

&nbsp

&nbsp

Уже более года мною не публиковалось уроков по контроллерам AVR. На это были различного рода причины.

Во-первых, я считал, что основные виды периферии и прочих составляющих данного контроллера нами уже изучены.

Во-вторых, у меня не было и нет нормального программатора, который бы виделся в среде разработки полноправно. Уроки без этого снимать можно, но готовить проекты для них, поверьте, очень тяжело.

В-третьих, с выходом более современных контроллеров интерес к данным контроллерам упал, хоть и незначительно, но всё же это есть.

Несмотря на это, я всё же, взвесив все «за» и «против», всё же решил ещё раз попытать счастья и выложить пару уроков (пока пару, а там посмотрим, как дело пойдёт) по данным микроконтроллерам.

Что же всё-таки сподвигло меня на данный шаг?

Во-первых, многочисленные просьбы посетителей моего ресурса, а также просьбы в личных сообщениях.

Во-вторых, новый хозяин данного семейства контроллеров Microchip, включил эти контроллеры в свою среду разработки MPLAB X, что позволит нам теперь обойтись сразу на два семейства одной средой разработки.

В-третьих, также выявились определённые темы, которые не были освещены в моем предыдущем, как я считал до этого, вполне исчерпывающем курсе занятий по контроллерам AVR.

И вот одним из неизведанных ещё нами модулей оказался модуль Watchdog Timer (WDT), который, как оказалось, много где используется и выполняет очень важные роли в работе программ. Тем более, меня ранее многие просили сделать по нему урок, но я либо недопонимал ценность данной периферии, либо был увлечён чем-то другим.

Вот и настало время наконец-то восполнить данный пробел.

Watchdog Timer (WDT) — это сторожевой таймер (а если перевести дословно, «сторожевой пёс»), который представляет собой аппаратно-реализованную схему контроля над зависанием системы. Это таймер, который периодически сбрасывается контролируемой системой. Если вдруг сброса не произошло за определённый интервал времени после предыдущего сброса данного таймера, то происходит принудительная перезагрузка системы (в нашем случае микроконтроллера).

В каких конкретных случаях мы можем применить данный таймер?

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

Понятно, что данная ситуация подходит только для случая, когда нам приходится не слишком долго ждать отклика от устройств, то есть именно тогда, когда у нас существует какой-то непрерывный процесс, в котором есть возможность ситуации сбоя. Таких примеров можно придумать много, поэтому Watchdog Timer очень много где применяется.

При работе с таймером в нашем коде мы не будем напрямую работать с его регистрами, так как там ещё надо проделывать очень много различных подготовительных мероприятий. Для этого существует отличная библиотека wdt.h, которая находится в стандартном комплекте для AVR и не требует дополнительного подключения откуда-то. Но тем не менее о том, как именно устроен сторожевой таймер в контроллере ATMega328, которым мы и будем сегодня пользоваться, мы всё же поговорим.

Таймер питается от отдельного генератора, который вместе с ним входит в логику перезагрузки контроллера

avr053img00.jpg

А вот это диаграмма сброса контроллера по истечении интервала времени

Кроме того, что мы можем сбросить сторожевой таймер где-то в коде, мы можем также и отследить окончание интервала времени по прерыванию, которое надо включить отдельно.

WDT, как и было указано выше, работает от отдельного генератора.

Также следует отметить, что диапазон интервалов данного таймера не бесконечен.

Давайте посмотрим блок-схему WDT

На рисунке мы видим, что после генератора на 128 килогерц, сигнал проходит на предделитель, который содержит 10 различных выходов с различным коэффициентом деления. Предделитель настраивается с помощью битов WDP3:WDP0 регистра WDTCSR. Таким образом, интервал времени работы WDT лежит в диапазоне от 15 милисекунд до 8 секунд.

Также мы видим, что с помощью бита WDIE мы можем разрешить прерывания от сторожевого таймера и затем попасть в обработчик, отслеживая состояние бита WDIF. Включается таймер с помощью бита WDE.

Вот он — управляющий регистр сторожевого таймера

Хоть мы уже и говорили о битах данного регистра выше, но всё же давайте все их рассмотрим подробно, их не так и много, так как у таймера всего один регистр

WDIF (Watchdog Interrupt Flag): флаг прерывания. Устанавливается в 1 в случае истечения интервала времени таймера. Сбрасывается аппаратно.

WDIE (Watchdog Interrupt Enable): бит разрешения прерываний от таймера. если установлен в 1, то прерывания разрешены, если в — запрещены.

Существует таблица зависимости от состояния бетов WDE, WDIE, а также фьюза WDTON

Из данной таблицы очень интересно то, что для того, чтобы работать с прерываниями от сторожевого таймера, его не обязательно включать. Достаточно лишь разрешить от него прерывания. Только если не включать, то прерывания работать будут, но таймер при этом не будет перезагружать систему.

WDP2:WDP0 (Watchdog Timer Prescaler): биты, устанавливающие коэффициент деления предделителя сторожевого таймера.

Вот таблица возможных комбинаций данных битов

Здесь также даны сами интервалы в единицах времени.

WDCE (Watchdog Change Enable): бит изменения, который должен быть предварительно включен перед тем, как мы соберёмся внести изменения в предделитель с целью изменения коэффициента деления либо для отключения таймера путём занесения в бит WDE значения . Сбрасывается аппаратно после четырех тактов.

WDE (Watchdog System Reset Enable): бит включения таймера, а вернее бит включения режима перезагрузки системы по истечению интервала времени таймера WDT.

Ну вот, я думаю и всё насчёт теории по сторожевому таймеру. Если что-то пропустил, то исправим это в процессе сочинения кода.

Код наш выполнять будет следующие задачи.

У нас, помимо WDT, будет также работать ещё таймер TIM1, данный таймер будет работать по совпадению, следовательно в обработчик прерываний от него мы будем попадать через определённое время периодично. В обработчике таймера мы будем периодично включать 10 ножек различных портов, а состояние их на какой-то момент мы будем определять по светодиодам, которые мы к ним подключим. Вернее, мы подключим светодиодную планку с 10-ю светодиодами, не забывая конечно о токоограничивающих резисторах, которые я на всякий случай подключил на 680 Ом, при этом светодиоды светятся вполне ярко. В начале программы мы запустим наш сторожевой таймер WDT и зададим ему определённый интервал времени срабатывания. В процедуре обработки прерываний от таймера 1 мы будем своевременно сбрасывать сторожевой таймер, поэтому, если всё у нас будет нормально с ходом программы, то система у нас будет работать и не перезагрузится.

А для того, чтобы проверить, перезагрузится ли наш WDT по истечению интервала, мы сэмулируем ситуацию, что наш таймер перестанет работать. Для этого мы подключим кнопку к контакту INT0 и обработаем от неё внешнее прерывание, в обработчике которого мы запретим прерывания от нашего таймера. Светодиоды, соответственно перестанут бежать, тем самым сигнализируя нам о том, что наш таймер 1 «сломался». Поэтому сторожевой таймер не перезагрузится, тем самым перезагрузит нашу систему и весь процесс у нас начнётся заново.

В качестве контроллера для урока мы возьмём контролер ATMega328P, расположенный на плате Arduino Nano, к которой подключим обычный USB-программатор через разъём ISP. Вставим нашу плату в макетную плату, подведём к ножке PD2 (INT0) кнопку, а также от ножек D3-D12 (ножки портов PD3:PD7, PB0:PB4) подключим аноды светодиодов планки, а катоды через токоограничивающие резисторы подключим к общему проводу

Проект мы создадим в среде программирования MPLAB X, с которой мы постоянно работаем с микроконтроллерами PIC, так как у данных контроллеров владелец один и тот же, то нет смысла использовать несколько сред для разработки. Как установить данную среду разработки, показано здесь.

Создание проекта по ссылке можно не смотреть, мы его все равно сейчас будем создавать заново.

Запустим среду программирования MPLAB X и запустим создание проекта с помощью следующей кнопки

Выберем «Standalone Project» и идём далее

На следующем шаге выберем наш контроллер, перед этим отфильтровав контроллеры по семейству для удобства выбора, и движемся далее

На следующем шаге в качестве программатора выберем Simulator и идём далее

На следующем шаге выберем компилятор и идём дальше

Дадим имя нашему проекту и жмём «Finish»

В дереве проекта в ветке Source Files добавим новый файл main.c с помощью контекстного меню на данной ветке

Исправим имя файла и нажмём «Finish»

Файл main.c создан, чуть позже мы его исправим немного.

А пока создадим ещё заголовочный файл main.h аналогичным образом, только выбрав в контекстном меню на ветке «Header Files» и затем выбрав соответствующий пункт

Для нормального функционирования функции задержки зайдём в свойства проекта и откроем там настройки компилятора, в которых выберем настройку оптимизации

Оставим уровень оптимизации и установим чекбокс на пункте Debug

Полностью удалим всё содержимое файла main.h и заменим его на следующее

Перейдём теперь в файл main.c, также очистим там всё содержимое, подключим в нём заголовочный файл и добавим точку входа — функцию main() с бесконечным циклом

В следующей части урока мы напишем проект и проверим работу сторожевого таймера на практике.

Приобрести плату Arduino Nano V3.0 оригинальный FT232RL можно здесь.

Программатор (продавец надёжный) USBASP USBISP 2.0

Смотреть ВИДЕОУРОК (нажмите на картинку)

WatchDog — автозапуск для фермы

WatchDog (Сторожевой таймер) — устройство для слежения над зависанием и отключением компьютера. Подключается данное устройство к материнской плате через разъем USB  Type A или USB  PBD10.

Особенности данного устройства

✓ Относительно низкая стоимость при заказе из Китая

✓ Автоматическая перезагрузка при зависании системы

✓ Автоматический запуск при появлении электричества

✓ Простота установки

✓ Небольшие габариты

✗ Сроки доставки если заказывать из Китая

✗При покупке в России — высокая цена на устройство и доставку.

WatchDog для фермы можно заказать по ссылке: Aliexpress.com/watchdog

Содержание:

Данное устройство может иметь порт подключения двух видов: Type A и PBD 10.

Untitled-1-300x156.png

Источником сигнала является программа, запущенная на компьютере. Если компьютер зависает или выключается,  то программа перестает исполняться, соответственно пропадает сигнал подающийся на сторожевой таймер. Watchdog постоянно принимает сигнал от ПК, и если по какой либо причине он его не получил, то автоматически WatchDog посылает сигнал на контакты «reset» для перезагрузки компьютера. По истечении некоторого времени если не появился сигнал от ПК, то отправляется сигнал на контакты «Power» с определенной периодичностью времени, пока не появится сигнал от ПК.

Принцип действия всех версий и моделей WatchDog это слежение над зависанием и отключением компьютера. Ниже приведено описание и настройка WatchDog Pro2

С разъемом Type A все просто и беспроблемно: вставляете его в USB выход материнской платы и все готово.  При установке WatchDog с разъемом PBD 10 важно не перепутать коннектор подключения, иначе это приведет к порче устройства.

d-300x120.png

На WatchDog с разъемом PBD 10 специально обозначена точка. Ее необходимо совместить с отсутствующем контактом в порте.

Untit22led-300x175.png

Подключаем WatchDog к плате. Если все правильно сделали, то на устройстве заморгает красный индикатор.

1111titled-300x165.png

Так как майнинг фермы собираются на ОС Windows, ниже будет продемонстрирован процесс настройки ПО для ОС Windows.

Заходим в диспетчер устройств на компьютере. WotchDog должен определиться как «USB WatchDog Monitor».

1Untitled-300x219.png

Скачиваем драйвера.

Заходим на сайт http://open-dev.ru/download  выбираем тип нашего устройства, версию операционной системы, и жмем скачать. Установка очень быстрая и простая: несколько раз нажимаем кнопку «Далее» и затем «Готово». После выполненных действий устройство определится как Com порт.

Далее необходимо скачать и установить программу WatchDog монитор. Ссылка на скачивание : http://software.open-dev.ru/software/wdtmon3/windows/. Процесс установки прост, рассматривать не будем.

2Untitled-300x229.png

Далее подключаем наше устройство проводами к контактам Power и Reset. На рисунках ниже показано к каким контактам нужно подключить провода. Внимание! Соблюдайте полярность.

Для проверки корректности взаимодействия устройства с компьютером необходимо провести тест на запуск и перезагрузку. Для этого правой кнопкой мыши нажимаем на иконку в программы в трее. И при нажатии «Тест перезагрузки» компьютер должен выключиться и включиться, аналогично с режимом «Тест жесткой перезагрузки». Если перезагрузка не произошла, проверьте полярность подключения.5Untitled-286x300.png

Используемые источники:

  • https://mysku.ru/blog/aliexpress/52212.html
  • http://narodstream.ru/avr-urok-53-watchdog-timer-wdt-chast-1/
  • https://turbominer.ru/watchdog-autostart-farm/

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации