¿Cómo es este código de rebote de botón?

6

Estoy monitoreando un botón pulsador con un microcontrolador donde trato de cuidar cuatro cosas juntos:

  1. 50-msec debounce en push-begin y 25-msec en push-release
  2. identificar una pulsación corta, definida como cuando se suelta el botón dentro de < 1 segundo
  3. identifique una retención prolongada, definida como cuando pasa 1 segundo desde que se presiona el botón de inicio
  4. duerme lo más posible cuando no estés haciendo otra cosa

A continuación se muestra un breve pseudocódigo de lo que he implementado hasta ahora. Creo que cubre todos estos casos.

¿Ve algún posible refinamiento o posible problema? (Por ejemplo, me interesan los casos sutiles que podrían ser puntos ciegos 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
} 
    
pregunta boardbite

1 respuesta

7

No puedo poner código en un comentario, de ahí una respuesta. Mi 'marco' para sistemas integrados simples es el bucle principal con el sondeo. Para minimizar el consumo de corriente, el bucle principal puede esperar, digamos 50 ms en modo inactivo. No sé qué uC usa, estoy familiarizado con los PIC, que pueden despertarse 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;
    }
 }
    
respondido por el Wouter van Ooijen

Lea otras preguntas en las etiquetas