Pressionando as mesmas linhas principais ao mesmo tempo


9

Estou projetando um teclado em VHDL. Tudo funciona bem quando apenas uma tecla é pressionada. Estou digitalizando cada coluna para pressionar uma tecla em uma máquina de estado e quando nenhuma tecla é pressionada, que é a condição que pin4pin6pin7pin2 = "0000"eu alterno para o próximo estado para digitalizar a próxima coluna. Assim, defino as colunas pin3pin1pin5sequencialmente para "001", "010"e "100".

Durante a digitalização de pin3pin1pin5como "001"e se pin4pin6pin7pin2é "0100", em seguida, simplesmente "9" é pressionado. Declaro em VHDL pin4pin6pin7pin2como pin3pin1pin5portas de entrada e saída. Quando eu pressiono 6 e 9 ao mesmo tempo pin6e pin7são high. A primeira tecla pressionada é lida, a segunda é ignorada. Quando pressiono 3 e 7 ao mesmo tempo, o primeiro pressiona com alguns ms antes de vencer e a primeira tecla é lida, a segunda tecla é ignorada pin2e o pin4é high.

Aqui está a parte complicada. Quando pressiono 4 e 6 ao mesmo tempo, espero pin7ser, highmas ele se torna lowe pin4pin6pin7pin2 = "0000", o que não entendo como e por quê. Como "0000"é detectada como uma tecla não pressionada, a máquina de estado pula de estado para estado. Enquanto segura 4 e 6, se alguém empurra e sai 4 várias vezes, é detectado como 6 pressionado várias vezes, o que é um grande erro . Ficaria feliz se você puder me ajudar a depurar isso!

