Watchdog как дополнительный таймер

preview_player
Показать описание
Использование watchdog в качестве дополнительного таймера (хоть и с урезанными возможностями). На примере Attiny13.

Рекомендации по теме
Комментарии
Автор

Протеус умеет обрабатывать прерывание по WDT, просто надо инициализировать сторожевой таймер в определенном порядке, до которого даже после чтения даташита трудно догадаться.
Делается это так (пример для Winavr + avr-gcc):
1. asm("cli"); // запрещаем прерывания
2. WDTCR |= (1<<WDE | 1<<WDCE); // согласно даташиту, сначала WDE и WDCE обязательно (!) выставляем одновременно.
3. WDTCR &= ~(1<<WDCE) // теперь обязательно (!) нужно сбросить бит WDCE.
4. WDTCR &= ~(1<<WDE) // а после можно выключить бит WDE.
5. WDTCR |= (1<<WDTIE) // включаем прерывание по WDT.
6. asm("wdr"); // перед установкой периода срабатывания нужно сбросить WDT.
7. WDTCR |= (1<<WDP2 | 1<<WDP1); // теперь устанавливаем период срабатывания (например, 1 секунда).
8. asm("sei"); // разрешаем прерывания.

В обработчике прерывания WDT_vect выполняем asm("wdr") для сброса прерывания. Или, для большей надежности, запихиваем приведенные выше строки в функцию и вызываем ее в обработчике.

Andrew_Chernenko
Автор

А во вопрос, как прерывание он работает, а будет ли работать одновреметтно и собыкой на ребут и прерыванием. Т.е. если программа зависла, то ребут, а если крутится цикл, то сбрасываем собаку и работает как прерывание. Делал с библиотекой, (wdt), но на тиньке 13 не пошло... Такое ощущение что кмпилятор что то портит. Хотя ваш код отрабатываеи ОК.

vberdiaev
Автор

Я диванный программист. Мне плохо виден код. Просьба показывать увеличенный шрифт. А то лайки ставить не буду! (это угроза)...

cpaeko