Eliminar el rebote de un pulsador con el temporizador del watchdog

La manera más rápida de eliminar el rebote del pulsador es con un condensador. Utilizar el temporizador del watchdog permite sustituir el condenador por un poco de código.

Un pulsador conectado a un MSP430G2252

Un pulsador conectado a un MSP430G2252


La resistencia pull-up interna del microcontrolador mantiene la entrada High. El pulsador conecta la entrada del microcontrolador con GND. Al pulsarlo la entrada pasa a Low. Esto hace que se ejecute la interrupción asociada a la entrada.

La rutina de la interrupción de la entrada termina desactivando las interrupciones y conectando el watchdog.

    P1IE &= ~ BIT0; // Desactiva la interrupción
    startWatchdog(); // Activa el watchdog

La rutina que conecta el watchdog define el intervalo del temporizador en WDTCTL.

void startWatchdog (void) {
  WDTCTL = WDT_ADLY_250;// Este valor parece funcionar con el
                        // oscilador interno de 12 Khz
  IFG1 &= ~WDTIFG; 	// reset flag
  IE1 |= WDTIE; 	// Enable WDT interrupt  
}

Pasado el intervalo definido en WDTCTL se ejecuta la interrupción del watchdog. Esta detiene el watchdog y vuelve a activar la interrupción de la entrada.

#pragma vector = WDT_VECTOR
__interrupt void watchdog(void) {
  WDTCTL = WDTPW | WDTHOLD;
  IE1 &= ~WDTIE;
  P1IFG &= ~BIT0;
  P1IE |= BIT0;
}

El codigo

// configurar el pin 1.0
P1DIR &= ~ BIT0;	// entrada
P1REN |= BIT0;		// resistencia activada
P1OUT |= BIT0;		// resistencia pull-up
P1IE |= BIT0;		// interrupción en transición high-low
P1IFG &= BIT0;		// reset del flag de la interrupción
P1IE |= BIT0;		// activa la interrupción


void startWatchdog (void) {
  WDTCTL = WDT_ADLY_250;// Este valor parece funcionar con el
                        // oscilador interno de 12 Khz
  IFG1 &= ~WDTIFG; 	// reset flag
  IE1 |= WDTIE; 	// Enable WDT interrupt  
}


#pragma vector = WDT_VECTOR
__interrupt void watchdog(void) {
  WDTCTL = WDTPW | WDTHOLD;
  IE1 &= ~WDTIE;
  P1IFG &= ~BIT0;
  P1IE |= BIT0;
}


#pragma vector = PORT1_VECTOR
__interrupt void port1_ISR(void){
    if ((P1IFG & BIT0) == BIT0) {
    	__bic_SR_register_on_exit(LPM4_bits);
    	P1IFG &= ~BIT0;
    }
    
    P1IE &= ~ BIT0; // Desactiva la interrupción
    startWatchdog(); // Activa el watchdog

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.