Autor Tema: antirrebotes de un pulsador .  (Leído 35669 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado danone

  • PIC12
  • **
  • Mensajes: 78
antirrebotes de un pulsador .
« en: 04 de Julio de 2006, 10:18:08 »
hola buenas, he estado buscando por el foro, pero no me termina realmente de quedar claro, he visto que por software la manera realmente de soluccionarlo, es leer el boton, esperar unos ms y volver a leer el boton !

Pues os cuento con esto no me funciona bien la verdad... no se que le pasa, Yo mi programa principal tiene un bucle infinito y desde ahi ya empieza a escribir cosas en pantalla y llamar a diversas funciones, pues bien lee ese boton desde ese bucle infinito del programa principal para que cuando se pulse me lleve a un menu, pero hago eso de leer y el delay y volver a leer, y claro nunca funciona a la primera funciona cuando le da la gana y tengo q pulsar muchas veces el boton.

Que me recomendais para poder solucionarlo? ya que weno estoy haciendo mis pinitos con esto, espero q no sea muy complicada la soluccion, por hardware he visto que es un condensador y una resistencia no?..


saludos.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: antirrebotes de un pulsador .
« Respuesta #1 en: 04 de Julio de 2006, 10:29:17 »
Hola.
Es completamente factible, mas sencillo y barato hacerlo por soft. Tal vez estes dando demasiado tiempo de antirebote. podes poner la porcion de codigo en cuestion? saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado GustavoT

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 102
Re: antirrebotes de un pulsador .
« Respuesta #2 en: 04 de Julio de 2006, 10:40:58 »
el usar un capacitor y una resistencia no es tan simple, tenes que tener en cuenta que tenes que cargar por una lado y descarga por el otro,

ahora por soft, es otra cosa, lo que tenes que hacer es primero leer el botón y luego guardas el dato leído en alguna variable de tal forma que las próxima vez que vayas a leer el botón comparas con la lectura anterior, si es diferente es que el botón se a apretado, luego inhibes el botón por un tiempo, es decir pasas por alto la rutina un tiempo que puede ser de 100ms ,   nadie apreta un botón tan rápido como 10 veces por segundo es mas yo le daría 200ms

el temas es muy simple prográmalo y vas a ver que funciona joya
Hay dos cosas infinitas: el Universo y la estupidez humana. Y del Universo no estoy seguro.   Albert Einstein

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: antirrebotes de un pulsador .
« Respuesta #3 en: 04 de Julio de 2006, 12:57:20 »
Buenas!!! en el post de Ejemplitos en C para 16F648A, encontraras bastantes ejemplos que usen un boton y por lo tanto la eliminacion de los rebotes.

Una solucion sencilla mediante software es la siguiente: Imaginemos que el boton lo tenemos conectado en el puerto B, concretamente en el pin B4, pues poniendo la siguiente instruccion eliminariamos el rebote al ser pulsado
Código: C
  1. while(!input(PIN_B4));

Poner una resistencia y un condensador son medidas hardware pero son mas costosas que por software...


Suerte!!! :wink:
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado danone

  • PIC12
  • **
  • Mensajes: 78
Re: antirrebotes de un pulsador .
« Respuesta #4 en: 04 de Julio de 2006, 16:32:31 »
buenas, mirar lo estaba haciendo asi, ahora probare vuestros consejos, un saludo.

Código: C
  1. while (true){
  2.      boton[0]=input(PIN_a2);
  3.      delay_ms(250);
  4.      boton[0]=input(PIN_a2);
  5.      if (boton[0]==1){
  6.         boton[0]=0;
  7.         boton_0(boton,estados);
  8.      }
  9.  
  10.      lcd_gotoxy(1,2);
  11.      temperatura=media_tmp(0);
  12.      printf(lcd_putc,"T1=%2.1f",temperatura); //Escribo temperatura del sensor1
  13.  
  14.      lcd_gotoxy(9,2);
  15.      temperatura=media_tmp(1);
  16.      printf(lcd_putc,"T2=%2.1f",temperatura);
  17.      delay_ms(5);
  18.  
  19. }
  20.     }

