TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: josebaorza en 25 de Enero de 2010, 11:08:01

Título: un pulsador para dos acciones (pulsacion corta/larga)
Publicado por: josebaorza en 25 de Enero de 2010, 11:08:01
buenas tardes amigos. Estoy haciendo un proyecto en el que el pic16f876 tiene 2 pulsadores.Hasta ahora funciona bien... pero necesito que por ejemplo el pulsador 1(pin_b7) cuando pulsamos mas de 3 segundos se encienda, quiero decir que modo sea igual a 1, y que cuando vuelvo a pulsar 3 seg pase a modo 0, y que cuendo pulso solo una vez aumente el modo.

codigo:
void botones(void)
{
//port_b=0;
set_tris_b(0b11000000); //configuramos el puerto

//while(1)
//{
if(!input(pin_b7))
  {
  if(modo>=5)
      {
      modo=1;
      }else
  modo++;
  delay_ms(50);
  //printf(" %d ",modo);
}
if(!input(pin_b6))
  {
  if(poten>=255)
      {
      poten=20;
      }else
  poten=poten+20;
  delay_ms(50);
  //printf(" %d ",modo);
}
printf(" %d , %d  ",modo,poten);
//}
}

muchas gracias por la ayuda
Título: Re: un pulsador para dos acciones (pulsacion corta/larga)
Publicado por: Cryn en 25 de Enero de 2010, 20:28:00
Se me ocurre que puedes utilizar un timer para realizar el conteo de los 3segundos necesarios, tienen que haber seguramente varias banderas por ahí para poder hacer y no hacer ciertas cosas antes que pasen los 3 seg y después que pasen.

Una vez que pasen los 3seg con el time, por interrupción seguramente debes volver a preguntar por el estado del pulsador para saber si se mantuvo presionado y cambiar tus banderas y controlar lo que se debe y no hacer también.

Espero te sirva la idea, saludos.
Título: Re: un pulsador para dos acciones (pulsacion corta/larga)
Publicado por: KALLITOS en 25 de Enero de 2010, 20:49:41
Hola jose, segun como programas io haria un bucle while que se ejecute siempre que la tecla este pulsada, alli dentro suma pausas de 5ms por ejemplo, si las pausas llegan a 3 seg ejecutas un codigo, sino cambias de modo.

saludos.
Título: Re: un pulsador para dos acciones (pulsacion corta/larga)
Publicado por: Cryn en 25 de Enero de 2010, 21:50:48
si muy inteligente, ahora que me doy cuenta, buena idea Kallitos :mrgreen:

puedes sumar pausas de la misma cantidad del antirrebote y contar así hasta los 3seg, y ahí va sin interrupción y sin muchas banderas.

saludos.
Título: Re: un pulsador para dos acciones (pulsacion corta/larga)
Publicado por: Suky en 26 de Enero de 2010, 00:57:24
Hacer esperar al micro durante 3 segundos por una potencial pulsación? mmm.. Es difícil que el micro esté dispuesto a esperar tanto, salvo que no realice ninguna tarea importante. En el caso de que no pueda esperar ese tiempo necesitas usar un timer como dice Cryn, configuradolo para que interrumpa cada 20ms así evitas el efecto rebote y podes detectar una pulsación. Con 2 banderas y un contador creo que podrías resolver el problema.

Eso sí, hay que fijar algunos parámetros, como por ejemplo una pulsación corta es aceptada cuando esta dentro de los 300ms a 1s, y larga mayor o igual a 3s.


Saludos!
Título: Re: un pulsador para dos acciones (pulsacion corta/larga)
Publicado por: BrunoF en 26 de Enero de 2010, 01:19:03
Yo hice una libreria, algo compleja, que permite la detección de 7 posibles "combinaciones" usando solamente 2 pulsadores.

Cuatro de ellas son las que necesitás.

Actualmente lo uso y funciona perfecto el algoritmo. Me falta optimizarlo porque lo hice algo corto de tiempo y mientras lo hice se me ocurrieron mejores ideas.

