Nord написал(а):Этот бит там не один...
Именно только этот бит и отвечает за разрешения вызова прерываний от сторожевого таймера, Если он = 0, то никаких вызовов прерываний от сторожевего таймера не будет. Если WDIE =1 и установлен I бит регистра SREG, то прерывание от Watchdog разрешается. Тут возможны 2 вараинта в зависимости от бита WDE.
WDE=0 - вызов прерывания,
WDE=1-вызов прерывания и переход к режиму системного сброса.
Читаем у Белова А.В.(Микроконтроллеры AVR):"Если при помощи fuse установить WDTON=enable.....то срабатывание всегда вызывает сброс системы....и WDE, бит режимного прерывания и WDIE приобретают фиксрованные значения 1 и 0 соответственно"- стр.389
Т.е по умолчанию WDE=1, WDIE=0.
"Для того, чтобы таймер постоянно оставался в режиме прерывания необходимо устанавливать этот режим программным путем после каждого прерывания"- стр.391
Хорошо, пройдемся по коду:
rom-i написал(а):Config Watchdog = 1024
Вот тут установлены биты WDP3-WDP0 регистра WDTCR,коэффициент предделителя
rom-i написал(а):Enable Wdt ' Разрешаем прерывание от переполнения таймера Watchdog
Enable Interrupts
Тут первая строка устанавливается бит WDE в регистре WDTCR
Следующая строка устанавливает I бит регистра SREG
rom-i написал(а):Обработка_прерывания_watchdog:
Incr Secunda
Return
Подпрограмма прерывание, где изменился бит WDRF регистра MCUSR (соответственно и WDE, потому что он дублирует WDRF )
После просыпания: WDE=1, WDIE=0- получили обратно режим работы "Системный сброс"
Где в этом коде изменение битов WDCE(чтобы разрешить сделать WDE=0),WDE, WDIE, чтобы получить режим:
1) WDE=0 ,WDIE=1 - "Режим прерывания";
1) WDE=1, WDIE=1 - "Режим прерывания и сброс".
ЗЫ:с этой темой плотно столкнулся когда некоторый товарищ уверял, что у него по этой же схеме Attiny13 просыпается и каждые 30 минут передает данные .Но практика показывала шишу..))
Отредактировано Niya (2018-11-17 20:22:07)