Ir ao conteúdo
  • Cadastre-se

PIC, ter resposta sensivel a borda de subida


Rodrigo Flister

Posts recomendados

Estou fazendo um programa em C, para um PIC 18F442, e me deparei com um problema. Tenho uma serie de opções salvas no MC, e de acordo com quantas vezes eu apertar uma chave eu vou visualizando essas opções:

1 pulso na chave - escreve a mensagem 1 no LCD

+1 pulso na chave - escreve a mensagem 2 no LCD

e assim ate que se mostre as 10 mensagens salvas.

Então o meu problema e o seguinte, se eu ficar apertando a chave por muito tempo, o contador de pulsos tb e incrementado, assim eu acabo pulando mensagens, estava então procurando um tipo de sistema que funcionasse como a leitura de borda de subida ou descida que nem nos Flip-Flops. Alguem pode me dar um ideia.

Link para o comentário
Compartilhar em outros sites

Você precisa de duas coisas: uma rotina de debounce e um flag para esperar o botão ser solto após a ação ter sido realizada.

Veja, neste código em ASM, um exemplo de como fazer:

BTFSS SOLTAR_BT1 ;AGUARDA SOLTAR BOTAO 1?

GOTO $+5 ;NAO

BTFSS BOTAO_1 ;SIM, BOTAO 1 ESTA SOLTO?

RETURN ;NAO

BCF SOLTAR_BT1 ;SIM, APAGA FLAG SOLTAR_BT1

RETURN

BTFSS BOTAO_1 ;BOTAO 1 ESTA PRESSIONADO?

GOTO $+4 ;SIM

MOVLW INI_DB_BT1 ;NAO

MOVWF DB_BT1 ;REINICIA DB_BT1

RETURN

DECFSZ DB_BT1,F ;ACABOU DEBOUNCE?

RETURN ;NAO

MOVLW INI_DB_BT1 ;SIM

MOVWF DB_BT1 ;REINICIA DB_BT1

BSF SOLTAR_BT1 ;AGUARDA SOLTAR BOTAO 1

BSF INC_CONTADOR ;SETA FLAG PARA INCREMENTAR CONTADOR

SOLTAR_BT1 é um bit que é setado depois que a ação é realizada.

BOTAO_1 é o pino

DB_BT1 é o registrador utilizado para o debounce.

Link para o comentário
Compartilhar em outros sites

Debounce também é uma alternativa.

Provavelmente você tem um loop em seu programa, como:

char b = false;

while(1) {

if(b == false) {

if(botao_apertado == true) {

executa_acao();

b = true;

}

} else {

if (botao_apertado == false) {

b = false;

}

}

}

Você poderia adicionar um delay, assim a variação seria detectada em função de um tempo:

while(1) {

if(b == false) {

if(botao_apertado == true) {

executa_acao();

b = true;

}

} else {

Delay_ms(100);

if (botao_apertado == false) {

b = false;

}

}

}

Assim, mesmo se você apertar o botão rápido várias vezes em menos de 100ms (simulando o sinal não estável ainda), a função 'executa_acao()' será executada apenas uma vez.

Abraços!

Link para o comentário
Compartilhar em outros sites

e galera, eu tentei incrementar meu programa com as idéias de vocês, so que não deu muito certo não, tava querendo fazer e um sistema externo mesmo, por isso to tentando encontra o circuito logico que realiza essa tarefa, que e pegar so o borda de subida de um pulso. Ninguém ai sabe não?

Link para o comentário
Compartilhar em outros sites

Não lucas, o problema é a estabilidade do clock.

As vezes quando você pressiona um botão, ele não gera o contato corretamente, isso faz com que suba e desça mais de uma vez, mesmo apertado o botão apenas 1 vez.

capacitor ou o código que mostrei contornam esse problema.

Link para o comentário
Compartilhar em outros sites

Só um detalhe pessoal: dependendo da tecla usada, 1ms não resolve. Tem uns 'porcarias' de microbotão (aqueles botõesinhos redondos) que chegam a gerar glitch por 50ms...

Neste caso eu aconcenselho um deboucing de no mimino 100ms... como o comando é humano, não mais dar problema (duvido que alguém consiga prescionar mais de 11 vezes num segundo, um destes microbotões....)

***********************

Agora respondendo a pergunta do criador do topico, se você quiser criar um sistema que leia na borda, pode criar uma interrupção externa.

Esse tipo de interrupção pode ser configurada para responder na borda de subida ou descida, a sua escolha:lol:

Link para o comentário
Compartilhar em outros sites

Cacio, eu preciono até 22x um microbotão em 1 segundo... culpa do paintball...

Mas com 1ms sempre deu xerto comigo... prefiro deixar uma margem de 3ms para ser sincero... se o caso é um microbotão vagabundo, então faça o debug e descubra quanto tempo precisa para fazer o debounce.

Link para o comentário
Compartilhar em outros sites

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!