Watchdog timer или "Сторожевая собака" для микропроцессорной техники. Что мы будем делать

Watchdog timer или "Сторожевая собака" для микропроцессорной техники. Что мы будем делать

23.04.2019

Предлагаю вариант устройства автоматически перезагружающее компьютер при зависании.

В основе лежит известная плата Arduino с минимальным количеством внешних электронных компонентов. Транзистор подключаем к плате согласно рисунку ниже. Коллектор транзистора подключаем вместо кнопки «Reset» компьютера на материнскую плату, на тот контакт который НЕ соединен с GND.

Вот и вся схема:

Функционирует устройство следующим образом: на компьютере запускается скрипт, который периодически шлет в порт компьютера данные. Ардуино подключается к USB и слушает этот порт. Если в течении 30 секунд данных нет Ардуино открывает транзистор, который соединяет Reset c землей, тем самым имитируя нажатия кнопки сброса.
После сброса ардуино делает паузу в 2 минуты дожидаясь загрузки всех программ и вновь начинает слушать порт.

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

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

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

Компонентты для сборки я покупал на Алиэкспресс:

Провода для макетной сборки http://ali.pub/22k78b

Ардуино УНО (точно подходит) http://ali.pub/22k7dd

Arduino uno с кабелем http://ali.pub/22k7go

Скетч Ардуино

int LedPin = 13;
int ResetPin = 12;
int val = 0;
int count = 0;
void setup()
{
Serial.begin(9600);
pinMode(LedPin,OUTPUT);

//пауза на запуск 2 мин
delay (120000);
}

void loop()
{
count++ ;

if (Serial.available() > 0)
{
val = Serial.read();
if (val == ‘H’)
{
digitalWrite(LedPin,LOW);
digitalWrite(ResetPin,LOW);
count = 0;
}
else
{ count++ ;
}
}

delay (1000);

if (count > 10)
{
digitalWrite(LedPin,HIGH);
digitalWrite(ResetPin,HIGH);
}
}

Скрипт отправляющий в порт данные:

(Get-Date).ToString(‘dd.MM.yyyy HH:mm’) | Out-File c:UsersminerDesktopreboot.txt -append

while($TRUE){
Start-Sleep -s 3
$port= new-Object System.IO.Ports.SerialPort COM3,9600,None,8,one
$port.open()
$port.WriteLine(«H»)
$port.Close()
}

Сразу после запуска скрипт записывает в файл reboot.txt текущую дату и время. По этому файлу можно судить о количество и времени перезагрузок. Путь к файлу и номер порта необходимо отредактриовать в соответствии с вашими данными системы. Код пишется в обычном блокноте и сохраняется с расширением *ps1.

Т.к. в Windows политикой безопасности отключено выполнение скриптов по двойному клику и из автозагрузки делаем финт ушами и запускаем шелл из батника следущего содержания:

start PowerShell.exe -ExecutionPolicy ByPass -File «c:путь к вашему файлуваш файл.ps1»

Файл сохраняем с расширением *.bat и ставим его в автозагрузку.

Радуемся, теперь у нас все автоматизированно. Устройство испытано на своем ПК и польностью работает.

Подписывайтесь на Bitnovosti в telegram!

Делитесь вашим мнением об этой новости в комментариях под статьёй.

  • Tutorial

Речь пойдет о том, как держать Arduino всегда в работоспособном состоянии. Механизм watchdog встроен в контроллеры Atmega, но, к сожалению, не всякий загрузчик (bootloader) Arduino правильно обрабатывает эту функцию. Попробуем разобраться с этой проблемой.

Итак, что такое watchdog? Простыми словами - это встроенный таймер на определенное время (до 8 сек в зависимости от чипа), который можно запустить программно. Как только таймер «дотикает» до нуля, контроллер подает правильный сигнал сброса (RESET) и всё устройство уходит в hard перезагрузку. Самое главное, что этот таймер можно сбрасывать в начальное состояние также программным способом.

  • Правильный сигнал сброса - достаточный по длительности для того, чтобы контроллер начал перегружаться. Иногда есть соблазн подключить к RST входу какой-либо цифровой выход Arduino и устанавливать его в 0 когда надо перегрузиться. Это плохой подход к решению проблемы, т.к. такого сигнала может быть недостаточно по времени, хотя и не исключено, что в некоторых случаях это тоже будет работать..
  • hard перезагрузка это самая настоящая перезагрузка, которая происходит при нажатии на кнопку RESET. Дело в том, что есть еще понятие soft перезагрузки - это программный переход на 0-вой адрес. В принципе, это тоже полезная вещь, но с помощью нее невозможно перегрузить зависший контроллер Ethernet или взглюкнувший LCD.
