Autor Tema: Como detectar si se pulsa un boton y enviar una informacion una sola vez?  (Leído 2526 veces)

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

Desconectado Elessar_Felagund

  • PIC10
  • *
  • Mensajes: 12
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.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como detectar si se pulsa un boton y enviar una informacion una sola vez?
« Respuesta #1 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.       }
No contesto mensajes privados, las consultas en el foro

Desconectado ASTROCAR

  • PIC24F
  • *****
  • Mensajes: 664
Re: Como detectar si se pulsa un boton y enviar una informacion una sola vez?
« Respuesta #2 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.
EL APRENDER ES NADA; MEJOR ES COMPARTIR EL APRENDIZAJE

Desconectado Elessar_Felagund

  • PIC10
  • *
  • Mensajes: 12
Re: Como detectar si se pulsa un boton y enviar una informacion una sola vez?
« Respuesta #3 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. :)

Desconectado ASTROCAR

  • PIC24F
  • *****
  • Mensajes: 664
Re: Como detectar si se pulsa un boton y enviar una informacion una sola vez?
« Respuesta #4 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.
EL APRENDER ES NADA; MEJOR ES COMPARTIR EL APRENDIZAJE

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Como detectar si se pulsa un boton y enviar una informacion una sola vez?
« Respuesta #5 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.
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.


 

anything