Pregunta

Sé que cuando se trabaja con la MSP430F2619 y CCSv4 de TI, puedo conseguir más de una interrupción de utilizar el mismo controlador de interrupciones con el código que se ve algo como esto:

#pragma vector=TIMERA1_VECTOR
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void){

ServiceWatchdogTimer();
}

Mi pregunta es, cuando me encuentro en esa interrupción, hay una manera de averiguar cuál de estas interrupciones me tiene aquí?

¿Fue útil?

Solución

La respuesta general a su pregunta es no existe ningún método directo para detectar qué alarma se está llamando actualmente. Sin embargo, cada interrupción tiene su propia bandera de interrupción para que pueda comprobar cada bandera en la interrupción. Que debe y la bandera con el activo en asegurarse de que está manejando la interrupción que en realidad se llamaba. También con los temporizadores en el MSP430 hay TAIV vector que puede decir lo que resuelva en el controlador A1. Caso del 0 TAIV es que no hubo interrupción para manejador A1 así que para ese caso se puede asumir que es el manejador de A0.

Me haría algo como lo siguiente.

#pragma vector=TIMERA0_VECTOR
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A (void)
{
   switch (TAIV)         // Efficient switch-implementation
   {
     case  TAIV_NONE:          // TACCR0             TIMERA0_VECTOR
        break;
     case  TAIV_TACCR1:        // TACCR1             TIMERA1_VECTOR
        break;
     case  TAIV_TACCR2:        // TACCR2             TIMERA1_VECTOR
        break;
     case TBIV_TBIFG:          // Timer_A3 overflow  TIMERA1_VECTOR
        break;
     default;
        break;
   }
   ServiceWatchdogTimer();
}

Otros consejos

No es realmente una "buena" respuesta, pero ¿por qué no hacen 2 manejador de interrupciones separadas llaman la misma función?

algo así como

__interrupt void Timer_A0_handler (void){
  Timer_Handler(0);
}
__interrupt void Timer_A1_handler (void){
  Timer_Handler(1);
}
void Timer_Handler(int which){
  if(which==1){
    ...
  }else{
    ...
  }
  ...
  ServiceWatchdogTimer();
}

En cuanto a la Guía del usuario MSP430x1xx familia , parece el dispositivo no mantiene un registro de estado de interrupción con esa información directamente. Ya sea que usted necesita tener 2 vectores de interrupciones por separado para que pueda identificar la diferencia directamente, o usted tendrá que consultar ambos dispositivos para ver qué necesita el servicio.

Si utiliza 2 vectores de interrupción, que sin duda puede llamar o salto (si está utilizando el montaje) a la misma rutina para llevar a cabo la mayor parte del trabajo como en el respuesta dada por Earlz .

Tenga en cuenta que el chip tiene una una tabla de vector de interrupción ya, así que para hacer lo que está hablando en el comentario que ha hecho en otra respuesta, sólo hay que señalar las entradas vector de interrupción de las interrupciones '' no utilizados a la rutina que genera un error.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top