Короче говоря, встроенный watchdog это как раз то, что нужно и без дополнительных схем, пайки и соединений.

Функции Watchdog

Чтобы использовать функции Watchdog нужно подключить к проекту стандартную библиотеку:
#include
Теперь нам доступны следующие три функции:

1. Запуск таймера watchdog:
wdt_enable(WDTO_8S); /* Возможные значения для константы WDTO_15MS WDTO_30MS WDTO_60MS WDTO_120MS WDTO_250MS WDTO_500MS WDTO_1S WDTO_2S WDTO_4S WDTO_8S */
Таймер будет считать ровно столько, сколько указано в константе. По истечении этого времени произойдет перезагрузка.

2. Сброс таймера watchdog:
wdt_reset();
Думаю, понятно для чего нужна эта функция - пока вы вызываете ее, контроллер не сбросится. Как только система зависнет и эта функция вызываться перестанет, то по истечении заданного периода произойдет перезагрузка.

3. Отключение watchdog:
wdt_disable();
Отключение таймера watchdog.

Собственно, на этом можно было бы и закончить наше повествование о watchdog… но дело в том, что все это работает только в Arduino Uno, а на Arduino Mega, Mini и Nano все это работает ровно наоборот, т.е. не работает совсем:)

Почему watchdog не работает на большинстве современных плат Arduino

Дело в том, что после перезагрузки, которая была вызвана watchdog, контроллеры последних выпусков оставляют включенным watchdog на минимальный период , т.е. 15ms. Это нужно для того, чтобы программа как-то узнавала, что предыдущая перезагрузка была по watchdog. Поэтому первоочередная задача загрузчика (или вашей программы, если она запускается первой) - сохранить информацию о том, что перезагрузка была «неожиданной» и сразу же выключить watchdog. Если этого не сделать, то система уйдет в bootloop, т.е. будет вечно перегружаться.

Как известно, в Arduino есть специальный загрузчик, который выполняется в первую очередь после перезагрузки системы. И, к огромному сожалению, стандартный загрузчик не сбрасывает watchdog! Таким образом, система заходит в жестокий bootloop (состояние «crazy led», при котором светодиод на 13-м пине мигает как сумасшедший).

Выглядит это все примерно так:


Пути решения проблемы

Если посмотреть на исходники стандартного загрузчика (они есть в поставке платформы), то код отключения watchdog есть (!), но этот код вынесен под условную компиляцию и, по всей видимости, стандартный загрузчик скомпилирован без поддержки watchdog. По крайней мере в пакете платформы версии 1.5.2 (последней на момент написание статьи) дело обстоит именно так.

Для решения проблемы я даже прочитал man-ы самой платформы (:) и вроде бы там описана эта проблема и даже приведен код, который должен сделать всех счастливыми:

Uint8_t mcusr_mirror __attribute__ ((section (".noinit"))); void get_mcusr(void) __attribute__((naked)) __attribute__((section(".init3"))); void get_mcusr(void){ mcusr_mirror = MCUSR; MCUSR = 0; wdt_disable(); }
Здесь описывается функция get_mcusr(), которая должна вызываться сразу после сброса. Это достигается макросом "__attribute__((section(".init3")))". Я пробовал прописывать эту функцию во все секции, которые только возможно - да, она действительно запускается до функции setup() из скетча, но, к сожалению, гораздо позже 15ms (минимальная константа watchdog) после сброса…

Короче говоря, как я ни рыл интернет в поисках легкого решения проблемы, так ничего найдено не было. Я нашел только один способ заставить watchdog работать - перепрошить загрузчик… чем мы сейчас и займемся.

Проверка работоспособности watchdog

Прежде чем что-то прошивать, нужно проверить - вдруг ваша Arduino поддерживает watchdog. Для этого я написал небольшой скетч для теста. Просто залейте его, откройте монитор порта и смотрите, что будет происходить.

Тестирование на watchdog

