TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: er_clemen en 11 de Julio de 2003, 19:04:00
-
¿Quien me puede decir como hacer un antirebotes por software con PBP?
GRACIAS
-
Puedes utilizar el comando Button, que preve un tiempo programable de antirrebote, o desarrollar una rutina de escaneo de la tecla con 20 mseg de retardo...


-
No me queda claro adonde va el retardo para evitar el rebote.
Usando este programa para leer el teclado, donde iría el retardo de 20mseg????(tiene un retardo al final, pero está mal puesto o no es suficiente)
barrido:
LOW A ;hacer bajo la 1era fila
IF UNO = 0 THEN numero=1:return ;si 1ra tecla es presionada sacar 1
IF DOS = 0 THEN numero=2:return ;si 2da tecla es presionada sacar 2
IF TRES = 0 THEN numero=3:return ;si 3ra tecla es presionada sacar 3
HIGH A ;poner en alto la 1era fila
LOW B ;hacer bajo la 2da fila
IF UNO = 0 THEN numero=4:return ;si 1ra tecla es presionada sacar 4
IF DOS = 0 THEN numero=5:return ; y así sucesivamente
IF TRES = 0 THEN numero=6:return
HIGH B ;poner en alto la 2da fila
LOW C ;hacer bajo la 3ra fila
IF UNO = 0 THEN numero=7:return
IF DOS = 0 THEN numero=8:return
IF TRES = 0 THEN numero=9:return
HIGH C ;poner en alto la 3ra fila
LOW D ;hacer bajo la 4ta fila
IF DOS = 0 THEN numero=0:return ;solo senso el 0
HIGH D ;poner en alto la 4ta fila
pause 10 ;pausa de 10 milisegundos
goto barrido
-
Deberías ponerlo antes de cada "return"
-
Hola! No se nada de PBP pero yo hice un antirrebotes en asm(en C es tambien facil de hacer) que consistia en poner un registro a 127(más o menos la mitad) y cada vez que se leía un 0 en la linea se decrementaba el registro y si se leía un 1 se incrementaba... de esta forma cuando el registro se desborda por arriba tienes un 1 en la linea, y si lo hace por abajo tienes un 0... Lo utilizé con un interruptor tipo switch(de estos malillos que fallan mucho) y me funcionaba a la perfección... no fallaba nunca. Espero que te sirva...salu2!
-
te doy una formula q nunca me falla supongamos q portb.0 esta con pull up a 5voltios y si se juntan contactos me lleven a tierra , solo uso esto en contactos super ruidosos como botones de lata switch de fines de carreraen donde de acuerdo a la cantidadde ruidosidadq pueda tener aumentas obajas el tiempo de gracia paravolver a testear mira
if portb.0=0 then
pause 20 'ëste es el retardo o tiempo de gracia
if portb.0=0 then
(acalarutina q deseas ejecutar)
endif
endif
esto es que preguntas laprimeravez y una vez q te acierte sea ruido o no despues de un tiempo de estabilizacion vuelvo hacer la pregunta y si acierta en esta se ejecuta recien la rutina la verdadnunca entendi de una forma bien explicita lo de button por eso uso esta rutina q me funciona de maravillas espero te sirva :-/
-
Hola TREMENS
Exactamente como te dijo Nocturno, debes ponerlo antes del return, cosa que te quedaría :
IF UNO = 0 THEN numero=1 : DELAYMS 20 : return ;si 1ra tecla es presionada sacar 1
Esto debieras repetirlo en cada línea.
Yo particularmente al usar esa técnica de barrido utilizo retardos de más tiempo, ya que 20 ms me resulta poco.
Yo he usado satisfactoriamente tiempos de entre 200 ms y 600 ms.
Saludos
Mario
-
Esto es un ejemplo de cómo usar el button:
UP VAR PORTB.6 'TECLA DE UP
DOWN VAR PORTB.7 'TECLA DOWN
loop10:
Button UP,1,255,0,B5,0,loop11
High INUP
loop11:
IF INUP=1 Then SPPISTON
loop12:
Button DOWN,1,255,0,B6,0,loop13
High INDOWN
loop13:
IF INDOWN =1 Then SPPISTON
Write 0,SPPISTON.BYTE0
Write 1,SPPISTON.BYTE1
Espero sirva.
-
Yo siempre implemento un antirebote asi en PBP
if portx.x=x then
pause 50
if portx.x=x then 'el estado de x debe ser el mismo despues del Igual
'acciones
endif
endif
-
Yo hago como navaismo....y funciona.
Al principio me perseguia con que "que pasa si justo tengo dos ruidos separados por el mismo tiempo de la demora, y lo interpreto como un 1 que en realidad no existe?" pero en la practica no pasa nunca (o he tenido mucha suerte) :mrgreen:
Saludos!
-
Hola Amigos, yo a los anti-rebotes los escribo (en asm) con tres verificaciones..
supongamos que el pulsador conecta a masa y la resistencia es a +
verifico si el pin esta en cero---> si
demora 50 ms ----> continuo ya que no pulsaron
luego de la demora, verifico si continua en cero----> si
entonces lo mantienen pulsado, entro en un loop verificando si es uno (sera uno cuando suelte)
continua el programa.... :mrgreen:
Norberto
-
'Esto no falla nunca
Dim p1 As Bit
p1=0
main:
If RA0 = 1 Then p1 = 1
If p1 = 1
hago lo que sea
p1 = 0
Endif
Goto main
End
-
El problema viene si al mismo tiempo estamos atendiendo la visualización con varios displays de 7 segmentos. Entonces con esas demoras se producen parpadeos. Me imagino que una solución podría ser anidar x veces pausas muy pequeñas.
Saludos.
-
Si atiendes al display mediante la interrupción del Timer no tiene porque haber parpadeos extraños.
-
Ya, pero es que en los códigos de ejemplo no había visto el uso de interrupciones por ningún lado. Cosa que, por otra parte me gustaría ver, me refiero a un ejemplillo completo para ver como funcionan. Se nota que soy novato ¿verdad? Estoy intentando hacer un proyectillo por mi cuenta pero, tengo poca idea de microcontroladores y nada de ensamblador, por eso tiro por el basic.
En un post aparte expondré lo que pretendo hacer.
Saludos.