Autor Tema: Encendido de dos Leds  (Leído 3824 veces)

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

Desconectado Moradrinck

  • PIC10
  • *
  • Mensajes: 13
Encendido de dos Leds
« en: 30 de Enero de 2020, 15:23:48 »
¡Hola gente del foro!
Me podrían ayudar con el encendido de dos leds, se oye bastante fácil pero no logro conseguirlo, el tema es que tengo un pulsador, y dos leds, cuando se presiona el botón y se mantiene presionado se enciende el led 1, mientras el led 2 esta apagado, se suelta el botón  y el led 1 se apaga, al volver a presionar el botón se enciende el led 2, y el led 1 se mantiene apagado, al soltar el botón se apaga el led 2, y es si se vuelve a presionar el botón se repite el proceso.
No se si me di a entender.
Espero me puedan ayudar dando me ideas ya que no logro hacerlo.
No hace falta gente que labure más, hace falta que con menos se pueda vivir en paz.

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:Encendido de dos Leds
« Respuesta #1 en: 30 de Enero de 2020, 15:45:19 »
Que tal Moradrinck,

¿Podrías decirnos cuál microcontrolador estás usando?
¿Cuál lenguaje de programación estás usando (ASM, C, PASCAL, BASIC) y en su caso el compilador usado (CCS, XC, MIKROC, PBP, PROTON?
Por favor sube el código que tienes hasta ahora.

elreypic.


Desconectado Moradrinck

  • PIC10
  • *
  • Mensajes: 13
Re:Encendido de dos Leds
« Respuesta #2 en: 30 de Enero de 2020, 15:56:24 »
Estoy usando el compilador CCS V5.091, microcontrolador PIC 18F4550
El código hasta ahora es muy pobre y sin sentido por lo mismo de que lo estoy modificando constantemente.
Pero aquí lo tienen.


#include<18f4550.h>
#fuses PLL5, CPUDIV1, HSPLL, USBDIV, NOFCMEN, NOIESO, VREGEN, NOWDT, MCLR, NOSTVREN, NODEBUG, NOBROWNOUT, PUT, NOPROTECT
#use delay(clock=20MHZ)

#USE STANDARD_IO(B)
#USE STANDARD_IO(D)

#define B1  PIN_B0
#define L1  PIN_D0
#define L2  PIN_D1

int c=0;

void main(){
   while(TRUE){
         if(!input(B1)){
            output_toggle(L1);
            delay_ms(10);
            while(!input(B1));
         }
   }
}

Lo que trato de hacer justo en este momento es logar al menos hacer correctamente la secuencia del led 1.

« Última modificación: 30 de Enero de 2020, 16:01:58 por Moradrinck »
No hace falta gente que labure más, hace falta que con menos se pueda vivir en paz.

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:Encendido de dos Leds
« Respuesta #3 en: 30 de Enero de 2020, 17:49:05 »
Y a casi lo tienes,

lo que te falta es inicializar el estado inicial del led con:

output_low(L1);


esto antes del ciclo while.
Otra cosa que debes hacer es eliminar los rebotes cuando se libera el pulsador, y eso se logra metiendo tu función del delay en el último while.

Código: [Seleccionar]
do
{
delay_ms(20);
}while (!input(B1))

tu código quedaría mas o menos así:

Código: [Seleccionar]
void main(){                         //Función principal
   while(TRUE){                    //Loop infinito
         if(!input(B1)){            //Se ha presionado el pulsador del puerto B0?
            output_high(L1);     //Sí, entonces enciende el led 1
            do
            {
                 delay_ms(20);     //Realiza un delay de 20 ms para eliminar los rebotes
             }while(!input(B1));  //Continua ejecutando un delay de 20ms hasta que se libere el pulsador
         }
         delay_ms(20);       //Si se ha liberado el pulsador realiza un delay de 20ms para eliminar los rebotes de liberación
         output_low(L1);     //Apaga el led1
   }
}


En realidad por ahora no necesitas eliminar los rebotes con un solo led, pero sí lo necesitarás cuando trabajes con el segundo led.
Con esto ya tienes una idea de como seguir adelante.

elreypic.



Desconectado Moradrinck

  • PIC10
  • *
  • Mensajes: 13
Re:Encendido de dos Leds
« Respuesta #4 en: 04 de Febrero de 2020, 16:47:21 »
Ya logre realizar lo correctamente con los dos leds, gracias por la ayuda, les dejo el código para ver si alguien le sirve en un futuro.
 
#include<18f4550.h>
#fuses PLL5, CPUDIV1, HSPLL, USBDIV, NOFCMEN, NOIESO, VREGEN, NOWDT, MCLR, NOSTVREN, NODEBUG, NOBROWNOUT, PUT, NOPROTECT
#use delay(clock=20MHZ)

#USE STANDARD_IO(B)
#USE STANDARD_IO(D)

#define B1  PIN_B0
#define L1  PIN_D0
#define L2  PIN_D1

int cache_led1=0;
int cache_led2=1;

void main(){
   while(TRUE){
         if(input(B1)){
            if(cache_led1==1 && cache_led2==0){
               output_high(L1);
               output_low(L2);
               cache_led1=0;
               cache_led2=1;
               while(input(B1));
               cache_led1=0;
               cache_led2=1;
            }else if(cache_led1==0 && cache_led2==1){
               output_high(L2);
               output_low(L1);
               cache_led1=1;
               cache_led2=0;
               while(input(B1));
               cache_led1=1;
               cache_led2=0;
            }
         }else{
         output_low(L1);
         output_low(L2);
         }
   }
}
« Última modificación: 04 de Febrero de 2020, 17:06:50 por Moradrinck »
No hace falta gente que labure más, hace falta que con menos se pueda vivir en paz.


 

anything