#include void setup() { wdt_disable(); // бесполезная строка до которой не доходит выполнение при bootloop Serial.begin(9600); Serial.println("Setup.."); Serial.println("Wait 5 sec.."); delay(5000); // Задержка, чтобы было время перепрошить устройство в случае bootloop wdt_enable (WDTO_8S); // Для тестов не рекомендуется устанавливать значение менее 8 сек. Serial.println("Watchdog enabled."); } int timer = 0; void loop(){ // Каждую секунду мигаем светодиодом и значение счетчика пишем в Serial if(!(millis()%1000)){ timer++; Serial.println(timer); digitalWrite(13, digitalRead(13)==1?0:1); delay(1); } // wdt_reset(); }


После перезагрузки (или подключения монитора к порту) встроенный светодиод мигнет, сигнализируя о том, что запустился загрузчик. Далее в секции setup происходит включение watchdog с таймером на 8 сек. После этого светодиод отсчитает нам это время и должна произойти перезагрузка.

Далее начинается самое интересное - если перезагрузка произошла и все повторяется в такой же последовательности, то вы имеете на руках Arduino, в которой загрузчик правильно обрабатывает watchdog. Если же после перезагрузки светодиод на 13-м пине начинает бесконечно мигать, то значит загрузчик не поддерживает watchdog. Здесь даже кнопка сброса не поможет. Для последующей прошивки нужно плату отключать от питания и после включения успеть прошить до первой перезагрузки.

Я протестировал 4 вида плат и только загрузчик в Arduino Uno сработал так как надо:

Результаты на мониторе

Watchdog не поддерживается загрузчиком:

Watchdog поддерживается загрузчиком:


Как легче всего прошить новый загрузчик?

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

Я не буду в этой статье описывать все премудрости создания программатора на основе Arduino, т.к. эта тема довольно . В качестве программатора я использовал Arduino Uno. Как известно, прошивка производится через отдельный разъем ICSP, который есть почти на всех платах. В случае прошивки Arduino Pro Mini, у которого нет IСSP, подключение производится непосредственно к выводам .

Подключение для прошивки bootloader




Где взять загрузчик, который поддерживает watchdog?

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

Рекомендуется использовать загрузчики из пакета optiboot. В принципе, эти загрузчики идут в инсталляции самой платформы Arduino, но лучше скачать и установить последнюю версию optiboot отсюда . Установка заключается в двух шагах (возможно, это можно сделать как-то по-другому):

  1. Папка bootloaders\optiboot перезаписывается в C:\Program Files (x86)\Arduino\hardware\arduino\avr\bootloaders\optiboot
  2. Файл boards.txt дописывается к файлу C:\Program Files (x86)\Arduino\hardware\arduino\avr\boards.txt
Естественно, папка установки платформы Arduino у вас может быть другой.

Далее перегружается среда разработки и в меню Сервис/Плата можно наблюдать новые платы с пометкой . К сожалению, при выборе этих плат происходят какие-то непонятные ошибки компиляции и появляются всякие другие странности… поэтому делаем еще проще. Открываем в любом текстовом редакторе файл C:\Program Files (x86)\Arduino\hardware\arduino\avr\boards.txt и меняем следующие строчки:

Для Arduino Nano:
menu.cpu.nano.atmega328.bootloader.file=optiboot/optiboot_atmega328.hex

Для Arduino Mini:
menu.cpu.mini.atmega328.bootloader.file=optiboot/optiboot_atmega328.hex

Следующая проблема в том, что загрузчика optiboot для платы Arduino Mega не существует в природе, т.к. в Mega больше памяти и используется другой протокол. Поэтому мы используем стандартный, но модифицированный загрузчик, который качаем отсюда . Файл переименовываем в stk500boot_v2_mega2560_2.hex и записываем в папку C:\Program Files (x86)\Arduino\hardware\arduino\avr\bootloaders\stk500v2.

Не пугайтесь, что файл модифицированной прошивки для Mega в 2 раза меньше стандартного - так вроде бы должно быть.

Процесс прошивки

После всех изменений можно прошивать загрузчики, выбирая в меню плат обычные платы (не !). В этом случае прошиваться будут именно те файлы hex, которые мы указали в файле board.txt.
Процесс прошивки может не стартовать и выдаваться ошибка:
Для решения этой проблемы откройте скетч программатора и в секции setup выберите другую скорость последовательного порта.
Во время заливки в Arduino Mega может появляться ошибка, которую следует игнорировать:
avrdude: verification error, first mismatch at byte 0x3e000 0x0d != 0xff avrdude: verification error; content mismatch

