Autor Tema: Como haceil para leer interruptores?  (Leído 12827 veces)

0 Usuarios y 4 Visitantes están viendo este tema.

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Como haceil para leer interruptores?
« Respuesta #30 en: 25 de Febrero de 2011, 13:17:44 »
excalibur1491:
                Por ahora olvidate del algoritmo del antirebote y probá sólo con bajar el delay de 100ms a 20 ms para ver que resultado tenés.
                Dependiendo de la calidad del botón podés llegar hasta los 5ms. Pero es cuestión de que pruebes.
                     Saludos.
                         Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado excalibur1491

  • PIC10
  • *
  • Mensajes: 44
Re: Como haceil para leer interruptores?
« Respuesta #31 en: 25 de Febrero de 2011, 14:53:42 »
excalibur1491:
                Por ahora olvidate del algoritmo del antirebote y probá sólo con bajar el delay de 100ms a 20 ms para ver que resultado tenés.
                Dependiendo de la calidad del botón podés llegar hasta los 5ms. Pero es cuestión de que pruebes.
                     Saludos.
                         Jukinch

sip, todo perfecto, con 20 ms va de perlas :):)
pues muchisimas gracias por todo y a todos :)

ya entendi tu bucle anti rebotes, como no has puesto los { } pense que era "else if" y no entendia.. pero es else "osea si no se ha apretado"
y junto con la explicacion de angel gris he entendido: arranca aumenta si se esta pulsando el interruptor Bien pulsao... sino lo decrementas

un millon de gracias.

una ultima dudilla: si quiero que pareczca que un monton de diodos estan encendido pero que solo hay uno encendido a la vez.. de cuanto pongo el delay entre que se enciende y que se apaga cada led?


Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Como haceil para leer interruptores?
« Respuesta #32 en: 25 de Febrero de 2011, 15:11:43 »
Que bueno que funcione. Gracias a AngelGris también.
 Perdón por el error de los {   }     

Con respecto al tiempo que preguntas para que parezca todo encendido hacé el cálculo para que se prenda la misma columna de leds unas 20 veces por segundo como mínimo. Con eso el ojo humano ya no lo va a ver parpadeando.

Me hiciste acordar a un artículo que publicó un amigo sobre POV persistent of vision.
http://www.neoteo.com/pov-escribe-con-luz-en-el-aire.neo
             Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Como haceil para leer interruptores?
« Respuesta #33 en: 28 de Febrero de 2011, 04:17:44 »
Una pregunta respecto a:

Código: [Seleccionar]
do   {

     if (input(PIN_B0) ) // controla si el botón se pulsó
         arranca=arranca+1;
      ELSE
          IF (ARRANCA>1)
            arranca=arranca-1;

 }while(arranca<=100);


¿Cuando sale del while?

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Como haceil para leer interruptores?
« Respuesta #34 en: 28 de Febrero de 2011, 04:19:46 »
Según lo interpreto, si la entrada B0 permanece a nivel alto durante más de 100 iteraciones, saldrá del while, ¿no?

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Como haceil para leer interruptores?
« Respuesta #35 en: 28 de Febrero de 2011, 05:33:06 »
Sí, para 101 saldria del while, pero ahora para una nueva lectura que hacemos? arranca=0 ----> se quedaria enganchado en el while.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Como haceil para leer interruptores?
« Respuesta #36 en: 28 de Febrero de 2011, 05:44:38 »
Según lo veo si este trocito de programa fuese para pulsadores RB4..RB7 y este programita se pusiese dentro de la interrupción sí que serviria para los antirebotes haciendo al acabar arranca=0.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Como haceil para leer interruptores?
« Respuesta #37 en: 28 de Febrero de 2011, 10:01:18 »
  El código funciona como lo comenta Nocturno, a más de 100 interacciones sale del while. A ese código le encontré, quizá, un defecto y es que si la interrupción se produce por cambio de flanco pero cuando soltamos la tecla, el pulsador nunca va a leer un nivel alto y por lo tanto no saldrá del while.

  Pero imagino que se podría solucionar de la siguiente manera....

