Presionando las mismas filas de teclas al mismo tiempo

9

Estoy diseñando un teclado en VHDL. Todo funciona bien cuando se presiona una sola tecla. Estoy escaneando cada columna para una pulsación de tecla en una máquina de estado y cuando no se presiona ninguna tecla, que es la condición pin4pin6pin7pin2 = "0000" , cambio al siguiente estado para escanear la siguiente columna. Por lo tanto, establezco las columnas pin3pin1pin5 secuencialmente a "001" , "010" y "100" .

Mientras se escanea pin3pin1pin5 como "001" y si pin4pin6pin7pin2 es "0100" , simplemente se presiona "9". Declaro en VHDL pin4pin6pin7pin2 como entrada y pin3pin1pin5 como puertos de salida. Cuando presiono 6 y 9 al mismo tiempo pin6 y pin7 son high . Se lee la primera tecla presionada, se ignora la segunda. Cuando presiono 3 y 7 al mismo tiempo, la primera presionada con pocos ms antes de ganar y la primera tecla se lee, la segunda tecla se ignora, pin2 y pin4 son high .

Aquí está la parte difícil. Cuando presiono 4 y 6 al mismo tiempo, espero que pin7 sea high pero se convierte en low y pin4pin6pin7pin2 = "0000" , lo cual no entiendo cómo y por qué. Debido a que "0000" se detecta como una tecla no presionada, la máquina de estado salta de estado a estado. Mientras mantiene presionados 4 y 6 si uno empuja y deja 4 varias veces, se detecta como 6 presionado varias veces, que es un gran error . ¡Me encantaría que me ayudaran a depurar esto!

Lo mismo sucede con "1" y "2", lo mismo con "7" y "8" solo para las teclas en la misma fila. Dado que este es un proyecto en curso, no puedo poner mi código VHDL en línea :( ¡Me encantaría que me diera consejos para superar esto!

Acontinuación,noestoycargandomicódigoeneltablero,noseestáejecutandoningúncódigo.AlconectarPin5atierra,unasolapulsaciónde1,2,4,5,7,8,*,0noenciendePin3LED,perosipresiona6yluego4almismotiempoPin3LEDestáencendidoyPin7LEDtodavíaestáencendido,perocuandomicódigoseestáejecutandoestonosucede.Talvezconectéalgomaly,porsuerte,Pin7estáencendido,nosé...

A continuación se muestran los esquemas del tablero del teclado:

    
pregunta Anarkie

3 respuestas

4

La respuesta corta:

Invierte tu lógica. Dirigir las líneas de selección de columna con la lógica open-drain (o open-collector) donde la columna seleccionada está baja y la un Las columnas seleccionadas son flotantes. Cuando miras una fila, una pulsación de tecla será detectada por un '0'. Las teclas no pulsadas se detectarán con un '1'.

Ahora los detalles:

Como apunta EEIngenuity, cuando presiona 2 botones en la misma fila, se produce un cortocircuito entre sus columnas correspondientes. Este (y otros problemas que involucran múltiples pulsaciones de teclas) generalmente se superan en una matriz de teclado agregando un diodo en serie con cada interruptor .

Ya que agregar diodos no es una opción para usted, deberá hacer flotar las salidas de sus selecciones de columna inactivas para evitar intentar conducirlas a la polaridad opuesta como su selección de columna activa. Esto se hace usando la lógica de drenaje abierto. Si las selecciones de su columna están vinculadas directamente a un CPLD o FPGA, debería poder lograr esto en su código VHDL.

La foto en tu pregunta muestra que tienes una resistencia de pull-up en cada columna y en cada fila. Los pull-ups en las columnas son innecesarios, pero no dañarán nada. Los pull-ups en cada fila asegurarán una condición alta a menos que el conductor de drenaje abierto de la columna seleccione (a través de un interruptor cerrado).

He tenido que hacer algunas suposiciones sobre su circuito ya que no ha proporcionado un esquema completo o su código VHDL. Usted dice

  

cuando no se presiona ninguna tecla, que es la condición pin4pin6pin7pin2="0000"

sin embargo, a partir de la foto que proporciona, se muestran las resistencias pull-up. Esto implica que ya tiene una inversión lógica en algún lugar, posiblemente en su código VHDL o (menos probable) inversores entre sus filas y su dispositivo lógico (CPLD o FPGA).

Editar:

Según su comentario, está utilizando lógica negativa en sus descripciones: "0000" indica que los cuatro pines son altos, etc. Siendo ese el caso, asumiendo que las selecciones de columna y las señales de las filas van directamente del conector 2 en su esquema al FPGA, simplemente siga mis instrucciones anteriores utilizando la lógica de drenaje abierto para las salidas de selección de columna en su FPGA.

No soy un experto en VHDL, pero encontré esto de Xilinx :

  

Inferir el búfer de drenaje abierto utilizando el siguiente código:

     

VHDL:

     

dout < = 'Z' cuando din = '1' else '0';

También tenga en cuenta en su esquema, todos los LED se muestran cableados hacia atrás. Los ánodos van a las resistencias limitadoras de corriente y los cátodos a las líneas de señal. Los LED se iluminan cuando las líneas de señal están bajas.

    
respondido por el Tut
2

Ya que estás usando VHDL y tienes una entrada asíncrona, escribo esta respuesta para asegurarte de que tomaste una precaución. No estoy seguro de que este sea tu problema, pero podría serlo muy bien.

Vea una pregunta que hice hace un tiempo: VHDL: el módulo de recepción falla aleatoriamente al contar los bits

Ahora, dices que:

  

Debido a que "0000" se detecta como una tecla no presionada, la máquina de estados salta de un estado a otro. Mientras mantiene presionados 4 y 6 si uno empuja y deja 4 varias veces, se detecta como 6 presionado varias veces, lo que es un gran error.

Que es algo similar a lo que estaba enfrentando. Tuve un problema en el que mi máquina de estado omitiría estados, lo que parecía imposible.

Si lee las respuestas a la pregunta vinculada anteriormente, verá que se recomienda agregar un sincronizador a la línea de entrada antes de que ingrese a su máquina de estado. Esto se logra normalmente con dos D Flip Flops en serie:

No tener la entrada del botón sincronizada con tu HW causa problemas muy extraños, que he experimentado con mi proyecto N64. Agregar este poco de HW fue casi mágico.

Por lo tanto, primero compruebe que sus entradas se están sincronizando.

    
respondido por el Nick Williams
1

¡Esta es una pregunta interesante! La razón por la que está viendo una baja en pin7 cuando presiona key4 y key6 es debido a pin3 y pin5.

Para seguir explicando, pin3 y pin5 nunca serán altos al mismo tiempo, uno de ellos siempre será un camino hacia el suelo (de acuerdo con su diseño). Por lo tanto, cuando presiona las teclas 4 y 6, está creando una ruta a tierra para el pin7.

Ver imagen:

    
respondido por el Miron V

Lea otras preguntas en las etiquetas