TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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
-
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.
-
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.
-
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.
-
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!
-
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.
-
Gracias a todos por los consejos. :-/
Si puedes BrunoF pasame el codigo para hecharle un vistazo ya que estoy un poco perdido.....
un saludo
-
estaria bueno que lo compartas bruno, quiero hacer algo asi pero no se como empezar. con esa cantidad de opciones
gracias!!
-
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.
-
muchas gracias BrunoF, ya lo tengo descargado.... mañana te cuento que tal.
Muchas gracias y un saludo
-
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) :(
-
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.
-
Faa lindo laburo te mandaste brunoF,solo por curiosidad y si no es molestia, cuanto tiempo te llevo hacerlo al algoritmo?
Saludos manutek.
-
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!
-
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.
-
: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:
-
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.
-
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
-
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!