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++;
}