Watch Dog Таймер + Ардуино


8

Как настроить аппаратный сторожевой таймер с Arduino?


2
Я думаю, что вы должны выбрать другой ответ, так как в Arduino встроен сторожевой таймер.
Мэтт Уильямсон,

Ответы:


7

Доступно несколько специализированных аппаратных сторожевых микросхем, но это достаточно просто сделать, используя обычную 555 таймерную ИС и пару вспомогательных частей. С 555, сконфигурированным в нестабильном режиме с очень длинным периодом «ВЫСОКИЙ» и относительно коротким (возможно, 0,3 секунды) периодом «НИЗКИЙ», выход можно подключить к выводу сброса Arduino через диод, чтобы сделать сторожевой таймер открытым коллектором. устройство. Затем Arduino может периодически сбрасывать сторожевой таймер, используя цифровой выход, чтобы включить транзистор, который разряжает синхронизирующий конденсатор, подключенный к 555, предотвращая его когда-либо достижение точки запуска, которая заставит его сбросить Arduino.

Некоторая основная информация о проекте для этого доступна по адресу http://www.practicalarduino.com/news/id/471.


1
phooky абсолютно верен, но у внутреннего WDT есть ограничения: он не может работать более 6 секунд (зависит от модели процессора), и нет способа сделать «чистую» перезагрузку исключительно из программного обеспечения. Вы можете попросить ЦП перейти в положение 0 и перезапустить загрузчик, но тогда у вас могут остаться неясные вещи в ОЗУ и такие вещи, как флаги прерывания, все еще установленные в ЦП. Утверждение RESET в оборудовании гарантирует, что Arduino создаст чистую среду.
jonoxer

2
истечение времени ожидания WDT приведет к «чистому сбросу», поскольку все регистры будут гарантированно запускаться в определенном состоянии. Выполнить его в программном обеспечении так же просто, как отключить прерывания и бесконечные циклы.
Ник Т

14

Уже есть сторожевой таймер, встроенный в чип atmega; Вы можете использовать, avr/wdt.hчтобы манипулировать им.

Быстрый пример:

#include <avr/wdt.h>

void setup() {  
  wdt_enable(WDTO_500MS); // have the wdt reset the chip
  // if 500ms passes without a reset
}

void loop() {   
  wdt_reset(); // reset the wdt
}

3

Я слышал о некоторых проблемах с WDT и обычным загрузчиком, поэтому вы можете попробовать использовать другой загрузчик, например, Adaboot.

Кроме того, с помощью WDT вы можете сделать еще кое-что, кроме простого сброса. Я рекомендую http://www.atmel.com/dyn/resources/prod_documents/doc2551.pdf

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.