Здравствуйте!
Пишу код на WinAVR. Инициализация ватчдог-таймера такая:
Код
void wdt_init(void){
asm volatile ("wdr");
MCUSR &=~(1<<WDRF);
WDTCSR = (1<<WDCE);
WDTCSR |= (1<<WDIE)|(1<<WDCE)|(1<<WDP3)|(0<<WDP2)|(0<<WDP1)|(1<<WDP0); // 8s
}
По моим наблюдениям он срабатываетчаще, чем положенные по даташиту раз в 8 секунд. Может я в чем-то ошибся?
Работает он в режиме "только прерывание, без глобального сброса".
Вот код обработчика, может в нем дело:
Код
ISR(WDT_vect){
asm volatile ("wdr");
if (wdt_counter == 10){
wdt_counter = 0;
// Спать!
SMCR = (1<<SM1)|(1<<SE);
asm volatile ("sleep");
OCR0A = 0x00;
OCR0B = 0x00;
OCR2A = 0x00;
}
wdt_counter++;
}
По-хорошему после 10 переполнений собачьего таймера т.е. через 8*10=80 секунд микроконтроллер ATmega48 должен заснуть, он же у меня засыпает буквально через пару десятков миллисекунд после запуска.
В чем подвох? Спасибо!