Autor Tema: Distinguir 1,2,4 clics  (Leído 2595 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Distinguir 1,2,4 clics
« 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.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: Distinguir 1,2,4 clics
« Respuesta #1 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
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: Distinguir 1,2,4 clics
« Respuesta #2 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.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Distinguir 1,2,4 clics
« Respuesta #3 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.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Distinguir 1,2,4 clics
« Respuesta #4 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?
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Distinguir 1,2,4 clics
« Respuesta #5 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.
No contesto mensajes privados, las consultas en el foro

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Distinguir 1,2,4 clics
« Respuesta #6 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)!!!!!
El papel lo aguanta todo

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Distinguir 1,2,4 clics
« Respuesta #7 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.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Distinguir 1,2,4 clics
« Respuesta #8 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
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Distinguir 1,2,4 clics
« Respuesta #9 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++;
}

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Distinguir 1,2,4 clics
« Respuesta #10 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. ¡¡¡ Ufff !!! debí utilizar un magnifico pulsador porque tenía rebotes solo durante 0.8 ms, exactamente 770 microsegundos rebotando en 5 saltos consecutivos ...

« Última modificación: 07 de Marzo de 2009, 06:57:10 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Distinguir 1,2,4 clics
« Respuesta #11 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 ....
El papel lo aguanta todo

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Distinguir 1,2,4 clics
« Respuesta #12 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.