Código: C
  1. arranca = 125;
  2. do
  3. {
  4.   if (input(PIN_B0) ) // controla si el botón se pulsó
  5.     arranca = arranca+1;
  6.   ELSE
  7.     arranca = arranca-1;
  8.  }
  9. while (arranca < 250) && (arranca > 0);

  De esa manera si está mucho tiempo suelto el botón también saldría del while.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Como haceil para leer interruptores?
« Respuesta #38 en: 01 de Marzo de 2011, 07:42:54 »
Te refieres a que si la interrupción es por flanco descendente?

Si es así, solo habría que cambiar:

Código: [Seleccionar]
do   {

     if (!input(PIN_B0) ) // controla si el botón se pulsó
         arranca=arranca+1;
      ELSE
          IF (ARRANCA>1)
            arranca=arranca-1;

 }while(arranca<=100);

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Como haceil para leer interruptores?
« Respuesta #39 en: 01 de Marzo de 2011, 09:02:39 »
  No exactamente.
  Muchas veces los pulsadores también generan rebote cuando los soltamos.
  Suponiendo que el pulsador une el pin del pic con VCC, cuando lo soltamos el pin quedaría a GND por medio de una resistencia. Pero con la rutina, tal cual estaba originalmente, se esperaba a que haya x cantidad de intereacciones y se salía sí y solo sí había muchas con el pin en alto. Por ende si se la utilizaba para tratar de eliminar el rebote cuando se suelta el pulsador, nunca se iba a salir, ya que no iba a haber muchas interacciones con el pin en alto.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Como haceil para leer interruptores?
« Respuesta #40 en: 02 de Marzo de 2011, 05:59:23 »
Los pulsadores siempre generan rebotes cuando los soltamos.

Supongo que cuando te refieres a "por cambio de flanco" te estas refiriendo a por cambio de estado en pines RB4..RB7 ¿es así? , conviene aclararlo porque si no, nos liaremos.

Si la interrupción es por cambio de estado en RB4..RB7, efectivamente al soltar la tecla de nuevo se entraria en la interrupción y como RB4=0, no se saldria del while.

