TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Moradrinck en 30 de Enero de 2020, 15:23:48

Título: Encendido de dos Leds
Publicado por: Moradrinck 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.
Título: Re:Encendido de dos Leds
Publicado por: elreypic2 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.

Título: Re:Encendido de dos Leds
Publicado por: Moradrinck 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.

Título: Re:Encendido de dos Leds
Publicado por: elreypic2 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.


Título: Re:Encendido de dos Leds
Publicado por: Moradrinck 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);
         }
   }
}