Заключительные манипуляции

Загрузчики optiboot имеют еще одну особенность - они увеличивают скорость загрузки скетчей, поэтому при использовании плат с optiboot нужно внести соответствующие изменения в boards.txt:

Для Arduino Nano:
menu.cpu.nano.atmega328.upload.speed=115200
Для Arduino Mini:
menu.cpu.mini.atmega328.upload.speed=115200

Предыдущую скорость порта лучше тоже запомнить, т.к. ее нужно будет использовать на платах со стандартными загрузчиками. Если такие изменения не сделать, то процессе заливки скетчей будет выдаваться ошибка, типа такой:
avrdude: stk500_getsync(): not in sync: resp=0x00

Ссылки, литература

Пакет optiboot
Прошивка bootloader
Как прошить bootloader в Arduino Pro Mini

Теги:

  • arduino
  • watchdog
Добавить метки

Добавление WiFi модуля и внешнего WatchDog таймера

Хочу вам сообщить, что контроллер, который вы собрали сами, по моим инструкциям, можно подружить с интернетом!

Преимущества работы контроллера с интернетом:

  • Синхронизация часов с сервером времени
  • Автоматический переход на зимнее/летнее время
  • Вы узнаете о выходе новой версии прошивки
  • Просмотр данных вашего контроллера с мобильного устройства
  • Подключение к сайту log2.com.ua

Небольшая ложка дегтя – это все привилегии платной версии прошивки MEGA CtrlM, которая стоит, не так уж и дорого – всего $4.95! Кроме того, данная прошивка поддерживает 8 датчиков температуры, 8 управляемых выходов и программирование, т.е задание собственных условий.

Для покупки прошивки обращайтесь ко мне, на info@сайт Платная прошивка сделает ваше устройство более гибким, и в тоже время, вы вносите ваш вклад в дальнейшее развитие проекта.

Немного подробнее про каждый пункт.

Синхронизация времени и переход на летнее/зимнее время

Тут в общем то все ясно. Модуль часов DS1307 не может похвастаться своей точностью. К примеру, у меня за пол года, часы «отстали» более чем на 2 часа. Да и батарейка может не вовремя разрядиться. Разумеется, обрадует вас и автоматический перевод часов на зимнее или летнее время – два раза в год одной проблемой меньше. А часы ведь нам нужны – для правильного ведения лога, для отправки данных на сервер, для выполнения нагрева по расписанию! Для тех стран, где нет перевода часов, эту опцию можно отключить, оставив только синхронизацию.

Выход новой прошивки

Что может быть радостнее, чем весть об исправлении старых ошибок и добавлении новых возможностей в ваше устройство. Можно сказать, что ваше устройство начинает вторую жизнь!

Просмотр данных с мобильного устройства.

Здесь вообще можно расслабиться:) Лежа на диване, заходите на web-страничку вашего контроллера, и смотрим текущие значения датчиков. Справедливости ради надо сказать, что страничка, бывает, загружается не с первого раза и ничего тут не поделаешь. В будущем, эту проблему решу написанием отдельного приложения для Android. Для того, чтобы ваш контроллер не менял ip адрес, в настройках роутера привяжите ему статический ip по MAC адресу. К слову, если ip вашего контроллера 192.168.0.106 то для просмотра показаний датчиков в строке браузера вашего телефона, планшета или компьютера надо ввести http://192.168.0.106/d459 Как правило, http:// можно не вводить, достаточно лишь 192.168.0.106/d459

Локальный web-монитор. Так же можно включать или выключать выходы.

Подключение к сайту log2.com.ua

Если вы хотите наблюдать за вашей системой, лежа на диване, к примеру, в Турции или еще где-нибудь, за пределами вашей страны, то можно подключить ее к глобальному online монитору на сайте log2.com.ua Сайт этот мой. Он имеет очень простой интерфейс но выполняет свои функции.


Глобальный online монитор, следит за гелиосистемой.

Надо понимать, что после этого, не обязательно использовать контроллер именно для солнечных систем! Он, как контроллер и как наблюдатель справится с вашей системой отопления, теплицей, дачей и т.д… Т.е его область применения значительно расширяется.


Глобальный online монитор, следит за системой отопления.

