Ir ao conteúdo

Interferencia - Botão e PIC16F28A


Richard.Vieira

Posts recomendados

Postado

E ae galera tudo bem?

 

Tentei fazer um contador bem simples usando um display led de 7 segmentos, um botão acionador simples e um PIC16F28A.

 

post-701915-0-40117700-1389349640_thumb.

 

O botão esta conectado aos pinos 17 (RA0) e 18 (RA1) sendo que programei para que o pino 17 ficasse ligado... ou seja transmitindo 5V (acho que se diz: "nível alto" rsrs) o sistema verifica constantemente se o pino 18 está recebendo ou não os 5V ("nível alto" tb eu acho) ou sejá se o circuito esta aberto ou fechado.

 

Simulando no Proteus dá tudo certo... quando fecho o circuito e abro novamente o display acrescenta um novo valor.

 

porém na pratica acontece algum tipo de interferencia ou sei lá o que... :/

 

Só de aproximar o dedo do botão, o display começa a contar loucamente como se eu estivesse acionando o botão divesas vezes e com muita velocidade. Será q o campo elétrico do meu dedo está fechando o circuito??

 

post-701915-0-79175200-1389351926_thumb.

 

Alguem aí sabe que algum componente que evita esse tipo de interferencia, ou outra solução??

 
Valeu pessoal!!!
 
Té +
Postado

Então não sei bem se isso aqui é um esquemático, é o projeto no Proteus... serve??

 

post-701915-0-38409800-1389358148_thumb.

 

e esse aqui é o código...

#include <16f628a.h>#FUSES NOWDT                    //Sem Timer Cão de Guarda#FUSES INTRC_IO                 //Oscilador Interno e dois pinos de I/O liberados#FUSES NOPUT                    //Sem timer de alimentação#FUSES NOPROTECT                //Epprom desprotegida (permite a leitura)#FUSES NOBROWNOUT                 //Brownout desabilitado#FUSES NOMCLR                     //Pino Master Clear habilitado como porta I/O#FUSES NOLVP                      //Programação em baixa tensão desabilitada#FUSES NOCPD                    //Código desprotegido (permite a leitura)//A frequencia do Clock Interno é de 1Mhz//A sentença abaixo informa ao compilador essa frequencia para que este //calcule corretamente os delays em mili-segundos#use delay(clock=1000000) #define PA0 PIN_A0 #define PA1 PIN_A1 #define PB0 PIN_B0 #define PB1 PIN_B1 #define PB2 PIN_B2 #define PB3 PIN_B3 #define PB4 PIN_B4 #define PB5 PIN_B5 #define PB6 PIN_B6 //------------------------------------------------------// PROGRAMA PRINCIPAL//------------------------------------------------------void main() // Note que o programa no pic nunca deve terminar{   output_bit( PA0, true);    boolean pvez;   if(input(PA1)==1)   {       pvez = false;   }   else   {       pvez = true;      }   int num = 0;   //ZERO   output_bit( PB0, true);   output_bit( PB1, true);   output_bit( PB2, true);   output_bit( PB3 true);   output_bit( PB4, true);   output_bit( PB5, true);   output_bit( PB6, false);      while (1) //Loop infinito, por isso nunca acaba   {      if((input(pin_a1)==1)&&(pvez==true))      {         switch(num)         {            case 9:		   output_bit( PB0, true);		   output_bit( PB1, true);		   output_bit( PB2, true);		   output_bit( PB3 true);		   output_bit( PB4, true);		   output_bit( PB5, true);		   output_bit( PB6, false);            num = 0;            pvez = false;            break;                     case 0:		      output_bit( PB0, false);		      output_bit( PB1, true);		      output_bit( PB2, true);		      output_bit( PB3, false);		      output_bit( PB4, false);		      output_bit( PB5, false);		      output_bit( PB6, false);            num = 1;            pvez = false;            break;            case 1:		      output_bit( PB0, true);		      output_bit( PB1, true);		      output_bit( PB2, false);		      output_bit( PB3, true);		      output_bit( PB4, true);		      output_bit( PB5, false);		      output_bit( PB6, true);            num = 2;            pvez = false;            break;                  case 2:		      output_bit( PB0, true);		      output_bit( PB1, true);		      output_bit( PB2, true);		      output_bit( PB3, true);		      output_bit( PB4, false);		      output_bit( PB5, false);		      output_bit( PB6, true);            num = 3;            pvez = false;            break;            case 3:      		      output_bit( PB0, false);		      output_bit( PB1, true);		      output_bit( PB2, true);		      output_bit( PB3, false);		      output_bit( PB4, false);		      output_bit( PB5, true);		      output_bit( PB6, true);            num = 4;            pvez = false;            break;            case 4:		      output_bit( PB0, false);		      output_bit( PB1, true);		      output_bit( PB2, true);		      output_bit( PB3, true);		      output_bit( PB4, false);		      output_bit( PB5, true);		      output_bit( PB6, true);            num = 5;            pvez = false;            break;                  case 5:		      output_bit( PB0, false);		      output_bit( PB1, true);		      output_bit( PB2, true);		      output_bit( PB3, true);		      output_bit( PB4, true);		      output_bit( PB5, true);		      output_bit( PB6, true);            num = 6;            pvez = false;            break;            case 6:		      output_bit( PB0, true);		      output_bit( PB1, true);		      output_bit( PB2, true);		      output_bit( PB3, false);		      output_bit( PB4, false);		      output_bit( PB5, false);		      output_bit( PB6, false);            num = 7;            pvez = false;            break;            case 7:		      output_bit( PB0, true);		      output_bit( PB1, true);		      output_bit( PB2, true);		      output_bit( PB3, true);		      output_bit( PB4, true);		      output_bit( PB5, true);		      output_bit( PB6, true);            num = 8;            pvez = false;            break;            case 8:		      output_bit( PB0, true);		      output_bit( PB1, true);		      output_bit( PB2, true);		      output_bit( PB3, true);		      output_bit( PB4, false);		      output_bit( PB5, true);		      output_bit( PB6, true);            num = 9;            pvez = false;            break;         }      }            if(input(pin_a1)==0)         {            pvez = true;         }   } //Fim loop infinito}
Postado

