Multiplexación vs registros de desplazamiento (entrada)

0

Voy a usar un microcontrolador para leer 80 entradas digitales (pulsadores). Me pregunto (solo para comprender, no tengo ninguna restricción de tiempo crítica) si tomaría menos tiempo usar multiplexación sobre una matriz de 9 * 9 (pero usar un registro de desplazamiento en las filas para reducir los pines usados en la uC, y columnas conectadas directamente a la unidad uC) o utilizando registros de desplazamiento encadenados 10x (74HC165). Estoy teniendo dificultades para calcular eso, así que estoy pidiendo una aclaración. Además, ¿cómo cambia eso si uso SPI? Otras suposiciones: - uC: arduino uno - Me gustaría considerar también el tiempo necesario en el software para proporcionar los datos en un formato "limpio". Gracias

    
pregunta Dimitri Petrucci

3 respuestas

0

Aquí hay una forma: conecte en margarita los 10 registros de cambio con resistencias pullup en sus entradas, botones para conectar los pines a Gnd cuando se presionan. Escanear periódicamente (código de estilo Arduino C ++):

total = 0;
digitalWrite (latchInPin, LOW):
digitalWrite (latchInPin, HIGH); // capture the input states
for (x=0, x<10; x=x+1){
inputArray[x] = SPI.transfer(0);  // this loop can be fast, maybe 25 uS with 8 MHz SPI clock
total = total + inputArray[x];
}
if (total == 0x08F7){
// no zeros found, go to next scan period
}
else {
// one or more zeros was found, process it from the array
}

También podría DIODEAR Y todas las entradas juntas, solo hacer el pestillo y luego escanear cuando se detectó un BAJO de los diodos en una línea de interrupción.

    
respondido por el CrossRoads
0

Hay tantas posibilidades que ni siquiera sé por dónde empezar.

Todo depende de dos cosas: el cableado de los botones y la disponibilidad de los pines MCU. Usted mencionó primero "interruptores de botón", luego "9 * 9 matriz". Si tiene un teclado de matriz con diodos incorporados, una cosa es que si tiene botones pulsadores discretos que planea ensamblar en la matriz, es completamente diferente.

Tenga en cuenta que la disposición física de los botones no tiene nada que ver con el cableado eléctrico. Por ejemplo, un solo 74LS674 de 16 bits necesita solo 5 cables adicionales para leer los 80 botones . Los botones se pueden colocar 9x9, 4x20 etc.

De todos modos, aquí hay solo algunas de las opciones.

  • Para la matriz con diodos, puede usar Both , multiplexor para columnas y registro de desplazamiento en filas. Esto reducirá aún más el número requerido de pines.

  • También puede usar BCD para decodificar decimales como HCF4028B en lugar de multiplexor.

  • Puede usar dos chips I2C o SPI mux-demux. Esto reducirá el número de pines IO requeridos a solo 2, pero aumentará mucho el tiempo de sondeo.

  • Puede usar un solo ADG725 . Tiene dos muxes de 16 bits, así que puedes usar uno para las columnas y el otro para las filas. Esta opción tiene un cableado extremadamente fácil.

  • Si no conecta sus botones a la matriz, puede usar una cadena de 9 registros de turnos como en su pregunta. O puede usar 3 ADG731 , cada uno es de 32 bits.

Ahora, con respecto al tiempo de procesamiento . Los registros de desplazamiento requieren sincronización para leer datos. En este sentido, son más lentos que los muxes o decodificadores con entrada de dirección binaria. Sin embargo, los últimos requieren que cambie entre todas las direcciones para obtener una lectura, por lo que al final son un poco más lentos. Los chips con control I2C o SPI serán aún más lentos.

Sin embargo, las diferencias entre los chips no definen el tiempo de procesamiento, ya que son insignificantes en comparación con los tiempos de la interacción humana. El factor definitorio es la latencia del sistema y el tiempo de pulsación más corto del botón que desea detectar. En todos los esquemas anteriores (y en su pregunta) necesita un sondeo muy frecuente por MCU. No es el mejor uso del tiempo de MCU, realmente.

No especificó en la pregunta si se supone que su MCU debe hacer algo entre pulsaciones, o solo debe reaccionar cuando se presiona el botón. En el primer caso, MCU puede sondear constantemente la matriz. No tiene nada más que hacer de todos modos. En este último necesitas algo mejor.

Por lo tanto, aquí hay un truco que puedes usar para minimizar el tiempo de reacción sin sondear constantemente:

  • Use el registro de desplazamiento de salida como 74HC595 en las columnas. Esto le permitiría encender varias columnas simultáneamente, algo que los muxes o decodificadores no pueden hacer.
  • Use el registro de desplazamiento de entrada como 74HC165 en las filas.
  • También conecte todas las filas a través de diodos en una sola línea conectada para separar GPIO.
  • Introduzca "modo de espera" en su código. En este modo, todas las líneas de salida de todas son altas, por lo que al presionar el botón cualquiera se generará una señal en una de las filas. Y, en consecuencia, esto producirá una señal en esa línea adicional que combina las filas.
  • Programa ese pin para interrumpir. Esto liberaría todo el tiempo de MCU para sus otras necesidades. Cuando la interrupción se dispara, se activará la bandera booleana que indica a su bucle principal que se debe procesar el botón. Luego, el bucle principal puede pausar lo que estaba haciendo, realizar algunas funciones de rebote y usar registros de desplazamiento para averiguar qué botón se presiona. Cuando el botón se suelta, vuelve a rebotar y anula la opción para volver al modo de espera.

Tenga en cuenta que el truco anterior también se puede utilizar con un teclado no matricial. Solo que en lugar de combinar filas, combinarás todos los botones en una línea de interrupción.

En resumen, hay casi demasiadas opciones disponibles para ti. Calcule la latencia requerida del sistema y la cantidad de pines que puede ahorrar, esto lo reducirá.

    
respondido por el Maple
0

Esto es lo que estaba describiendo en mi comentario anterior.

Corregido para la orientación del diodo, los hice voltear de extremo a extremo.

    
respondido por el CrossRoads

Lea otras preguntas en las etiquetas