Для подключения контроллера к сети я использую WiFi модуль ESP8266-01. Для его подсоединения понадобится пару резисторов и конвертор логических сигналов. Лучше его заказать сразу с модулем ESP8266. Все вместе обойдется вам примерно в 150 грн.

Можно подключить ESP8266 и без конвертора логических сигналов, но так делать настоятельно не рекомендуется!


Схема подключения ESP8266-01. Нам понадобится еще 2 резистора 4.7К и один 470R


Использование пинов на плате Arduino MEGA для подключения модуля WiFi и внешнего WatchDog таймера

И еще, для теста можно брать питание 3.3V для модуля ESP8266 напрямую от платы Arduino. Он находится возле пина RESET. Но, для более стабильной работы, рекомендуется вывести отдельное питание от 5В, и понизить его до 3.3В с помощью понижающей микросхемы AMS1117.


Схема понижения 5В до 3.3В для питания WiFi модуля ESP8266


Подключение внешнего WatchDog таймера

Никто не застрахован от ошибок, в том числе и я. Иногда, с выходом новой прошивки и добавлением новых возможностей вы можете получить и новые проблемы в виде зависания контроллера. Не стоит так сильно пугаться. Я тестирую прошивки перед их выпуском, но все равно могу что-то недосмотреть или не учесть. Человеческий фактор никто не отменял. Внутренний сторожевой таймер, который должен стоять на страже нашего контроллера, и перезагружать его в случае зависания, работает далеко не всегда! Тут проблема не в самом watchdog"e, а в моем коде. Контроллер может зависнуть на участке, который будет исправно сбрасывать watchdog и мы никогда не перезагрузимся. По этой причине я решил добавить еще один, внешний watchdog, который имеет довольно большой интервал перезагрузки от 140 до 300 секунд, и сброс этого таймера происходит только в главной программе. Поэтому, если мы зависнем, выполняя какую-либо функцию – наш внешний watchdog сработает!


Схема внешнего WatchDog таймера на микросхеме 555. Взято

Если возиться с платой нет времени, то можно купить у меня почти готовый набор для сборки – печатную плату и набор радиокомпонентов. Собрав его, вы получите WatchDog таймер и плату для подключения WiFi модлуя. Цена набора 150грн.


Плата WathcDog + WiFi. Модуль WiFi не входит в комплект!


Плата WathcDog + WiFi, другой ракурс

Ни для кого не секрет, что любая цифровая техника, рано или поздно, «зависает». Это всегда неожиданность для разработчика и это всегда неприятность для пользователя. Это всегда невовремя и это, увы, никак не прогнозируется. И неважно, самодельная ли это «мигалка на ёлку» на одной микросхеме-микроконтроллере или сложный сервер, работающий в нагруженной сети, - лучше бы этих зависаний не было. А бывают такие системы, зависание которых обходится очень и очень дорого.
Устройство, называемое «Watchdog» («Сторожевая собака»), призвано отслеживать факт зависания контролируемой им системы и, в случае обнаружения зависания, принудительно эту систему перезагружать.

