-
Notifications
You must be signed in to change notification settings - Fork 0
/
main-wdt.c
48 lines (39 loc) · 2.56 KB
/
main-wdt.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/**
* Пример для Arduino UNO.
*
* После запуска программы помигаем светодиодом несколько раз.
* Установим Watchdog Timer на определенный интервал времени.
* Далее запускаем критический блок программы во время которого что-то может пойти не так (зависание).
* Если программа зависла и интервал времени у Watchdog Timer истек, то произойдет сброс программы.
* Если зависания не произошло, то сбросим Watchdog Timer.
*
* Watchdog Timer (WDT) - это таймер, который используется для защиты микроконтроллера от зависания.
* Если программа зависнет, WDT сработает и перезагрузит микроконтроллер.
*
* WDT работает следующим образом:
* - Микроконтроллер запускает WDT.
* - WDT начинает отсчитывать время.
* - Если программа не сбросит WDT до того, как он закончит отсчитывать время, WDT сработает и перезагрузит микроконтроллер.
*
* Сторожевой таймер Arduino UNO или ATmega 328P управляется не системными часами,
* как другие таймеры, рассмотренные ранее, а отдельным генератором с частотой 128 кГц.
*/
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define LED_PIN PB5 // PB5(D13)
int main(void) {
DDRB |= (1<<LED_PIN); // Настройка PB5 на выход
// Мигаем светодиодом
PORTB |= (1<<LED_PIN);
_delay_ms(1000);
PORTB &= ~(1<<LED_PIN);
// Для Arduino Nano, Arduino Pro Mini не получиться использовать функцию wdt_enable(WDTO_4S) из-за проблем с bootloader
// https://github.com/arduino/ArduinoCore-avr/issues/150
wdt_enable(WDTO_4S); // Запускаем Watchdog Timer на 4s.
_delay_ms(6000); // Программа работает > 4s (зависание)
// _delay_ms(3000); // Программа успевает отработать за 4s (зависания нет)
wdt_disable(); // Выключаем Watchdog Timer
while (1) {}
}