TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: micro_pepe en 06 de Marzo de 2009, 10:20:09
-
Necesito hacer un programilla que distinga entre 1,2 o 4 clics, en un tiempo de 1segundo. Ademas de implementar una proteccion antirrebotes.
Estoy utilizando un interruptor, por lo cual a cada pulsación se tiene un estado diferente '0' o '1'. La interupción INT_EXT está usada por otra cosa.
Lo he intentado de esta forma, pero no funciona bien.
Clics=0;
if(EstadoAnterior!=input(PIN_A1)){
delay_ms(200);
EstadoAnterior=input(PIN_A1);
Clics++;
}
while((EstadoAnterior==input(PIN_A1))&&(cont<1000)){
cont++;
delay_ms(1);
}
if(EstadoAnterior!=input(PIN_A1)){
delay_ms(200);
EstadoAnterior=input(PIN_A1);
Clics++;
}
while((EstadoAnterior==input(PIN_A1))&&(cont<1000)){
cont++;
delay_ms(1);
}
if(EstadoAnterior!=input(PIN_A1)){
delay_ms(200);
EstadoAnterior=input(PIN_A1);
Clics++;
}
while((EstadoAnterior==input(PIN_A1))&&(cont<1000)){
cont++;
delay_ms(1);
}
if(EstadoAnterior!=input(PIN_A1)){
delay_ms(200);
EstadoAnterior=input(PIN_A1);
Clics++;
}
while((EstadoAnterior==input(PIN_A1))&&(cont<1000)){
cont++;
delay_ms(1);
}
cont=0;
Un saludo, espero alguna idea.
-
No sería más facil incrementar un contador por pulsación y mirar (cuando haya pasado 1 segundo) cuanto tienes en el contador y hacer un jump dependiendo del valor que te haya dado el contador?
cont=0
loop
puls = 1?
no= voy a loop
si= antirrebotes
cont= cont+1
ha pasado 1 segundo?
no= vuelvo a loop
si entonces cont= 1? si = vete a menu 1, no = continua
cont=2? si= vete a menu 2
etc
etc
menu1 = printf" Invítame una cerveza";
menu2 = printf" Invítame otra cerveza";
cont=0
vuelvo a loop
Algo así. Ya sabrás como hacerlo en C que yo no tengo idea :P
-
Buenas, eso traducido al C, es algo así:
int Clics=0;
int16 cont=0;
do{
if(EstadoInterruptorAnterior!=INTERRUPTOR_PARED){
delay_ms(100);//antirrebotes
cont=cont+100;
if(EstadoInterruptorAnterior!=INTERRUPTOR_PARED){
Clics++;
EstadoInterruptorAnterior=INTERRUPTOR_PARED;
}
}
delay_ms(1);
cont++;
}while(cont<700);
switch (Clics) {
case 0x01: { Te debo una cerveza }
Break;
case 0x02: { Te debo dos cervezas }
Break;
case 0x04: { Te debo cuatro cervezas }
Break;
}
Pero no me convence demasiado, si se produce un 'Clic' durante el antirrebotes no lo detecta.
-
Ese antirrebotes es demasiado alto, con 15 o 20ms tendrás suficiente en la mayoría de las ocasiones, y así será mucho más difícil que haya clicks dentro del delay.
-
Ese antirrebotes es demasiado alto, con 15 o 20ms tendrás suficiente en la mayoría de las ocasiones, y así será mucho más difícil que haya clicks dentro del delay.
:shock: Yo siempre pongo 150 ms de antirrebote ¿es mucho, querido manolo?
-
La experiencia empírica indica que el periodo transitorio de un rebote depende entre otros factores, de la calidad de los switches y de la rapidez de su accionamiento, pero a lo más puede durar unos 20 milisegundos.
-
Ufff !!!
Todos los pulsadores con los que he trabajado son de mala calidad ... me ha tocado colocar delays de 120mS (y eso que coloco el condensador en paralelo a los contactos del switch)!!!!!
-
Quizás es que mi experiencia con pulsadores está limitada a los que funcionan medio bien, porque con 20ms siempre me ha ido bien.
Aunque también es verdad que a mí no me gusta implementar los antirrebotes así, sino de esta otra manera:
1.- Detecto pulsación
2.- Espero 20ms
3.- Bucle en esta línea mientras siga pulsado
4.- Aquí ha soltado el botón y puedo dar por terminado el click sin rebotes.
-
1.- Detecto pulsación
2.- Espero 20ms
3.- Bucle en esta línea mientras siga pulsado
4.- Aquí ha soltado el botón y puedo dar por terminado el click sin rebotes.
Ejemplo, pon un ejemplo en C. Vamos. Corre. ¡¡¡ Ya !!! :D :D :D
-
Pero si casi está hecho :D
if (pin_entrada==1) {
delay_ms(20);
while (pin_entrada);
Click++;
}
-
Quiero recordar que uno de los primeros experimentos que hice fue medir un tren de pulsos de rebotes en un botón ... voy a ver si logro encontrarlo ...
Edito:
Lo encontré. Análisis de rebotes mediante un programa monitor. (http://picmania.garcia-cuervo.com/Proyectos_AUX_Botones.php#BOUNCEANALISIS) ¡¡¡ Ufff !!! debí utilizar un magnifico pulsador porque tenía rebotes solo durante 0.8 ms, exactamente 770 microsegundos rebotando en 5 saltos consecutivos ...
(http://picmania.garcia-cuervo.com/images/AUX_Button_Bounce_Cronograma.JPG)
-
Hola.
Yo se usar asi:
if(state(button))
{
delay_ms(120);
if(state(button))
{
clik++;
while(state(button));
}
}
Parece que sobraria el segundo if si coloco el while antes de evaluar la variable ....
-
A mí me sigue pareciendo una pasada 120ms. Si el usuario da dos pulsaciones rápidas seguro que te pierdes una.