6 votos

¿Cómo es este pulsador Debounce código?

Yo soy la supervisión de un pulsador con un microcontrolador donde estoy tratando de cuidar de cuatro cosas:

  1. 50 milisegundos de rebote al empuje de comenzar y de 25 mseg de rebote al empuje de liberación
  2. identificar un corto de prensa, que se define como cuando se suelta el botón < 1 segundo
  3. identificar una larga espera, definida como cuando 1 segundo pasa desde el botón push-comenzar
  4. dormir tanto como sea posible cuando no haciendo otra cosa

A continuación, una breve pseudocódigo de lo que he implementado hasta el momento. Creo que cubre todos estos casos.

¿Ve alguna de las posibles mejoras o posibles problemas? (E. g., Estoy interesado en cualquier sutil de los casos que podrían ser blindspots para mi enfoque).

Pseudocódigo:

Main loop {
  Sleep
}

Falling-Interrupt {
  Disable Falling-Interrupt
  Enable 50-millisecond-Debounce-Timer-Interrupt
}

50-millisecond-Debounce-Timer-Interrupt {
  if PushButton state is still LOW {
    Enable Rising-Interrupt
    Enable 1000-millisecond-Hold-Timer-Interrupt
  }
}

1000-millisecond-Hold-Timer-Interrupt {
  Register as Pushbutton long-hold
}

Rising-Interrupt {
  if (Time since Falling-Interrupt < 1000 millisecond) {
    Register as Button Short-press
  }
  Disable 1000-millisecond-Hold-Timer-Interrupt
  Enable 25-millisecond-Debounce-Timer-Interrupt
}

25-millisecond-Debounce-Timer-Interrupt {
   Enable Falling-Interrupt
} 

7voto

GetFree Puntos 495

No puedo poner código en un comentario, por lo tanto, una respuesta. Mi 'marco' para simple sistemas encajados es el principal lazo con interrogación. Para minimizar el consumo de corriente el bucle principal puede esperar vamos a decir 50 ms en modo inactivo. No sé que uC utilizas, estoy familiarizado con las fotos, que pueden despertar de un sueño por una interrupción.

 set up an interrupt to wake me from sleep each 50 ms
 down_counter = 0
 for(;;){
    sleep();
    if( key down ){
       down_counter++;
       if( down_counter == 20 ){
          (start of) long_down detected
       }
    } else {
       if( down_counter > 1 && down_counter < 20 ){
          (end of) short press detected
       }
       down_counter = 0;
    }
 }

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X