Eu particularmente nunca ví ligar um botão entre DUAS ENTRADAS do Pic....

 

Seguinte, ligue o botão entre UM dos pinos de entrada e o terra ( GND ou negativo ).

 

Coloque um resistor de 4K7 ligado à esse pino de entrada do PIC ( que também tem o botão ) e o positivo ( +5V ).

 

Desta maneira, quando você apertar o botão, o nivel da entrada vai ser 0.

 

Mude o seu programa, para que ele fique lendo essa entrada, e que quando a entrada esitver em nivel 0 , significa que o botão está pressionado, ok ?

 

Sua interferência vai sumir.

 

Paulo

Postado

Richard, você utilizou um botao de pull-up. Nesse caso, a lógica no codigo fica:

 

if (!input(PIN_A1) faz alguma coisa.

 

Outra coisa, você definiu seu clock errado. 

 

Utilizou #use delay(clock=1000000)

Mas o clock interno é de 4Mhz ou 4000000

 

Falou

 
 

Postado

beleza Matheus valeu as dicas!!

 

Mas como faria pra deixar pull-down?

 

Então quanto ao clock, tinha visto não sei onde que era pra definir como 1MHz ou 4MHz, dai deixei com 1... mais não sei muito bem qual o sentido disso. rsrs

 

valeu!!

Postado

Oi Richard, o esquema agora está certo. Só tem de acertar o seu programa, porque o resistor que pusemos é na verdade um PULL-UP, ou seja, o nivel normal da entrada é 1 sem apertar o botão, e só vai para 0 quando apertar.

 

Agora que o grande Matheus veio na ajuda vai ficar mais fácil !

 

Paulo

Postado

Pow valeu mesmo hein pessoal!!

 

Agora só falta testar!!

 

Só que meu compilador em C é de uma versão demo, e agora a licença expirou... :/

 

Meu gravador é um MultiPROG Plus e gravo usando o programa MPLAB IDE v8.92 e o compilador que deu pau é o PIC C Compiler...

 

Vocês sabem como posso reativar o compilador ou se existe outro com as mesmas funções??

 

Falou...

 

Té +

Arquivado

Este tópico foi arquivado e está fechado para 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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!