TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: micro_pepe en 06 de Marzo de 2009, 10:20:09

Título: Distinguir 1,2,4 clics
Publicado 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.

Código: [Seleccionar]
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.
Título: Re: Distinguir 1,2,4 clics
Publicado por: pibe en 06 de Marzo de 2009, 10:38:30
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
Título: Re: Distinguir 1,2,4 clics
Publicado por: micro_pepe en 06 de Marzo de 2009, 20:05:55
Buenas, eso traducido al C, es algo así:

Código: [Seleccionar]
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.
Título: Re: Distinguir 1,2,4 clics
Publicado por: Nocturno en 06 de Marzo de 2009, 20:29:00
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.
Título: Re: Distinguir 1,2,4 clics
Publicado por: RedPic en 06 de Marzo de 2009, 20:34:52
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?
Título: Re: Distinguir 1,2,4 clics
Publicado por: Suky en 06 de Marzo de 2009, 23:16:52
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.
Título: Re: Distinguir 1,2,4 clics
Publicado por: MLO__ en 06 de Marzo de 2009, 23:33:25
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)!!!!!
Título: Re: Distinguir 1,2,4 clics
Publicado por: Nocturno en 07 de Marzo de 2009, 04:59:32
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.
Título: Re: Distinguir 1,2,4 clics
Publicado por: RedPic en 07 de Marzo de 2009, 06:38:13
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
Título: Re: Distinguir 1,2,4 clics
Publicado por: Nocturno en 07 de Marzo de 2009, 06:44:59
Pero si casi está hecho :D

if (pin_entrada==1) {
   delay_ms(20);
   while (pin_entrada);
   Click++;
}
Título: Re: Distinguir 1,2,4 clics
Publicado por: RedPic en 07 de Marzo de 2009, 06:49:28
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)
Título: Re: Distinguir 1,2,4 clics
Publicado por: MLO__ en 07 de Marzo de 2009, 14:35:00
Hola.

Yo se usar asi:

Código: [Seleccionar]
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 ....
Título: Re: Distinguir 1,2,4 clics
Publicado por: Nocturno en 07 de Marzo de 2009, 15:12:58
A mí me sigue pareciendo una pasada 120ms. Si el usuario da dos pulsaciones rápidas seguro que te pierdes una.