Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
WLS.UAM

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

Recommended Posts

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?

Compartilhar este post


Link para o post
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/topic/654410-debouncing-para-iniciantes/#entry3634241

Paulo

Editado por aphawk

Compartilhar este post


Link para o post
Compartilhar em outros sites

posta a programação e o esquema eletrico pra gente resolver, esse problema q o colega citou, quando não a um resistor em serie com o  botão, na entrada do pic esse ruido

Compartilhar este post


Link para o post
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 :)

Editado por vtrx

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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

Editado por aphawk

Compartilhar este post


Link para o post
Compartilhar em outros sites

@aphawk

 while(input(PIN_x)== 0);   / /enquanto estiver em nível baixo,permance aqui(BTFSC).

Compartilhar este post


Link para o post
Compartilhar em outros sites

@vtrx,

Isso amarra o microcontrolador na espera... Pode ser feito caso o programa não tenha problema com isso !

Se usar um flag ou interrupção na desçida o microcontrolador fica livre rodando o programa,

Paulo

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • 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!

    Editado por WLS.UAM

    Compartilhar este post


    Link para o post
    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

    Editado por MOR

    Compartilhar este post


    Link para o post
    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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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.

    Compartilhar este post


    Link para o post
    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

    Editado por MOR

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

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

     

    Primeira coisa a ser feita. Já deveria ter feito isso. :D

     

    Boa sorte...

     

    Falou

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×