TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Elessar_Felagund en 10 de Junio de 2009, 11:33:04

Título: Como detectar si se pulsa un boton y enviar una informacion una sola vez?
Publicado por: Elessar_Felagund en 10 de Junio de 2009, 11:33:04
Hola buenas,

Vereis, estoy un poco verde en esto del lenguaje C (que ademas es el unico lenguaje que se un poco) y no se como hacer una cosa.

He hecho un programa para el pic 18f4550 y en el programa tengo que detectar si se pulsa un boton y enviar un codigo cuando se pulse, para lo cual he hecho un bucle while como sigue:

     while(1)
     {
          if (PORTBbits.RB4==0)      // Si pulso el boton que he puesto en RB4...
          {
                PORTC = Code           // Envio el codigo por el puerto C
           }
.
.
.                                                // Resto del programa
.
.
      }


El problema es que mientras se pulsa el boton, como la velocidad del pic es muy grande comparado al tiempo que tardamos en apretar el boton y soltarlo, me envia el codigo muchas veces. Y yo lo que quiero es que me lo envie una sola vez.

Entonces como puedo hacer para que el pic detecte si se pulsa el boton y en ese momento envie el codigo una sola vez???

Muchas gracias de antemano y espero que la solucion sea simple.

Saludos.
Título: Re: Como detectar si se pulsa un boton y enviar una informacion una sola vez?
Publicado por: Suky en 10 de Junio de 2009, 11:55:48
Lo único que le agregaria seria un bucle en espera a que se suelte el pulsador.

Código: C
  1. while(1)
  2.      {
  3.           if (PORTBbits.RB4==0)      // Si pulso el boton que he puesto en RB4...
  4.           {
  5.                 PORTC = Code           // Envio el codigo por el puerto C
  6.                 while(PORTBbits.RB4==0){}// Esperas hasta que se suelte.
  7.            }
  8.  
  9.       }
Título: Re: Como detectar si se pulsa un boton y enviar una informacion una sola vez?
Publicado por: ASTROCAR en 10 de Junio de 2009, 14:51:31
Hola otra manera seria aplicando el principio de las interrupciones  pero el ejemplo que coloco el colega Suky esta de lujo.

Saludos y espero puedas resolver.
Atten.
Alexander Santana.
Barcelona-Venezuela.
Título: Re: Como detectar si se pulsa un boton y enviar una informacion una sola vez?
Publicado por: Elessar_Felagund en 11 de Junio de 2009, 04:03:55

Genial, muchas gracias Suky, realmente la solucion era muy simple pero no se me ocurrio.

Y en cuanto a lo de las interrupciones lo tenia rondando por la cabeza que podria ser eso pero aun no he llegado a estudiarlas, solo se que existen.

Muchas gracias a los dos de todas formas. :)
Título: Re: Como detectar si se pulsa un boton y enviar una informacion una sola vez?
Publicado por: ASTROCAR en 11 de Junio de 2009, 21:45:16
me alegra que hallas resuelto y nos gustaria que mostraras todo lo que hices para ver quye tal te fue.

Saludos.
Atten.
Alexander Santana.
Barcelona-Venezuela.
Título: Re: Como detectar si se pulsa un boton y enviar una informacion una sola vez?
Publicado por: KALLITOS en 17 de Junio de 2009, 16:00:17
Hola, bueno segun parece solucionaron el problema pero la situación es quecuando se hace uso de while el pic se queda realizando esa tarea mientras se cumpla la condicion o el control del pic lo tome una interrupcion que luego regresara al while, lo malo de esto es que si necesitas hacer otras cosas no se podra mientras no salga del bucle.
Yo te recomiendo uses flags o banderas para indicar que un evento ya ocurrio po ejemplo

int1 flag_entrada = 0;

IF ((entrada == 1)&&(flag_entrada == 1))
   {
      flag_entrada == 0;
     .
     .Lo que quieras cuando se presiona el boton.
     .
    }

IF(entrada == 0)
 {flag_entrada = 1;}


con este flag_entrada el pic respondera solo una vez hasta que se suelte el boton y podras hacer otras cosas mientras el boton este preionado.
Como un maestro del foro me comento, no sirve de nada tener un pic corriendo a 40MIPS si no aprovechamos al maximo este recurso  :)

Saludos.