Código: [Seleccionar]
#INT_RB
interrupcion_RB4_RB7()
{
arranca=0;
do   {

     if (input(PIN_B4) ) // controla si el botón se pulsó
         arranca=arranca+1;
     else
          if(arranca>1)
             arranca=arranca-1;
 }while(arranca<=100);
.
.
.
 

La solución es como dices:
Código: [Seleccionar]
#INT_RB
interrupcion_RB4_RB7()
{
      arranca = 0;
      do
      {
       if (input(PIN_B4) ) // controla si el botón se pulsó
         arranca = arranca+1;
       else                              //Se ha quitado el  if(arranca>1)
         arranca = arranca-1;
      }
      while (arranca < 100) && (arranca > 0);      //La variable arranca debe se definida como signed
 

Si la interrupción es por flanco ascendente ó descendente en RB0, no habrían problemas y se mantendría el código original de jukinch:

Por flanco ascendente:

Código: [Seleccionar]
#INT_EXT
interrupcion_RB0()
{
      arranca = 0;
      do   {
     if (input(PIN_B0) ) // controla si el botón se pulsó
         arranca=arranca+1;
      ELSE
          IF (ARRANCA>1)
            arranca=arranca-1;
 }while(arranca<=100);

Por flanco descendente:

Código: [Seleccionar]
#INT_EXT
interrupcion_RB0()
{
      arranca = 0;
      do   {
     if (!input(PIN_B0) )          // esta es la unica modificacion
         arranca=arranca+1;
      ELSE
          IF (ARRANCA>1)
            arranca=arranca-1;
 }while(arranca<=100);

Espero no haberme equivocado.

Un saludo

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Como haceil para leer interruptores?
« Respuesta #41 en: 02 de Marzo de 2011, 06:53:46 »
Gracias Pocher por tus correcciones y tu tiempo. Muy claras tus explicaciones.
Conoces algún otro algoritmo de antirebote que no sea por espera de un tiempo X?
             Saludos.
                         Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Como haceil para leer interruptores?
« Respuesta #42 en: 02 de Marzo de 2011, 09:33:06 »
Los pulsadores siempre generan rebotes cuando los soltamos.

Supongo que cuando te refieres a "por cambio de flanco" te estas refiriendo a por cambio de estado en pines RB4..RB7 ¿es así? , conviene aclararlo porque si no, nos liaremos.

Si la interrupción es por cambio de estado en RB4..RB7, efectivamente al soltar la tecla de nuevo se entraria en la interrupción y como RB4=0, no se saldria del while.


  Sí, me refería a cambio de estado, pido disculpas si generé confusión.


................

La solución es como dices:
Código: [Seleccionar]
#INT_RB
interrupcion_RB4_RB7()
{
      arranca = 0;
      do
      {
       if (input(PIN_B4) ) // controla si el botón se pulsó
         arranca = arranca+1;
       else                              //Se ha quitado el  if(arranca>1)
         arranca = arranca-1;
      }
      while (arranca < 100) && (arranca > 0);      //La variable arranca debe se definida como signed
 



  En ese código, yo le asignaría el valor 125 (para que pueda contar aproximadamente 125 interacciones con el botón pulsado y también 125 interacciones con el botón suelto) a la variable arranca. Y en cuanto a que tenga que ser definida como signed, creo que no es necesario. Ten en cuenta que cuando la variable valga 0, saldrá del while y por lo tanto no se corre riesgo de que se siga decrementando por error.

  Quedaría así...

Código: C
  1. arranca = 125;
  2. do
  3. {
  4.   if (input(PIN_B4) )         // controla si el botón se pulsó
  5.   arranca = arranca+1;
  6.   else                              //Se ha quitado el  if(arranca>1)
  7.     arranca = arranca-1;
  8. }
  9. while (arranca < 250) && (arranca > 0);
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Como haceil para leer interruptores?
« Respuesta #43 en: 02 de Marzo de 2011, 13:34:47 »
Tienes razón AngelGris, pido disculpas por el error.

Repito el código de AngelGris para que quede claro.

Esta rutina genera antirebotes tanto al pulsar como al soltar la tecla:

Código: [Seleccionar]
#INT_RB
interrupcion_RB4_RB7()
{
      arranca = 125;
      do
      {
       if (input(PIN_B4) ) // controla si el botón se pulsó
         arranca = arranca+1;
       else                              
         arranca = arranca-1;
      }
      while (arranca < 250) && (arranca > 0);  
.
.
.

 Además también serviría tanto para flanco ascendente como descendente en RB0:

Código: [Seleccionar]
#INT_EXT
interrupcion_RB0()
{
      arranca = 125;
      do
      {
       if (input(PIN_B0) ) // controla si el botón se pulsó
         arranca = arranca+1;
       else                             
         arranca = arranca-1;
      }
      while (arranca < 250) && (arranca > 0);   
.
.
.
« Última modificación: 02 de Marzo de 2011, 13:46:47 por pocher »

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: Como haceil para leer interruptores?
« Respuesta #44 en: 03 de Marzo de 2011, 09:00:08 »
Muy buenas, sobre el tema este del antirrebote, en el primer ejemplo el del "while(arranca<=100);" yo entiendo que sí se saldría del while (pensando que la variable arranca es de tipo unsigned char) ya que 0-1=255 por lo que o por arriba o por abajo al 100 llegaremos. Es más con el "<=" al 255 ya saldría del bucle.

Un saludo
« Última modificación: 03 de Marzo de 2011, 09:03:34 por tannke »


 

anything