TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado 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.
-
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.
-
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.
-
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.
do
{
delay_ms(20);
}while (!input(B1))
tu código quedaría mas o menos así:
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.
-
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);
}
}
}