Сначала я напишу коротенький абзац для «новичков», чтобы было понятно, о чём я вообще тут говорю. Потом будет абзац для более подготовленных, которые, дочитав дотуда, всё ещё не захотят закрыть вкладку с обзором:)
Сторожевой таймер, сам по себе - это маленькая и довольно простая схемка. До тех пор, пока ей на вход периодически приходят сигналы от контролируемого девайса («да-да», «всё нормально», «я тут», «я работаю») - собака ведёт себя спокойно и никак не вмешивается. Как только сигналы перестают приходить, собака ждёт положенное время (обычно несколько секунд) и, если сигналов так и не пришло, она считает, что устройство зависло и посылает ему сигнал Reset, перезагружая его. Очевидно, что некая условная система, оборудованная таким модулем, будет более устойчива, по сравнению с аналогичной системой без watchdog: от зависаний не застрахован никто, но первая будет сама выбираться из этих зависаний, вторая же будет ждать и простаивать до вмешательства человека.
Сторожевой собаке абсолютно всё равно, какой величины и значимости систему она контролирует. Это может быть и копеечная воьминогая микросхема-микроконтроллер, и «малинка»-«апельсинка», и роутер, и домашний стационарный компьютер, и большой навороченный сервер. Ей лишь бы приходили сигналы об активности системы, да чтоб система, соответственно, реагировала на её импульс «Reset».
Конец абзаца.
Почему внешний watchdog, если в любом современном микроконтроллере есть встроенный? По двум основным причинам. Во-первых, бывают такие зависания, которые изнутри единого кристалла отследить нельзя: прерывания по таймеру живут, watchdog исправно ресетится, а программа, допустим, крутится в бесконечном цикле. Или ждёт импульса на какой-нибудь ноге, который дойти никак не может из-за какой-то аварии. Да мало что… Внешний же аппаратный сторож никак не связан с процессами внутри: пока у него есть питание, он будет сторожить.
Во-вторых, ардуино… Нельзя не признать, что доля DIY-микроконтроллерных проектов, реализуемых публикой на arduino, занимает значительную нишу. И приверженцы ардуино, увы, прелестями встроенного в атмегу сторожевого таймера воспользоваться не могут. Проблема . Вкратце: watchdog правильно работает только на некоторых Uno, остальные ардуины намертво «кладутся» при попытке использовать сторожевой таймер. Спасает только перешивка загрузчика внешним программатором. А новичков такая «хирургия», безусловно, пугает. Да и не у всех есть под рукой вторая ардуина, чтобы сделать из неё программатор для оживления первой, ушедшей в мёртвый цикл из-за использования встроенного watchdog. Все эти манипуляции новичка, вероятнее всего, попросту отпугнут.
Внешний же watchdog позволяет, используя arduino в своих проектах, в полной мере получать все прелести устойчивых систем, не заморачиваясь проблемами внутреннего сторожевого таймера.

Теперь, собственно, к самому обозреваемому модулю.

Размерами он сопоставим с Arduino Pro Mini:

С обратной стороны ничего интересного: только дорожки, соединяющие три переходных отверстия с пинами модуля. Да не очень качественно отмытый флюс:

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

Коротко и сжато о назначении выводов чипа

На вывод ST должны приходить стробирующие импульсы от контролируемого устройства, говоряжие о его здоровом функционировании.

На выводах RST и /RST формируется перезагружающий импульс. Разница между выводами RST и /RST заключается исключительно в полярности перезагружающего импульса. Сигнал с вывода RST надо брать, если контролируемое устройство перезагружается логической единицей при нормальном нуле на линии сброса. Сигнал же /RST, наоборот, предназначен для устройств, перезагружаемых низким уровнем на линии сброса. Большинство современных микроконтроллеров (включая атмелловские, на базе которых построено и arduino) перезагружаются нулевыми импульсами, т.е. для них подходящим является сигнал /RST.

Вывод TOL выбирает приемлемость условий питающего напряжения.
- когда TOL прижат к земле, приемлемым считается пятипроцентный коридор отклонения напряжения. Т.е. сигнал перезагрузки придёт при снижении напряжения до 4,75V.
- когда TOL подключён к питающей линии, коридор питающего напряжения расширяется до 10%. Т.е. устройство будет перезагружено при снижении напряжения питания до 4,5V.

Выводом TD выбирается максимальное контрольное время, после которого сработает сторожевой таймер:
- когда TD прижат к земле, таймаут составляет 150ms (от экземпляра к экземпляру нормой будут значения 62,5ms - 250ms);
- когда TD висит в воздухе, таймаут составляет 600ms (от экземпляра к экземпляру 250ms - 1000ms);
- когда TD соединён с питанием, таймаут составляет 1200ms (от экземпляра к экземпляру 500ms - 2000ms). Выдержек свыше двух секунд данная микросхема не даст даже теоретически.


Продавец услужливо опубликовал схему модуля и его разводку:


Как видим из схемы, линии чипа ST, RST и /RST выведены, как одноимённые, и на пины модуля.
Производитель предоставил нам самое лояльное и комфортное включение чипа: максимально широкий коридор питающих напряжений (от 4,5 до 5V) и максимально возможный таймаут сторожевого таймера (1,2 секунды).

Теперь становится понятной схема подключения модуля к нашей условной ардуине:
- линии Vcc и Gnd на модуле подключаются к двум одноимённым линиям на arduino;
- линия /RST на модуле подключается к пину RST на ардуине
- линия ST подключается к любому свободному пину, желательно без аппаратного ШИМ, - допустим, у меня это пин 2.

