оживлю тему своим некропостом. для tiny2313 не могу вызвать программное прерывание по переполнению счетчика WDT. код на IAR, который по идее должен зажечь пин Б0 после срабатывание прерывания:
Код
//IAR Assembler for AVR 5.20.1 (5.20.1.50092)
#include <inavr.h>
#include <iotiny2313.h>
#pragma vector = WDT_vect
__interrupt void WDT_ISR(void)
{
MCUSR &= ~(1 << WDRF);
WDTCR |= (1<<WDIE); // set WDIE to avoid hardware reset
DDRB &= ~(1 << PINB0);
PORTB |= (1 << PINB0); //лог 1 на пинБ0
}
void main(void)
{
__disable_interrupt();
__watchdog_reset();
MCUSR &= ~(1<<WDRF);
WDTCR |= (1<<WDCE) | (1<<WDE);
WDTCR = (1<<WDP0) | (1<<WDP3) | (1<<WDIE); //на 4с
__enable_interrupt();
while(1);
}
Proteus 7.5SP3 (7401) пишет WD Timer expired - Interrupt generated, но в обработчик прерывания не переходит. 7й бит в MCUSR выставляется в 1. Если вместо 1<<WDIE выставить 1<<WDE, мк будет хардрезетиться как и ожидалось. я чего-то не понимаю, в чем может быть дело?
avr studio 4.16 (628) из бесконечного цикла тоже не выходит (впрочем как и в примере, приведенном постом выше)