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

8

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

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

Ответы:

7

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

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

jonoxer
источник
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
}
phooky
источник
3

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

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

кортик
источник