Fonte de interrupção do Ti MSP430
-
26-09-2019 - |
Pergunta
Sei que, ao trabalhar com o MSP430F2619 e o CCSV4 da TI, posso obter mais de uma interrupção para usar o mesmo manipulador de interrupção com código que se parece com o seguinte:
#pragma vector=TIMERA1_VECTOR
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void){
ServiceWatchdogTimer();
}
Minha pergunta é que, quando me encontro nessa interrupção, existe uma maneira de descobrir qual dessas interrupções me levou aqui?
Solução
A resposta geral à sua pergunta não é que não exista um método direto para detectar qual interrupção está sendo chamada atualmente. No entanto, cada interrupção possui seu próprio sinalizador de interrupção para que você possa verificar cada sinalizador na interrupção. Você deve e a bandeira com a ativação de garantir que você esteja lidando com a interrupção que realmente foi chamada. Também com os temporizadores no MSP430, há o Vector Taiv, que pode dizer o que lidar no manipulador A1. O caso 0 do TAIV é que não houve interrupção para o manipulador A1; portanto, para esse caso, você pode assumir que é o manipulador A0.
Eu faria algo como o seguinte.
#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();
}
Outras dicas
Não é realmente uma resposta "boa", mas por que não fazer 2 manipuladores de interrupção separados chamam a mesma função?
algo 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();
}
Olhando para o Guia do usuário da família MSP430x1xx, parece que o dispositivo não mantém um registro de status de interrupção diretamente com essas informações. Você precisará ter dois vetores de interrupções separados para identificar diretamente a diferença ou precisará consultar os dois dispositivos para ver quais necessidades de serviço.
Se você usar 2 vetores de interrupção, eles certamente podem ligar ou pular (se você estiver usando a montagem) para a mesma rotina para executar a maior parte do trabalho como no Resposta dada por Earlz.
Observe que o chip já tem uma tabela de vetor de interrupção, para fazer o que você está falando no comentário que fez em outra resposta, basta apontar as entradas do vetor de interrupção para as interrupções 'não utilizadas' para a rotina que joga um erro.