El programa se cancela después de ISR

0

Primero, soy nuevo en esto y me registré para obtener ayuda sobre este problema que he tenido. He hecho muchas búsquedas en Google para resolver este problema y sin suerte. Estoy tratando de capturar la señal del sensor de humedad usando un temporizador A para MSP43055229 en el código composer6.0.1 Soy nuevo en microcontroladores, así que no dude en venir conmigo. Pero de todos modos, cuando estoy en modo de captura y el programa entra en mi ISR, capturará solo dos flancos descendentes y luego saltará fuera del programa completo y entrará en boot.c , copy_zer_init.c , copy_decompress.c entre otros programas.

De la investigación que he recopilado sobre esto, parece estar relacionado con el temporizador de vigilancia que he desactivado. cuando comento el
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
de mi código, el programa solo captura dos bordes (se supone que captura unos 40 bordes descendentes de la señal entrante por cierto, no estoy seguro de por qué no lo hace. Por favor, ayuda si puedes en esa parte también si no está relacionado con el problema principal), pero en lugar de saltar de todo mi programa, vuelve a la función principal y se detiene en mi bucle while(1); .

Así que creo que puede tener algo que ver con el perro guardián, pero no estoy seguro. ¡Por favor ayuda!

NOTA: mi código envía una señal "baja" al sensor de humedad durante 18 ms y luego a "alta" y luego espera una respuesta.

#include "msp430.h"
#include "intrinsics.h"
//#include "stdint.h"

unsigned init_flag=0;// using
unsigned int mode;
unsigned int i=0;
//unsigned int ta1ccr2_delay = 20000;//delay of 20,000 with smclk/8 = 160ms delay
//unsigned int current_event = 0; //store current rising/falling edge
//unsigned int previous_event = 0; // store old rising/falling edge
//unsigned int diff = 0; // store difference in rising/falling edge
//unsigned int record_array[16];                // RAM array for differences
unsigned int raw_data[41];
/*---------equations-------------------------------------
 * # of clk cycles  = 18ms*1MHz = 18000 clock cycles for and 18ms delay
 * 80us delay = 80/1MHz for initial start up of send signal
 * approx. 40us
 *
 *
 */

/*
 * main.c
 */
int main(void){
    WDTCTL = WDTPW | WDTHOLD;   // Stop watchdog timer
//  int _system_pre_init(void);
    unsigned int flag=80;
//  unsigned int i = 0;
//  unsigned int j = 0;



/*--------PORT2 initialization---------------------------------------*/
          P2DIR |= BIT3; //output
          P2OUT |= BIT3;//high

          P1DIR |= BIT0;// led1 output
          P1OUT &=~ BIT0;

/*------------defining Timer A1 ---------------------------------*/
/***************** TimerA set up: using timer A1 for COMPARE *************************************/
          TA1CCR0 = flag; // upper limit of TAR..used just to enter timer ISR
          TA1CCTL0 = CCIE;// capture/compare control Interrupt enable
          TA1CTL = TASSEL_2 | MC_1 | TACLR | ID_0;//SMCLK | upmode(ccr0 limit) | clear TAR after every limit is reached | don't divide
          __no_operation();//for debugging
          __enable_interrupt();
          while(1);
    //        _BIS_SR(LPM0_bits + GIE);  //         places CPU in low power mode with interrupts enabled.;
          return 0;
}


// Timer A1 interrupt service routine

#pragma vector=TIMER1_A0_VECTOR
__interrupt void activate_Sensor_ISR(void)// delay for either 18ms or 40us
{
    switch(init_flag){
        case 0:// start signal
            P2OUT &=~ BIT3;//set low
            init_flag = 1;
            mode = 18000; // 18ms delay
            TA1CCR0 = mode;// change upper limit of TAR
            break;
        case 1:
            P2OUT |= BIT3;// set high again
            init_flag = 2;//dont count anymore
            TA1CCR0 = mode;
            P2DIR &=~ BIT3;//set as input now
            P2SEL |= BIT3;//ta2.0
            TA2CTL = TASSEL_2 | MC_2 | TACLR | TAIE; // Setting up TIMERA for capture mode
            //setting up capture/control
            TA2CCTL0 =  CM_2 | CCIS_0| /*SCS |*/ CAP | CCIE;// capture falling edge | P2.3(CCIS_0)| Capture, enable interrupt
            TA1CTL = MC_0;
            break;
        default:
            break;
    }
}

#pragma vector=TIMER2_A0_VECTOR//ISR for capture mode
__interrupt void capture_signal_ISR(void)
{
    raw_data[i] = TA2CCR0;//current_event;
    i++;
}
    
pregunta Jimmy Mejia

1 respuesta

1

En la interrupción de captura, estás llenando la matriz raw_data[41] con nada para evitar que se desborde. Si obtiene más de 41 interrupciones, comenzará a pisotear otras ubicaciones de RAM, lo que probablemente bloqueará el programa.

Mi conjetura es que con el watchdog habilitado se dispara antes de que la matriz pueda desbordarse, entonces el programa se reinicia y parece estar atascado en el while(1) porque ahí es donde pasa la mayor parte de su tiempo. Con el watchdog desactivado, las interrupciones siguen llegando y la matriz se desborda, pisotea la pila de retorno y provoca un salto aleatorio a otro código.

    
respondido por el Bruce Abbott

Lea otras preguntas en las etiquetas