O mesmo acontece com "1" e "2", o mesmo com "7" e "8" apenas para as chaves na mesma linha. Como este é um projeto em andamento, não posso colocar meu código VHDL on-line :( Ficaria feliz se você pudesse me dar dicas para superar isso!

insira a descrição da imagem aqui

Abaixo, não estou carregando meu código no quadro, nenhum código está sendo executado. Ao conectar Pin5ao terra, uma única pressão de 1,2,4,5,7,8, *, 0 não Pin3acende o LED, mas se eu estiver pressionando 6 e 4 ao mesmo tempo, o Pin3LED está aceso e o Pin7LED ainda está aceso, mas quando meu código está sendo executado, isso não acontece. Talvez eu tenha conectado algo errado e, felizmente, Pin7esteja ligado, eu não sei ...

insira a descrição da imagem aqui

Abaixo está o esquema da placa do teclado:

Esquemas


Como você está assegurando que pressionar 4 e 6 ao mesmo tempo não curto os pinos 3 e 5 juntos?
Fru1tbat 11/11/2014

@ fru1tbat Você pode falar um pouco mais? Sem fazer upload do meu código quando a placa não tem nada ligado, conecto o pino 5 ao terra, o LED pin5 está aceso e pressiono "6" o pin7 LED acende depois, pressiono "4" e "6" ao mesmo tempo dessa vez pin3 O LED está aceso e o LED pin7 ainda está aceso.
Anarkie

@ Você quer dizer que eu deveria usar pull-up para linhas e pull-up para colunas? Não consigo modificar o circuito. Também não entendi muito do seu comentário :(
Anarkie

Para ser mais completo, darei uma resposta. Seria útil se você pudesse fornecer um esquema mostrando resistores, LEDs, drivers de coluna e quaisquer inversores ou transistores que possam estar no circuito. As 4 linhas e 3 colunas estão conectadas diretamente a um CPLD ou FPGA?
Tut

@Tut O teclado não está diretamente conectado ao FPGA; existe outra placa no meio, para conectar várias placas ao FPGA e eu adicionei os esquemas.
Anarkie

Respostas:


4

A resposta curta:

Inverta sua lógica. Conduza as linhas de seleção de coluna com a lógica de dreno aberto (ou coletor aberto) em que a coluna selecionada é puxada para baixo e as colunas não selecionadas estão flutuando. Quando você olha para uma linha, um pressionamento de tecla é detectado por um '0'. As teclas não pressionadas serão detectadas por um '1'.

Agora os detalhes:

Como a EEIngenuity aponta, quando você pressiona 2 botões na mesma linha, isso resulta em um curto-circuito entre as colunas correspondentes. Isso (e outros problemas que envolvem várias pressionamentos de tecla) geralmente é superado em uma matriz de teclado , adicionando um diodo em série a cada comutador.

Como adicionar diodos não é uma opção para você, será necessário flutuar as saídas das seleções de coluna inativas para evitar tentar conduzi-las para a polaridade oposta à seleção de coluna ativa. Isso é feito usando a lógica de dreno aberto. Se sua coluna selecionada estiver vinculada diretamente a um CPLD ou FPGA, você poderá fazer isso no seu código VHDL.

A foto na sua pergunta mostra que você tem um resistor de pull-up em cada coluna e cada linha. As flexões nas colunas são desnecessárias, mas não prejudicam nada. As pull-ups em cada linha garantirão uma condição alta, a menos que o driver de dreno aberto na coluna selecione baixo (através de uma chave fechada).

Eu tive que fazer algumas suposições sobre o seu circuito, pois você não forneceu um esquema completo ou seu código VHDL. Você diz

quando nenhuma tecla é pressionada, qual é a condição pin4pin6pin7pin2 = "0000"

No entanto, na foto que você fornece, os resistores pull-up são mostrados. Isso implica que você já tem uma inversão lógica em algum lugar, possivelmente no seu código VHDL ou (menos provável) inversores entre suas linhas e o seu dispositivo lógico (CPLD ou FPGA).

Editar:

De acordo com seu comentário, você está usando lógica negativa em suas descrições: "0000" indica que todos os quatro pinos estão altos, etc. Nesse caso, assumindo que a coluna seleciona e os sinais de linha vão diretamente do conector 2 no seu esquema para o FPGA, apenas siga minhas instruções acima usando a lógica de dreno aberto para as saídas de seleção de coluna no seu FPGA.

Não sou especialista em VHDL, mas achei isso no Xilinx :

Inferir o buffer de drenagem aberto usando o seguinte código:

VHDL:

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

Observe também no seu esquema que todos os LEDs são mostrados com fio para trás. Os ânodos vão para os resistores limitadores de corrente e os cátodos vão para as linhas de sinal. Os LEDs acendem quando as linhas de sinal são puxadas para baixo.


Estou prestes a digitalizar os esquemas de instalar o driver do scanner
Anarkie

Você está certo quanto ao fato de pin4pin6pin7pin2 = "0000"não pressionar a tecla 1111. Na minha pergunta 1s deve 0, 0s deve ser 1s, tentei cripta a questão um pouco, pena de que, se ele causou mal-entendidos ...
Anarkie

Eu adicionei os esquemas.
Anarkie

muito obrigado por suas explicações, depois de ler sua resposta, eu tenho algumas idéias, mas primeiro o que você quer dizer com "colunas flutuantes", "precisa flutuar as saídas", com float você quer dizer: 110, 101, 011? Isso já estou fazendo, na verdade, no meu código, quando uma tecla é pressionada, todas as outras devem ser ignoradas. Só não entendo como o LED apaga e o pin7 fica alto (1) enquanto o código está em execução. Enfim, se eu entendi correta é a sua solução sugerindo enquanto Im digitalização pin5, portas de saída "110", eu deveria ter out <= 'pin3' when din='1' else '0';
Anarkie

11
Veja o link que forneci: dreno aberto (ou coletor aberto) . A coluna ativa é selecionada ao conduzir 0V nessa linha de coluna. As colunas inativas NÃO devem ser acionadas com 3,3V nessa linha, mas precisam ser flutuadas (colocadas em um estado de alta impedância) que efetivamente desconecte essas linhas do circuito. Se você tentar direcioná-los para 3,3V, o curto-circuito criado ao pressionar 2 botões na mesma linha ao mesmo tempo causará uma disputa entre um que está tentando dirigir baixo e os outros que estão tentando dirigir alto.
Tut

2

Como você está usando VHDL e possui uma entrada assíncrona, estou escrevendo esta resposta para garantir que você tomou uma precaução. Não tenho certeza se esse é o seu problema, mas pode muito bem ser.

Veja uma pergunta que fiz há algum tempo: VHDL: módulo de recebimento falha aleatoriamente ao contar bits

Agora você diz isso:

Como "0000" é detectado como uma tecla não pressionada, a máquina de estados passa de estado para estado. Enquanto segura 4 e 6, se alguém empurra e sai 4 várias vezes, é detectado como 6 pressionado várias vezes, o que é um grande erro.

O que é um pouco semelhante ao que eu estava enfrentando. Eu tive um problema em que minha máquina de estados ignorava estados, o que parecia impossível.

Se você ler as respostas para a pergunta vinculada acima, verá que é recomendável adicionar um sincronizador à linha de entrada antes que ela seja alimentada em sua máquina de estado. Isso geralmente é realizado com dois chinelos D em série:

insira a descrição da imagem aqui

Não ter a entrada do botão sincronizada com o HW causa problemas muito bizarros, que eu experimentei no meu projeto N64. Adicionar este pouco de HW foi quase como mágica.

Portanto, verifique primeiro se suas entradas estão sendo sincronizadas.


Para implementar o sincronizador na resposta não parece ser difícil, mas quando eu leio o processo, o que eu entendo é que async_inestá atrasado com 3 ciclos de clock, mas seu valor e tudo são iguais?
Anarkie

A grande diferença é que seu sinal será convertido de assíncrono para síncrono. O que acontece no HW às vezes com sinais assíncronos (como os botões) é que os bits estão na "metaestabilidade", isso causa erros muito estranhos no HW. O uso dos chinelos D garante que a metaestabilidade não ocorra no seu design. Eu também estava cético em relação à eficácia disso, mas ele resolveu meu problema perfeitamente.
Nick Williams

Eu tentei, valia a pena tentar, mas não ajudou :(
Anarkie

1

Esta é uma pergunta interessante! O motivo pelo qual você vê um baixo no pin7 ao pressionar as teclas 4 e 6 é por causa dos pinos 3 e 5.

Para explicar melhor, o pin3 e o pin5 nunca serão altos ao mesmo tempo - um deles sempre será um caminho para o solo (de acordo com o seu design). Assim, quando você pressiona as teclas 4 e 6, está criando um caminho para o aterramento do pino7.

Veja a imagem:

O pino 7 vê um caminho para o solo.  Você tem um curto-circuito.


Adicionei uma foto à minha pergunta e o pin7 parece alto quando as duas teclas são pressionadas.
Anarkie

O OP explicou que ele não eleva os pinos 3, 1 ou 5 HIGH ao mesmo tempo, a qualquer momento. Ele seqüências das colunas com: "001", "010" e "100 Pins 3 e 5 são nunca ALTA simultaneamente, para começar.
Nick Williams

11
Esse é o ponto que a @EEIngenuity está tentando definir - há um caminho aparente entre os pinos 3 e 5, que nunca terá o mesmo valor ", portanto, quando você pressiona as teclas 4 e 6, está criando um caminho para o pino7. "
Fru1tbat 11/11

11
@Anarkie Na imagem, o Pin3 não está conectado ao GND ou VDD. É um nó flutuante. Isso não cria o cenário de curto-circuito que você possui em sua avaliação original. Tente conectar o pino 3 ao VDD e o pino 5 ao GND e repita este teste.
Miron V 13/06

11
@EEIngenuity Você está absolutamente certo !!! Sim, sim, quando conecto o pin3 ao VDD, o pin7 fica baixo !!! Então, por favor me ajude como posso superar esse problema e fazê-lo funcionar :( Estou usando VHDL e também outro colega que está no mesmo projeto em uma equipe diferente, não enfrenta esse problema, de alguma forma ele o resolveu, mas eu não sei como, mesmo teclado, mesma placa!
Anarkie
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.