problema de interrupción del cargador de arranque AVR

1

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

    
pregunta gzix

1 respuesta

2

Por último, esta es la forma de hacer que funcionen las interrupciones en el cargador de arranque, U debe establecer el bit de habilitación de cambio de vector de interrupción (IVCE) como se muestra a continuación

   MCUCR|=(1<<IVCE); // or GICR|=(1<<IVCE) in some controllers

Y dentro de cuatro ciclos, tienes que configurar el IVSEL y desarmar el bit del IVCE.

   MCUCR=0x02; // or GICR=0x02;  IVSEL=1, IVCE=0 at same time

Lo que salió mal en el código anterior está abajo

     /*Interrupt_vector change enable*/
    MCUCR|=(1<<IVCE);
    /*Interrupt vector change to boot section*/
    MCUCR|=(1<<IVSEL);
    /*Interrupt_vector change enable*/
    MCUCR&=~(1<<IVSEL);

El método anterior podría terminar dentro de cuatro ciclos, creo. Sin embargo, ahora puedo usar el cargador de arranque TCP con interrupciones para cargar el código de la aplicación.

    
respondido por el gzix

Lea otras preguntas en las etiquetas