Desconectado Arbolito

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 893
Re: antirrebotes de un pulsador .
« Respuesta #5 en: 04 de Julio de 2006, 17:40:00 »
si no me equivoco aca lees y asignas dos veces el mismo pin

boton[0]=input(PIN_a2);
     delay_ms(250);
     boton[0]=input(PIN_a2);

con lo cual si el boton se dejo de pulsar en el momento que se encuentra la segunda asignacion te leeria un cero ,lo que creo te traeria problemas de aleatoriedads (a veces lee un 1 y otras un 0)
La mejor solcion es la que te propone vszener
Un saludo
Existo, aunque pienses que no pienso

Desconectado danone

  • PIC12
  • **
  • Mensajes: 78
Re: antirrebotes de un pulsador .
« Respuesta #6 en: 05 de Julio de 2006, 08:50:30 »
buenas he estado probando lo que vosotros me habeis dicho,

concretamente el


while(!input(PIN_a2));
boton[0]=input(PIN_a2);


me funciona de lujo y me hace lo que quiero como bien me habeis dicho, pero esto realmente no me solucciona para nada el problema ya que el bucle se me para hasta que se pulsa un boton, y yo necesito que mi aplicacion siga funcionando... y si se pulsa el boton, se pare el bucle... vaya al menu, sino que siga mi bucle tan normal.

