Ir ao conteúdo

PIC, ter resposta sensivel a borda de subida


Rodrigo Flister

Posts recomendados

Postado

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.

Postado

Acho que isso é problema da chave. Você precisa colocar um capacitor em paralelo com a chave para estabilizar o sinal! Pode ser qualquer capacitor de pequena capacitancia (4.7uF)

Abraços!

Postado

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.

Postado

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!

Postado

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?

Postado

JEITO MAIS fácil

if (BOTAO) {

incrementa ++;

while (BOTAO); //aqui está a mágica

}

Enquanto você estiver segurando o "botão", ele irá identificar como estando em UP, então enquanto ele estiver assim, ele não irá movimentar o programa, impedindo de somar mais vezes.

Postado

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.

Postado

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:

Postado

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.

Postado

Nunca imaginei que mini-botão podia gerar gitch de 50ms =P

tudo bem, o código que fiz foi para 100ms, ainda estaria com folga =pppp

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!