Набросаем простенький скетч для проверки модуля. Я (исключительно для наглядности) при инициализации программно мигаю встроенным светодиодом. Этого можно было не делать, светодиод мигнёт и без нас. Но так - нагляднее и понятнее новичкам.
void setup() { pinMode(13, OUTPUT); // Используем внутренний светодиод pinMode(2, OUTPUT); // С этого пина Watchdog будет получать сигналы digitalWrite(13, HIGH); delay(50); // Коротко мигнём светодиодом при каждой перезагрузке digitalWrite(13, LOW); } void loop() { digitalWrite(2, HIGH); delay(2); // Формируем короткий перепад digitalWrite(2, LOW); delay(1150); // Максимально длинный таймаут } При значении задержки 1150 миллисекунд (в моём конкретном случае) или меньших, наша ардуина спокойно крутится в рабочем цикле, ей ничто не мешает. Светодиод, мигнув вначале, не светится - перезагрузок нет. Как только мы увеличим эту задержку хотя бы до 1200 миллисекунд (или внесём значительную задержку в процедуру Setup), мы увидим, что светодиод начнёт циклически вспыхивать: время для собаки становится критическим и она перезагружает ардуину.
В реальных же условиях рабочего скетча, достаточно внести строчку digitalWrite(2,HIGH); delay(1); digitalWrite(2,LOW); в самый конец основного цикла, чтобы сторожевой модуль, подключённый к пину 2, чувствовал себя спокойно.
При инициализации ардуины все пины передёргиваются, поэтому собаке абсолютно всё равно, на каком логическом уровне зависло устройство: таймер был запущен и, значит, перезагружающий импульс неминуемо придёт.

Выводы.
1. Нужен ли сторожевой таймер в принципе? Если в проектируемом вами устройстве зависания могут привести к негативным последствиям, то да. С ним система будет, очевидно, более устойчивой, чем без него.

2. Является ли внешний сторожевой таймер панацеей? Конечно, нет. Он более эффективен, чем внутренний, имеющийся во многих микроконтроллерах, но и он не панацея. Для достижения максимальной эффективности его работы, важно его подключить в правильное место вашей системы. Лучше не подключать его к линиям, на которых сигналы формируются аппаратно (ШИМ, различные аппаратные порты со стробами), а также к сигналам внешнего или внутреннего тактового генератора. Ну и абсолютно бессмысленно подключать его к линиям, работающим на вход - так мы будем контролировать не свой микроконтроллер, а что-то другое.

3. Есть ли минусы у этого сторожа? Главным минусом внешнего сторожевого таймера, в общем случае, является потребность в выделении для его работы одного пина на вашем устройстве. Хотя на практике, этого очень часто удаётся избежать: если ваш микроконтроллер что-то постоянно пишет или рисует на дисплее, что-то постоянно посылает в порты, формирует какие-то управляющие импульсы для внешних устройств - подключайте сторожевую собаку к этим линиям, - ей абсолютно безразличны частота и скважность импульсов, ей лишь бы была постоянная движуха.
Главным минусом конкретно этой реализации таймера я назову, пожалуй, довольно короткий контрольный таймаут. Бывают случаи, когда хотелось бы иметь запас хотя бы в 3-5 секунд.

4. Надо ли покупать именно этот watchdog? Ну, каждый решит для себя. Сторожевую собаку, совершенно точно, можно получить дешевле $3. Кому-то проще купить один лишь только обозреваемый выше чип и с помощью ЛУТ сделать такой модуль самому. Кому-то проще взять легендарный и сделать сторожевой таймер на рассыпухе: плюсы - дёшево и доступно, минусы - больше возни и времязадающие электролитические конденсаторы, а, значит, с годами гарантированно поплывут все параметры. Кому-то проще сделать одновибратор с таймером вообще на полупроводниках. Тут каждый решает сам.
Здесь же за вполне посильные деньги мы получаем полностью готовое и рабочее устройство с нормированными параметрами.
Так что резонность покупки каждый оценит самостоятельно.

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

Никто ничего не предоставлял и не спонсировал, всё куплено на свои.

UPD : Пока писал обзор, продавец неожиданно поднял цену. Упс. Будем считать это временным приступом жадности. На этот товар у него периодически бывает скидка. Ну и ничто не мешает искать этот товар у какого-то другого продавца.

Планирую купить +92 Добавить в избранное Обзор понравился +86 +164

© 2024 beasthackerz.ru - Браузеры. Аудио. Жесткий диск. Программы. Локальная сеть. Windows