Código: C
  1. while (true){
  2.      boton[0]=input(PIN_a2);
  3.      delay_ms(250);
  4.      boton[0]=input(PIN_a2);
  5.  
  6.      if (boton[0]==1){
  7.         boton[0]=0;
  8.         boton_0(boton,estados);
  9.      }
  10.      lcd_gotoxy(3,1);
  11.      printf(lcd_putc,"MODDING ADRI");
  12.      lcd_gotoxy(1,2);   //me posiciono en la linea 1 en el primer caracter
  13.      temperatura=0;
  14.      temperatura=media_tmp(0);
  15.      printf(lcd_putc,"T1=%2.1f",temperatura); //Escribo temperatura del sensor1
  16.  
  17.      lcd_gotoxy(9,2);
  18.      temperatura=0;
  19.      temperatura=media_tmp(1);
  20.      printf(lcd_putc,"T2=%2.1f",temperatura);
  21.      delay_ms(5);
  22.  
  23.      while((!input(PIN_a2));
  24.      boton[0]=input(PIN_a2);
  25.  
  26.      if (boton[0]==1){
  27.         boton[0]=0;
  28.         boton_0(boton,estados);
  29.       }

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: antirrebotes de un pulsador .
« Respuesta #7 en: 05 de Julio de 2006, 09:12:55 »
Buenas!!! la verdad que hay mucho codigo en tu programa y no se entiende muy bien lo que quieres realizar....creo que tienes el concepto del antirebote mal asimilado, cada vez que pulsamos un boton, se produce los molestos 'rebotes', es decir, por el pin que tengamos conectado el pulsador/boton aparecera en un instante de tiempo muy pequeño estado de '1' a '0' logico continuamente que el microcontrolador interpretara como '1' y '0' respectivamente, para eliminar dicho efecto, cada vez que pulsamos un boton debemos seguidamente poner la instruccion while((!input(PIN_xx)); para eliminar dicho efecto, dicha instruccion no podemos ponerla 'al libre albedrio' ya que como bien comentas el programa se dentendra esperando el estado del pin...aqui te dejo el codigo como interpreto yo que puede ser lo que estas buscando:
Código: C
  1. while (true){    
  2.  
  3.     if (!input(PIN_A2)){
  4.             while((!input(PIN_a2));     // <-----ANTIREBOTE AQUI!!!      
  5.             boton_0(0,estados);    
  6.     }
  7.  
  8.     lcd_gotoxy(3,1);  
  9.     printf(lcd_putc,"MODDING ADRI");
  10.    
  11.     cd_gotoxy(1,2);   //me posiciono en la linea 1 en el primer caracter  
  12.  
  13.     temperatura=0;  
  14.     temperatura=media_tmp(0);  
  15.  
  16.     printf(lcd_putc,"T1=%2.1f",temperatura); //Escribo temperatura del sensor1    
  17.  
  18.     lcd_gotoxy(9,2);  
  19.     temperatura=0;  
  20.     temperatura=media_tmp(1);  
  21.    
  22.     printf(lcd_putc,"T2=%2.1f",temperatura);
  23.     delay_ms(5);      
  24.  }

PD: Simplemente he corregido los pulsadores con su respectivo antirebote via software, peor te recomiendo que revises el codigo haber si e sposible una optimizacion del mismo. Recomendarte que si tienes el pin de la interrupcion externa sin usar, pongas el pulsador en dicho pin, lo declares como entrada y configures la interrupcion externa, asi el programa no tiene que estar continuamente leyendo el estado del pulsador sino que al ser pulsado, provocaria una interrupcion y ejecutaria el codigo respectivo. :mrgreen:


Suerte!!! :wink:
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: antirrebotes de un pulsador .
« Respuesta #8 en: 05 de Julio de 2006, 10:55:44 »
Tal y como yo lo interpreto, vszener, tu código no es exactamente un antirrebotes sino un "no hago nada hasta que no quites el dedo del botón".

La idea es buena, pero complementaria a lo que yo entiendo como antirrebotes. Según tengo entendido, estos se produce por un pequeño chisporroteo que se lanza entre los contactos del pulsador en el momento que está siendo pulsado, por lo que provoca una seríe de 1 y 0 muy seguidos.

Por tanto, con el primer chispeo ya pasará de tu instrucción y en el siguiente bucle el pulsador rebotará.

En definitiva, que yo añadiría un pequeño delay tras la detección del pulso, y luego si queremos también tu instrucción:
Código: CSS
  1. if (!input(PIN_A2)){
  2.     delay_ms(100);              // <-----ANTIREBOTE AQUI!!!                  
  3.     while((!input(PIN_a2));    
  4.     boton_0(0,estados);         }

Desconectado danone

  • PIC12
  • **
  • Mensajes: 78
Re: antirrebotes de un pulsador .
« Respuesta #9 en: 05 de Julio de 2006, 11:09:41 »
no me aclero pero nada, la interrupcion no puedo usarla pq lo tengo ya usado con un lcd ese puerto :(.

a ver el antirrebotes que me habeis hecho me va fenomenal, pero sigue esperando todo el rato hasta que se pulsa el boton, y a mi eso no me vale :(

tengo el codigo que me habeis hecho pero siempre entra en el if.... logicamente y una vez dentro, se keda esperando a ke el boton sea pulsado por lo tanto no me vale, yo lo que necesito es que haga su programa normal y sino se pulsa el boton siga ejecutando y actualizando el bucle y mostrando las temperaturas en la pantalla, que toco el boton pues ya llamo al procedimiento boton_0, sino pues sigue en el bucle infinito haciendo actualizacion de las variables temperatura...

no se si me explico bien.


Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: antirrebotes de un pulsador .
« Respuesta #10 en: 05 de Julio de 2006, 11:17:02 »
Disculpa, creí que tenías el interruptor por lógica inversa, te lo cambio:

Código: CSS
  1. if (input(PIN_A2)){    
  2.      delay_ms(100);              // <-----ANTIREBOTE AQUI!!!
  3.      while((input(PIN_a2));        
  4.      boton_0(0,estados);        
  5. }

Deimos

  • Visitante
Re: antirrebotes de un pulsador .
« Respuesta #11 en: 05 de Julio de 2006, 11:42:48 »
La mejor manera de evitar rebotes con pulsadores el asociando ese pulsador a una pata del PIC que tenga interrupcion. En el momento que pulses el boton harás saltar el flag de interrupción, le haces un pulling en el vector de interrpciones y sirves el servicio de interrupcion. Como solo la sirves en el primer pulso, ya te da igual que vengan detras mil rebotes. Mejor no se puede creeme, es lo más barato y lo más fiable.

Acostumbrate a usar pull-up en los pulsadores, por ejemplo si lo pones en el puerto B, activas las pull-up internas del RB y asi no las tienes ni ke cablear. No está de más un condensador de 100nF en paralelo al pulsador.

Atentamente

Deimos

http://astroelectronica.iespana.es/


Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: antirrebotes de un pulsador .
« Respuesta #12 en: 05 de Julio de 2006, 14:14:39 »
Tienes toda la razon nocturno, la idea del antirebote es esperar un tiempo y volver a comprobar si el estado del pin se ha estabilizado, a efectos practicos, mi opcion 'fuerza' la espera a la estabilizacion del pulsador, mientras que la opcion del retraso y despues comprobar(antirebotes de toda la vida) puede que no sea eficaz el tiempo de espera...eso si, hay un inconveniente de la forma que yo propongo, y es el siguiente: imaginemos que queremos incrementar una variable cada vez que se pulse un boton, y en caso de tener el boton pulsado que se vaya incrementando igualmente, la forma que yo propongo no vale para este tipos de ejercicios ya que dicha forma interpretaria un incremento cada vez que se suelte el pulsador......

PD: A efectos practicos, y si no se tiene el inconveniente que he comentado, recomiendo la forma que esta expuesta.



Suerte!!! :wink:
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: antirrebotes de un pulsador .
« Respuesta #13 en: 18 de Septiembre de 2008, 03:50:26 »
Bueno, leyendo el foro encontré una cita hacia este hilo heha por nocturno, y leyendo vi que no usan un metodo parecido al mio asi que lo posteo por si a alguien le sirve, este codigo lo uso y va de maravillas.

saludos.


Código: [Seleccionar]

int1 tecla_1,tecla_2,tecla_3;


void soltar(void)
{
      if (input(pin_a3))tecla_1 = 0;       ///chekeamos que la tecla se soltó.
      if (input(pin_a4))tecla_2 = 0;
      if (input(pin_a5))tecla_3 = 0;
}
.
.
.
.
     soltar();
     if((!input(pin_a3))&&(!tecla_1))        ////chekeamos si se pulso la tecla y si ha sido soltada
        {
           tecla_1 = 1;     ///indicamos que se ha predionado la tecla
           if (++cantidad>12)cantidad=1;     /////hacemos lo que mande la tecla pulsada
        }

      if((!input(pin_a4))&&(!tecla_2))
        {
           tecla_2 = 1;
           if (--cantidad<1)cantidad=12;
        }

      if((!input(pin_a5))&&(!tecla_3))
        {
           tecla_3 = 1;
           write_eeprom(1,cantidad);
        }


A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: antirrebotes de un pulsador .
« Respuesta #14 en: 19 de Septiembre de 2008, 06:17:32 »
Tienes toda la razon nocturno, la idea del antirebote es esperar un tiempo y volver a comprobar si el estado del pin se ha estabilizado, a efectos practicos, mi opcion 'fuerza' la espera a la estabilizacion del pulsador, mientras que la opcion del retraso y despues comprobar(antirebotes de toda la vida) puede que no sea eficaz el tiempo de espera...eso si, hay un inconveniente de la forma que yo propongo, y es el siguiente: imaginemos que queremos incrementar una variable cada vez que se pulse un boton, y en caso de tener el boton pulsado que se vaya incrementando igualmente, la forma que yo propongo no vale para este tipos de ejercicios ya que dicha forma interpretaria un incremento cada vez que se suelte el pulsador......

PD: A efectos practicos, y si no se tiene el inconveniente que he comentado, recomiendo la forma que esta expuesta.

Suerte!!! :wink:

Yo lo veo como comenta Nocturno, con el while sólo evitas el primer rebote pero no los sucesivos. Me explico: si al pulsar el botón, logramos un estado 0 en la entrada del PIC, salta la interrupción, se ejecuta tu while y nos quedamos ahí hasta que el primer rebote pasa pero entonces viene el segundo rebote que nos hace salir del while para ejecutar el código de la interrupción. Si hubiese otro rebote, la interrupción se ejecutaría de nuevo, no?


 

anything