Página 1 de 1

Resolvido...Tempo ideal para botão pressionado

MensagemEnviado: 13 Out 2010 23:43
por Francys Reymer
Olá pessoal, estou fazendo um projeto com o pic16f877a, e estou com uma dúvida tipo:

eu chamo uma rotina que testa se um botão está pressionado e é só isso!
e to utilizando um cristal de 8 Mhz e com assembly puro.

aqui está a rotina:

Código: Selecionar todos
LOOP3_READ_MEMORY;
   BTFSC   BUTTON2;
   GOTO   TEST_BUTTON3;
   GOTO   READ_MEMORY_LEFT;
TEST_BUTTON3;
   BTFSC   BUTTON3;
   GOTO   LOOP2_READ_MEMORY;
   GOTO   READ_MEMORY_RIGHT;


as rotinas READ_MEMORY_LEFT; e READ_MEMORY_RIGHT; são rotinas para ler dados numa memória SRAM e mostrar em um display 128x64 ks108 e é ai q surge minha dúvida, tenho q fazer um timer para dar um atraso prq senão eu seguro o botão e a rotina será tão rápida q seria como se eu ainda tivesse com o dedo no botão (fazendo com q escape da minha rotina), q tempo devo utilizar, em ms ou em segundos? alguém tem alguma idéia d qual seria o tempo ideal e se é só com timer mesmo?

MensagemEnviado: 14 Out 2010 00:32
por _blackmore_
bom .. pelo q entendo, em qualquer leitura de chaves é necessário fazer um filtro digital (debounce) que nada mais é que ler o estado de um pino e aguardar alguns milisegundos e depois ler novamente o mesmo pino, caso o estado ainda seja o mesmo executa uma rotina determinada, caso o estado do pino não se confirme nada acontece.
Esse tempo pode variar, mas eu tenho utilizado valores de 50 a 100ms e nunca tive problemas.

MensagemEnviado: 14 Out 2010 00:37
por Francys Reymer
_blackmore_ escreveu:bom .. pelo q entendo, em qualquer leitura de chaves é necessário fazer um filtro digital (debounce) que nada mais é que ler o estado de um pino e aguardar alguns milisegundos e depois ler novamente o mesmo pino, caso o estado ainda seja o mesmo executa uma rotina determinada, caso o estado do pino não se confirme nada acontece.
Esse tempo pode variar, mas eu tenho utilizado valores de 50 a 100ms e nunca tive problemas.


no meu caso estou utilizando uma chave tactil. Segundo o meu professor o pic já trata a trepidação da chave (debounce), mas não é essa minha duvida não. Após pressionar um botão quanto tempo deve esperar pra q de tempo de eu soltar o botão?

MensagemEnviado: 14 Out 2010 00:48
por _blackmore_
justamente ... veja que o debounce nada mais é do que o tempo que uma chave tem q ficar pressionada para que o microcontrolador identifique seu estado sem que ocorram falhas ...
Agora isso que seu professor disse, não faz sentido para mim ... se não vc não precisaria além do debounce ainda esperar mais um tempo ... até pq o microcontrolador seja ele qual for, não "sabe" o que é uma chave, ou um sinal vindo de transistor (sinal alto e sinal baixo) em porta digital ...

MensagemEnviado: 14 Out 2010 09:44
por Djalma Toledo Rodrigues
Faça como no PC

As Teclas tem Códigos diferentes para pressionada e solta.
(É issso que permite a repetição)

Então em seu caso fica assim :

Deteta Botão pressionado

mas, só atua ao solta-lo

Abraço e bom Botão rs

DJ

MensagemEnviado: 14 Out 2010 14:27
por Francys Reymer
sim pessoal entendi, vou utilizar um esquema como máquina de estado para resolver isso, vlw ae

MensagemEnviado: 15 Out 2010 19:41
por Guri
Se ajudar aquí vai uma sugestão:

Nesse tipo de leitura de tecla à mesma só é liberada para nova leitura após você soltar a tecla e pressionar novamente (como o dijalma sugeriu).

Ler_botao_esquerdo:

Btfsc tact_esquerdo
goto Skip_esquerdo
Btfsc Flag_tact_esquerdo
Return
Bsf Flag_tact_esquerdo
; insirir aquí sua rotina sob essa tecla
Return

Skip_esquerdo:
Bcf Flag_tact_esquerdo
Return

Aquí vai uma sugestão para colocar um DELAY caso seja necessário:

Delay_tecla:
decfsz T_delay1, f
Return
decfsz T_delay2, f
Return
Movlw .xxx ; coloque o valor adquado ao clock do MCU
movwf T_delay1
return

Não se esqueça de carregar esses valores de DELAY na inicialização do MCU.