Durante bastante tiempo, he estado usando un controlador avr ATmega324PA y Atmel studio para escribir los programas. escribimos un gestor de arranque TCP. Funciona bien sin ninguna interrupción. Más tarde, agregamos una entrada externa a ese programa y ahora el controlador siempre se reinicia al saltar al ISR. Aquí está el código
void main()
{
init_interrupt();
init_uart();
while(1);
}
void init_interrupt()
{
/* PortA3 as input for external interrupt*/
DDRB|=(0<<2);
/*Pulll up disable*/
PORTB &=~ (1<<PORTB2);
/*Interrupt_vector change enable*/
MCUCR|=(1<<IVCE);
/*Interrupt vector change to boot section*/
MCUCR|=(1<<IVSEL);
/*Interrupt_vector change enable*/
MCUCR&=~(1<<IVSEL);
_delay_ms(5000);
/* Enable external interrupt-2*/
EIMSK |= (1<<INT2);
/* Enable rising edge of the input signal as interrupt*/
EICRA |= (1<<ISC21)|(1<<ISC20);
/* Enable global interrupt*/
sei();
}
ISR(INT2_vect)
{
uart_send("Print on interrupt");
}
Aquí estoy tratando de cambiar el vector de interrupción a la sección de arranque.
NOTA: el fusible BOOTRST ya está configurado
EDITADO: Después de cambiar el valor de MCUCR como se muestra a continuación, lo envié a través de UART en lugar de '01', la salida se muestra como "A0 2E 57 C9 D1 95 91 FF"
MCUCR|=(1<<IVCE);
Debe ser un problema con el registro MCUCR