Ir ao conteúdo
  • Cadastre-se

PIC filtro anti-debounce na linguagem C


Ir à solução Resolvido por Maria Cristina Oliveira,

Posts recomendados

Pede para o moderador trocar o título.

Hoje em dia com a internet no mundo e Google,qualquer busca mundial pode aparecer esse título...e o seu nome 😈

  • Haha 1
Link para o post
Compartilhar em outros sites

@Maria Cristina Oliveira ,

 

KKKKK não tem problema.... eu também já ví isso escrito assim, mas esse livro que você apontou foi escrito por um professor E engenheiro, isso me surpreendeu...  mas confesso que eu também sou péssimo na escrita, devem ter muitos outros como eu kkkkkkk !

 

Houve uma época aqui no Brasil que qualquer um que aprendia um pouco sobre um determinado assunto achava que estava acima do restante da humanidade e resolvia escrever um livro .... existem vários livros sobre microcontroladores que deveriam ser retirados do mercado e jogado no lixo ....

 

Mas sabe o que valeu neste tópico ?

 

Acho que você enriqueceu seu repertório de técnicas a serem usadas para eliminar os ruídos de botões e teclados, e isto é o que interessa !

 

Paulo

 

  • Curtir 1
  • Obrigado 1
Link para o post
Compartilhar em outros sites
  • 2 semanas depois...
Em 12/04/2021 às 08:21, .if disse:

Uma técnica frankstein filha da do Paulão com o amigo @vtrx sujeita à melhorias mas tem algo pra dar certo é algo como:




unsigned int tempo=0;
while(!bot && (tempo<10000)	//ajuste pra sua realidade	
	{
	tempo++; //tempo time out
	if (bot) tempo=0; //se tiver repique recomeça
//	while (!bot); //tire o dedo do botão
	}

Carece de teste prático, personalizações, aprimoramentos e tal

@.if

 

Amigo:

Passei aqui só pra te dizer que o teu filtro "ANTI"-debounce funcionou! 👍 

Parabéns!!

Tive que fazer pequenas alterações:

 

relê = 5V X 56 ohms (bobina)
resistor de base do transístor = 10k (tudo isso? foi só pra ver se saturava)
transístor = BC558
CLOCK = 4MHZ
uC = AT89S52

 

#include<at89x52.h>
unsigned int tempo=0;
//P3_0 ligado na chave
//P2_6 aciona o relê no nível 0

 void main(){   
 
   while(1){
       if(!P3_0){
   while(!P3_0 && (tempo<50000)) 
    {
        tempo++;
       if (P3_0) tempo=0; 
    }
    P2_6=!P2_6;
    while (!P3_0); 
    while (tempo<10000){    //tive que colocar isso porque também tem boucing
        tempo++;         }          //quando desliga
    tempo=0;
    
    
    } }}

 

image.png.244e8896c4f1c11e5e331fe8ee7d8d04.png

 

E tem mais:

 

main:
   if(!bot0) antdeb –-;
   else {goto bot0lib};
   if(!antdeb)antdeb2--;
   else {goto main};
   if(!antdeb2) goto bot0pres;
   else {goto main};

bot0lib:
   ...
bot0pres:
   ...

 

Esse programa que eu fiz e marquei como solução NÃO funcionou e eu sei porque:

Eu usei a lógica do ASM na construção do programa na linguagem C.

Através dos saltos, meu programa contava as linhas de programação para fazer o delay,

mas uma linha de programa na linguagem C representa "n" linhas em ASM. Por isso não 

funcionou. Misturei tudo !!!:roll:

O teu programa é a solução mas não consegui remarcar. 😔

  • Curtir 1
Link para o post
Compartilhar em outros sites
1 hora atrás, Maria Cristina Oliveira disse:

Amigo:

Passei aqui só pra te dizer que o teu filtro "ANTI"-debounce funcionou! 👍 

Parabéns!!

Tive que fazer pequenas alterações:

 

@.if

 

OOOps!                                                    :oops:

 

Errata.

No esquema que eu fiz, liguei o P0_3 na chave, quando na verdade, eu usei o P3_0.

Troquei as bolas... E não deu para editar.

É a pandemia que deixa a gente assim.:eiei:

 

Esse é o esquema correto:

 

image.png.5fe50723a0d7b58efd3734290e162a9c.png

  • Haha 1
Link para o post
Compartilhar em outros sites

@Maria Cristina Oliveira ,

 

A minha pergunta da tensão foi justamente para responder a sua dúvida do resistor de 10K ...

 

BC558 - Existe o A, B e o C ... ganhos máximos podem variar muito dependendo do modelo.

 

A corrente de base com esse resistor de 10K é de cerca de 430 uA ... 3 vezes mais do que o mínimo necessário para saturar com corrente de coletor de ceca de 30 mA ... então deve estar saturado com tensão VCE abaixo de 0.4V .

 

Paulo

 

 

  • Curtir 1
Link para o post
Compartilhar em outros sites
  • Membro VIP

Paulão sabe o que aconteceria se o relé fosse alimentado com 12V né?? Não? Então lá vai: ele ficaria acionado o tempo todo. Não me peça pra explicar o porquê hein!.. 😁

Dica: com V acima de 5.5v ficaria ligado, tá ligado?

Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...

Aprenda a ler resistores e capacitores

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!