Si queres lo comparto. Tengo que limpiarlo un poco nomás.

Saludos.
Título: Re: un pulsador para dos acciones (pulsacion corta/larga)
Publicado por: josebaorza en 26 de Enero de 2010, 10:31:56
Gracias a todos por los consejos. :-/
Si puedes BrunoF pasame el codigo para hecharle un vistazo ya que estoy un poco perdido.....
un saludo
Título: Re: un pulsador para dos acciones (pulsacion corta/larga)
Publicado por: kidpic en 26 de Enero de 2010, 12:43:09
estaria bueno que lo compartas bruno, quiero hacer algo asi pero no se como empezar. con esa cantidad de opciones
gracias!!
Título: Re: un pulsador para dos acciones (pulsacion corta/larga)
Publicado por: BrunoF en 26 de Enero de 2010, 14:31:39
Ok. Adjunto el algoritmo con un ejemplo de uso y simulacion en Proteus.

Cada uno obviamente la puede usar como desee. El algoritmo que adjunto, esta pensado para ser usado cuando se requiere una gran cantidad de opciones asociadas a las teclas, caso como una aplicacion que posea menues y submenues. Si la aplicacion es mas sencilla, el algoritmo puede simplificarse y solo llamarse a la funcion keysCheck() y que solo devuelva un resultado en lugar de ejecutar una funcion. Si necesitan eso, diganme y lo modificamos.

Por otro lado, el algoritmo requiere que se lo llame periodicamente. En este caso elegi 25mS entre llamadas. Podria obviamente tambien usarse una interrupcion para que contabilice los tiempos en lugar de usar un delay como he hecho en este ejemplo.
Si cambian el tiempo entre llamdas, reajusten el valor de kSTEP_mS.

Tambien puede ser necesario que reajusten los valores:  ANTIREBOTE, LONGPRESS y LONGLONGPRESS si el error se hace muy grande. Recuerden que trabajan con enteros.

Listado de combinaciones:

Combinacion 1: Presionar A y soltarlo inmediatamente;
Combinacion 2: Presionar B y soltarlo inmediatamente;
Combinacion 3: Presionar A y mantenerlo mientra se presiona B y se lo suelta;
Combinacion 4: Presionar B y mantenerlo mientra se presiona A y se lo suelta;
Combinacion 5: Presionar y mantener A durante un periodo largo de tiempo;
Combinacion 6: Presionar y mantener B durante un periodo largo de tiempo;
Combinacion 7: Presionar A y B y mantenerlos durante un periodo muy largo de tiempo.

El algoritmo ha sido testeado y esta siendo utilizado en varios proyectos míos.
Título: Re: un pulsador para dos acciones (pulsacion corta/larga)
Publicado por: josebaorza en 26 de Enero de 2010, 16:36:04
muchas gracias BrunoF, ya lo tengo descargado....  mañana te cuento que tal.
Muchas gracias y un saludo
Título: Re: un pulsador para dos acciones (pulsacion corta/larga)
Publicado por: anfegori91 en 02 de Febrero de 2010, 01:43:42
interesante el algoritmo... mientras lo observaba me surgió una idea de otro con 2 teclas:
una de las 2 teclas activa el conteo de pulsaciones de la otra y visceversa;
de acuerdo al número de pulsaciones se podría acceder a muchas opciones¡¡
 :mrgreen: :mrgreen:

A propósito, BrunoF, he ido a calculoalazar y me pareció interesante el generador de telarañas, pero el archivo no se puede descargar...
(iba a a descargar el de dev cpp) :(
Título: Re: un pulsador para dos acciones (pulsacion corta/larga)
Publicado por: BrunoF en 03 de Febrero de 2010, 13:07:21
Hola anfegori. Efectivamente, 2 de las 7 funciones disponibles son de la manera que comentás.

Voy a ver si tengo alguna copia de seguridad del generador de telarañas y arreglo el link...

Saludos.
Título: Re: un pulsador para dos acciones (pulsacion corta/larga)
Publicado por: manutek en 04 de Febrero de 2010, 01:23:30
Faa lindo laburo te mandaste brunoF,solo por curiosidad y si no es molestia, cuanto tiempo te llevo hacerlo al algoritmo?
Saludos manutek.
Título: Re: un pulsador para dos acciones (pulsacion corta/larga)
Publicado por: BrunoF en 04 de Febrero de 2010, 05:32:31
Hola manutek. ¿Te referis al algoritmo de los pulsadores o al de la telarañas?

El de los pulsadores: calculale hora y media planteandolo y unos 40 minutos escribiendo el código. Poco más de dos horas en total.
El de las telarañas me llevó casi 2 días...

Saludos!

Título: Re: un pulsador para dos acciones (pulsacion corta/larga)
Publicado por: BrunoF en 04 de Febrero de 2010, 05:35:47
Listado de combinaciones:

Combinacion 1: Presionar A y soltarlo inmediatamente;
Combinacion 2: Presionar B y soltarlo inmediatamente;
Combinacion 3: Presionar A y mantenerlo mientra se presiona B y se lo suelta;
Combinacion 4: Presionar B y mantenerlo mientra se presiona A y se lo suelta;
Combinacion 5: Presionar y mantener A durante un periodo largo de tiempo;
Combinacion 6: Presionar y mantener B durante un periodo largo de tiempo;
Combinacion 7: Presionar A y B y mantenerlos durante un periodo muy largo de tiempo.

P.D. Anexado al post correspondiente.
Título: Re: un pulsador para dos acciones (pulsacion corta/larga)
Publicado por: anfegori91 en 06 de Febrero de 2010, 06:22:15
 :P creo que no me hice entender, efectivamente 2 de esas combinaciones son como lo que yo propuse,
sino que se podrían expandir de manera que, por ejemplo, se presione A y mientras se mantenga pulsado,
se pulse de una a más veces el botón B, y el conteo de las veces oprimidas de B pare al soltar A, permitiendo
seleccionar más funciones dependiendo del número de veces que se oprimió B.

...y visceversa. :mrgreen:
Título: Re: un pulsador para dos acciones (pulsacion corta/larga)
Publicado por: jeremylf en 06 de Febrero de 2010, 18:24:58
Yo siempre creo un timer que desborda cada 10ms o a lo mucho 1ms (deendiendo de la velocidad del mirco) para tener tiempos mas exactos para ejectuar multiples cosas sin que el PIC se detenga, en este caso con 10 estara bien. Para los pulsadores, basta con crear flags y hacer una rutina que se llame siempre en el while. Almenos asi siempre lo ahgo yo porq no me gusta la idea de tener que paralizar al PIC con los delay_xx. Prefiero la de un RTOS, si es que no me equivoco, pero echo por mi mismo xD!

Bueno el codigo Bruno!

Suerte.
Título: Re: un pulsador para dos acciones (pulsacion corta/larga)
Publicado por: anfegori91 en 07 de Febrero de 2010, 22:42:19
si¡¡ el uso de los temporizadores permite otra técnica para evitar usar delay en los pulsadores para el antirebote:
digamos que el timer se desborda cada 2 ms, y en la rutina de interrupción se verifica el estado del interruptor (1 o 0),
haciendo válido un pulso sólamente cuando haya por lo menos 10 lecturas contiguas en "1", y desvalidando el pulso
cuando haya por lo menos 10 lecturas en "0". En esta rutina podría activarse otro modo de temporización para verificar si
la pulsación fue larga o corta.  :P :P

Título: Re: un pulsador para dos acciones (pulsacion corta/larga)
Publicado por: Suky en 07 de Febrero de 2010, 23:02:21
Yo con un timer creo un tiempo de timeout, que indica si se ha vuelto a pulsar la misma tecla dentro de un periodo, con esto tengo una rutina que trabaja como el teclado de un celular, y los caracteres de cada tecla se guardan en un arreglo. Esto da la posibilidad de muchas opciones con pocas teclas  ;-)


Saludos!