impulso de conteo en el firmware sin interrupción

1

¿Cómo puedo contar la cantidad de pulsos usando un microcontrolador (cualquiera), siempre que se cumplan las siguientes condiciones?

  1. No se puede usar ninguna interrupción (no se permiten interrupciones en el cambio de pin)
  2. No se puede usar ninguna de las funciones de hardware de uC (contador, temporizador, etc.)

El ancho del pulso es aleatorio y no se puede predecir de antemano. Este tren de impulsos se administra a uno de los pines IO de propósito general. La solución debe basarse exclusivamente en software (C / ensamblaje).

El método de eliminación de rebotes por software que lee el estado del pin como una serie de 0 y 1 es una opción posible, pero necesita codificar el patrón de transición, lo que significa que necesita conocer el ancho del pulso por adelantado y, por lo tanto, no se puede aceptar. .

¿Alguna idea?

PS: Esta pregunta se hizo en una entrevista técnica con uno de los principales proveedores de componentes automotrices.

    
pregunta HKL

1 respuesta

6

Tenemos que asumir que "es imposible" no es la respuesta correcta, así que eso significa que podemos suponer que la CPU tiene suficiente potencia para sondear el pin a una velocidad lo suficientemente rápida como para no perder ningún impulso.

No sé por qué cree que "necesita codificar el patrón de transición" . Todo lo que necesita hacer es encontrar las transiciones 0 → 1 y 1 → 0 y contar una u otra. Lo único que se requiere es realizar un seguimiento del estado anterior del pin.

En pseudocódigo:

count = 0;
prev_pin = read_pin();
while (true) {
    pin = read_pin();
    if (pin && !prev_pin) ++count;
    prev_pin = pin;
}
    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas