Ir ao conteúdo
  • Cadastre-se

Problemas ao ler entrada do PIC acionado por botão!


Posts recomendados

Boa Noite, Estou montando um projeto que esta quase pronto, porém me deparei com uma dificuldade ao ler o um entrada do PIC quando um botão é acionado.

Tenho um botão do tipo circuito fechado, e quando pressiono ele abre o circuito, a intenção é que ao acionar o botão (Mandar 0v na entrada do PIC) e incremente uma variável para posteriormente fazer uma ação,

Meu problema é que o PIC esta lendo como se o botão estivesse sendo pressionado varias vezes mesmo quando não se faz nd!

 

O que preciso é que se o usuário apertar 10 vezes seguidas ele leia somente as 10 vezes.

 

Alguém sabe o que é e como posso solucionar esse problema?

Link para o comentário
Compartilhar em outros sites

@WLS.UAM,

Sim, sabemos !!!

Esse seu problema é causado pelo fato de quando a sua chave fecha ou abre o contato, existem "ruidos" gerados pelo movimento, pois estamos falando de um contato entre dois metais. Esse ruido chama-se Bouncing .

A técnica de se resolver este problema chama-se Debouncing.

Existem vários tópicos sobre isto aqui no Fórum.

Este é bem completo :

http://forum.clubedohardware.com.br/forums/topic/654410-debouncing-para-iniciantes/#entry3634241

Paulo

Link para o comentário
Compartilhar em outros sites

voce pode tentar implementar uma rotina tipo:

      if (input(PIN_x)== 0)         {             //FAÇA ALGUMA COISA                  while(input(PIN_x)== 0);         }

Desse modo o PIC vai 'ler' o botão uma vez a cada pressionada,apenas lembrando que se mantiver apertado o botão a rotina fica esperando o botão ser liberado.

Usando este trecho não precida de alterar o Hardware :)

Link para o comentário
Compartilhar em outros sites

Eu combinaria as duas técnicas para ter o melhor desempenho.

Usando o Debounce por SW você tem repetibilidade da filtragem do sinal do botão.

Usando o Debounce por HW (resistor + capacitor) você reduz o tempo de delay no Debounce por SW e deixa o PIC por menos tempo parado.

Veja uma forma de fazer o debounce de um pino do PIC com botão ativo em 0[V] :

debounce.jpg

 

 

Simples não? 

Abs.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@ e @WLS.UAM,

Só falta mostrar como se calcula o R e o C para ilustrar o exemplo do Mestre Felipe !

Como esses microcontroladores possuem entradas Cmos, a tensão de entrada é considerara ALTA quando aoresenta um valor acima de metade da alimentação.

Dos velhos tempos de faculdade, sabemos que quando um capacitor começa a carregar por meio de um resistor, o tempo necessário para atingir a metade da tensão de alimentação é de 0,7 x R x C .

Para resolver qualquer debouncing, vamos colocar um tempo de 100 milisegundos. É um bom exagero, pois 50 já são mais que o suficiente....

Usando um valor de 10K para o resistor, temos :

0,1 = 0,7 x 10000 x C que fica assim : C = 1 / 70000 C=14,3 uF .

Podemos tranquilamente arredondar para 10 uF , o que nos dará o tempo aproximado de 70 milisegundos.

Uma ultima observação : o correto quando se usa esse circuito é tratar com mais cuidado a rotina que lê a entrada, pois a entrada vai ficar em nivel 0 por um bom tempo.... O correto seria o uso de um flag, para que indicasse que a entrada já voltou para nivel alto e portanto pode ser lida novamente para detectar um novo aperto do botão.

Ou, ainda melhor, detectar por interrupção na transição de descida, acaba o problema na hora !

Paulo

Link para o comentário
Compartilhar em outros sites

Bom dia,

 

Muitooo Obrigado a todos, como sempre aprendo muito aqui, Não conseguirei postar o esquema agora porque estou no serviço e não esta comigo, mais postarei assim que possivel.

 

Só para que entendenada, o projeto seria um game onde poderia jogar 6 pessoas, ou seja o PIC vai ler os 6 botões sendo que seria um jogo em grupo, 3 para cada time.

 

A cada vez que é precionado é lido e o resultado da partida é indicado por LEDs.

 

Com as dicas consegui resolver o problema da leitura via código, mais adorei a resposta do @Felipe_Eletronic junto com a explicação do @aphawk , muito bom mesmo, aprendi mais uma!

 

Consegui resolver com o seguinte código que montei:

 

 

 

if(Estado_Anterior_Botao ==1 && Estado_Atual_Botao==0){
  delay_ms(50);
 
  if(Estado_Anterior_Botao ==1 && Estado_Atual_Botao==0){
       qtd_G1++;
     }
  }
Estado_Anterior_Botao=Estado_Atual_Botao;

 

 

PS: Vi o post do MOR e lembrei que esqueci de mencionar, o Game era pra 6 Pessoas, porém para testar estava usando só 2 e os outros 4 não havia colocado PullDown(Q vacilo absurdo), ao colocar ditou quase que 100% dos erros de contagem, os demais tirei com o codigo que montei acima!

 

 

 

***O Unico problema que me sobrou agora é que ele oscila pra ligar e pra dar fim de jogo, mais acho que pode ser a corrente que seja insuficiente, pois quando ligo em uma bateria de 9V com 7805 o os LEDs ficam piscando bemmmmmmmm fraquinho e nem inicia o jogo, quando ligo em um modulozinho que tenho que fornece 5V e é ligado no USB no PC funciona 90%, digo 90% porque as vezes ele reinicia o jogo antes do termino como se tivesse resetado no PIC, ou as vezes pra iniciar preciso precionar os botões(Lembrando que abrem os pressionar) ai ele inicia e fica normal.

 

Pensei em usar um TIP122 pra aumentar a conrrente, mais como não sei como calcular a corrente necessaria resolvi deixar assim por enquanto, vai que eu queime tudo! rsrsrs

 

 

 

Depois tento postar o esquema, mais tenho nele:

 

6 botões(circuito fechado)

6 resistores 10k (pull-down - com os botões)

16 Leds Azuis

16 Led Vermelhor

PIC16f877A com 1 Resistor de 1K

16 Resistores 150 ohns

 

Os LEDS, na verdade são apenas 16, porém são leds RGB 3 cores com 4 terminais, ele compartilham o GND, e neles eu uso apenas o Azul e o Vermelho, o terminal do Verde eu descarto!

Link para o comentário
Compartilhar em outros sites

Pessoal!

O requerente informou, que mesmo sem fazer nada ocorrem "supostos disparos".

Isso está parecendo ou falta de capacitor de 100nF junto com o uC, ou falta de resistor de Pull Up com valor adequado, ou montagem em Protoboard, ou distância excessiva entre a fonte e o circuito, ou ambiente muito ruidoso, ou ...

Ops. Não tinha visto as duas últimas postagens.

MOR_AL

Link para o comentário
Compartilhar em outros sites

@MOR,

 

No início do post ele dizia que ele apertava uma vez só e ocorriam inúmeros disparos, que era justamente o tal de bouncing. Mas isso foi resolvido.

 

Agora, no último post, ele diz que o funcionamento está um pouco "aleatório" .....  pela lista de componentes, dá para perceber que faltam os famosos capacitores de filtragem. Fora o problema com a bateria de 9 Volts, que pode ser por vários moivos.

 

Seria muito bom se o circuito completo fosse postado, assim os palpites seriam mais "certeiros" !!!

 

Paulo

Link para o comentário
Compartilhar em outros sites

Desculpem, Como mencionei acima, a detecção dos botões foi soliciono somente apos corrigir os dois erros, o erro Grotesco do resistor de PullDown na entrada que para testes não estava usando porém no código estava ativo, e também o Bouncing que consegui graças ao auxilio de vocês entender o que era e montar o seguinte código que resolveu:

 

 

if(Estado_Anterior_Botao ==1 && Estado_Atual_Botao==0){
  delay_ms(50);
 
  if(Estado_Anterior_Botao ==1 && Estado_Atual_Botao==0){
       qtd_G1++;
     }
  }
Estado_Anterior_Botao=Estado_Atual_Botao;

 

 

Segue o esquema:(porém no proteus não localizei o tipo de LED que estou usando então usei o Led vermelho e o Azul comum, com resistores de 160 e 100 respectivamente.

Capturar.GIF

No esquema esta alimentado com 5V, como mencionei ligo com um modulo de 5V e funciona uns 90% bem, mais ao ligar em uma bateria 9v convertida para 5v com 7805 fica muito fraco e nem inicia o jogo. Achei que fosse corrente, mais não posso deduzir muita coisa pois não manjo quase nada e to aprendendo muito com vocês, talvez seja problema de ausencia de capacitores como disseram, pois realmente Não Usei Nenhum!

 

Para Crista de 4Mhz q to Usanso, deixo ele colado no Pic então não precisei colocar capacitor.

Link para o comentário
Compartilhar em outros sites

Desculpem, ..

 

Segue o esquema:(.../

 

No esquema esta alimentado com 5V, como mencionei ligo com um modulo de 5V e funciona uns 90% bem, mais ao ligar em uma bateria 9v convertida para 5v com 7805 fica muito fraco e nem inicia o jogo. Achei que fosse corrente, mais não posso deduzir muita coisa pois não manjo quase nada e to aprendendo muito com vocês, talvez seja problema de ausencia de capacitores como disseram, pois realmente Não Usei Nenhum!

 

Tem que usar!!!

 

Para Crista de 4Mhz q to Usanso, deixo ele colado no Pic então não precisei colocar capacitor.

Ten que colocar dois capacitores de uns 22pF saindo de cada um dos terminais do cristal e conectar o outro lado ao terra.

Essa bateria é daquelas pequeninhas com uns 7 cm x 3 cm x 2 cm Aprox.? Se for, ela não tem capacidade de alimentar os leds. A tensão cai e o uC fica sem condições de funcionar diireito.

MOR_AL

Link para o comentário
Compartilhar em outros sites

Consegui solucionar o Problemas, usei uma Fonte de PC de 36A e funcionou, o Unico problema é que ele as vezes não inicia o Jogo, fica piscando bemmmm fraquinho mais não inicia, mais quando  inicia fica tranquilo pois não trava.

 

Acho q esse problema consigo resolver colocando capacitores na alimentação do PIC.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...