Diferentes modos de bajo consumo en el MSP430 en función del estado del programa.

La idea es manejar un circuito de alarma con el MSP430. El microcontrolador se mantiene en LPM4 mientras espera la señal del pulsador para despertar. Cuando llega la señal, arranca el temporizador y se pone en LPM3. Pasado un tiempo, la interrupción del temporizador avisa de que se puede volver a LPM4 y reducir aun más el consumo.

d01

El programa es una maquina de estado con dos estados:
STOP_ALARM: La alarma está detenida y el micro en LPM4
START_ALARM: La alarma esta sonando, el temporizador corriendo y el micro en LPM3

El bucle principal es un switch encargado de ejecutar las rutinas de los estados y que al terminar pone al micro en LPM3 o LPM4 dependiendo del estado. IMPORTANTE también activar las interrupciones al entrar en bajo consumo.

Las interrupciones actualizan la variable de estado y reanudan el programa.

// Unas definiciones
#define ENABLE_MOSFET  P1OUT |= PIN_MOSFET;
#define DISABLE_MOSFET P1OUT &= ~PIN_MOSFET;

#define STOP_TIMER TA0CTL = MC_0;
#define IS_TIMER0_DISABLED TA0CTL == MC_0

#define STOP_ALARM 0
#define START_POLICE_ALARM 1

// La variable de estado puede ser STOP_ALARM o START_POLICE_ALARM
// Inicializada a STOP_ALARM
unsigned char state = STOP_ALARM;

int main(void)
{
  while(1) {
    switch (state) {
      case STOP_ALARM:	// detener alarma
	DISABLE_MOSFET	// Detener el sonido
	STOP_TIMER	// Detener el temporizador
	__bis_SR_register(LPM4_bits | GIE);	// Entar en LPM4
	break;

      case START_POLICE_ALARM:	// Iniciar alarma
	ENABLE_MOSFET		// Iniciar sonido
	initTimer0();		// Iniciar el temporizador
	__bis_SR_register(LPM3_bits | GIE);	// Entar en LPM3
	break;
      }
  }
}


#pragma vector=TIMER0_A0_VECTOR
__interrupt void timer0_ISR(void)
{
  // Interrupción del temporizador:
  // Entra en estado STOP_ALARM
  // Reanuda la ejecución saliendo de LPM3
  state = STOP_ALARM;
  __bic_SR_register_on_exit(LPM3_bits);
}


#pragma vector = PORT1_VECTOR
__interrupt void port1_ISR(void){
  // Interrupción del pulsador
  if ((P1IFG & BIT0) == BIT0) {
    if (IS_TIMER0_DISABLED) {
      // Si la alarma esta apagada, entrar en estado de
      // encender la alarma.
      state = START_POLICE_ALARM;
    } else {
      // Si está encendida, estado de apagarla
      state = STOP_ALARM;
    }
    
    // Reanuda la ejecución saliendo de LPM4
    __bic_SR_register_on_exit(LPM4_bits);

    P1IFG &= ~BIT0;
  }
}

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Time limit is exhausted. Please reload CAPTCHA.