TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Medusa en 22 de Enero de 2010, 13:27:41
-
Hola, estoy tratando de hacer un selector de menus usando un solo selector o pin de entrda en este cado el RA2, el modo de funcionamiento es el siguiente, si presiona una vez RA2 debe de ejecutarse la Option_0(), si presiono RA2 dos veces debe de ejecutarse Option_1() y asi sucesivamente, no puedo usar interrupciones.
Alguien me podria dar una sugerencia de como hacer esto?
Aqui dejo mi codigo aunque no sirve.. :5]
#define PULSADOR PIN_A2
int Modo;
.
.
.
while(1){
if (!input(PULSADOR)){;
Modo = 0;
if (!input(PULSADOR)){;
Modo = 1;
if (!input(PULSADOR));
Modo = 2;
}
}
}
if (Modo == 0)
Option_0();
if (Modo == 1)
Option_1();
if (Modo == 2)
Option_2();
}
-
Hola medusa.
Creo que es medio complicado hacerlo asi.
Si pensas detectar la cantidad de pulsaciones sobre un solo pulsador, tenes que lograr que el algoritmo contemple ciertas pautas y limites.
Por ejemplo, luego de la primer pulsacion ¿cuánto tiempo debe esperar a una posible segunda, antes de considerar que la intención ha sido de pulsarlo sólo una vez? lo mísmo con una tercera pulsación.
Luego de cada pulsación, deberías esperar cierto tiempo a una posible próxima pulsación. Si no ocurre en dicho tiempo, considerás que el usuario quiso presionar el pulsador la cantidad de veces que llevás contados.
P.D. Te faltan algoritmos de antirebote ahi también.
¿Se entendió?
-
Puedes hacer que el microcontrolador pase por un retardo de cada 1ms 500 veces, si se han producido los 500 retardos entonces tomar la opcion, mientras no se hayan producido los 500 retardos entonces esperar opcion.
while(1){
if (!input(PULSADOR)){;
delay_ms(1);
retardos++;
else
opcion++;
delay_ms(50);
if(retardos>=500)break;
}
switch(opcion){
case 1: ...
.
.
Si gustas puedes variar el tiempo del retardo y tambien puedes agregar algun codigo de antirrebote.
-
Aparte de la implementación de los rebotes, yo lo haría así:
#define PULSADOR PIN_A2
int Modo;
.
.
Modo = 0;
while(1){
if !input(PULSADOR) Modo++;
switch(Modo)
{
case 0: Option_0(); break;
case 1: Option_1(); break;
case 2: Option_2(); break;
case 3: Modo = 0; break;
}
}
Un saludo
-
Ese algoritmo tuyo tiene un problema, Jesús.
Cualquier opción del menú que necesite más de un click habrá pasado necesariamente por la ejecución de las anteriores.
Creo que habría que añadir un contador de tiempo para saber cuándo hemos elegido sólo un click, o dos, o tres...