TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: hctransaut en 12 de Abril de 2018, 11:26:58

Título: Encender y apagarlo con distinto botom
Publicado por: hctransaut en 12 de Abril de 2018, 11:26:58
Hola amigos del foro TODOPIC saludos, estoy buscando la forma en lenguaje c de encender un led con pulsador y apagarlo con otro pulsador, les agradecería esta ayuda en vista soy nuevo en lo relacionado con programación, por cierto muy interesante lo que he leído en los diferentes temas gracias.
Título: Re:Encender y apagarlo con distinto botom
Publicado por: KILLERJC en 12 de Abril de 2018, 11:54:56
Lo mas simple que podes llegar es el siguiente codigo

Suponiendo que el boton da un 1 al ser presionado (sino cambiar la logica a 0 )

Código: C
  1. while(1)
  2. {
  3.    if(boton_on == 1)
  4.    {
  5.         salida_led = 1;
  6.    }
  7.    if(boton_off == 1)
  8.    {
  9.         salida_led = 0;
  10.    }
  11. }

cambiar boton_on / boton_off y salida_led a lo necesario..
Ejemplo para boton_on, supongamos RB0.
En XC8 : PORTBbits.RB0
En CCS: input(PIN_B0)

para salida_led supongamos que esta en RB7:
En XC8: PORTBbits.RB7
En CCS: output_high(PIN_B7) y output_low(PIN_B7) si deseas ponerlo a 1 o 0 respectivamente
Título: Re:Encender y apagarlo con distinto botom
Publicado por: hctransaut en 15 de Abril de 2018, 08:01:04
Gracias KILLERJC, por tu ayuda lo probare.
Título: Re:Encender y apagarlo con distinto botom
Publicado por: micronet3 en 16 de Abril de 2018, 23:20:20
killer tu codigo no va a funcionar porque el codigo se va a ejecutar muchas veces y no hay manera de saber si quedara encendido o apagad
Título: Re:Encender y apagarlo con distinto botom
Publicado por: KILLERJC en 17 de Abril de 2018, 09:15:56
Si funcionaria micronet, son 2 botones distintos, si fuera un boton si tendria problemas el codigo, pero al ser 2 botones distintos (uno para encendido y otro para apagado), no importa cuantas veces entre al if de encendido por ejemplo, ya que siempre estaria poniendole un 1 a la salida que estaba en 1, y nunca cambiaria. Lo mismo ocurre con el boton de apagado, si esta en 0 la salida y la vuelvo a poner en 0, sigue en 0.

Lo que si el problema que puede llegar a tener es que NO se mantengan presionado los 2 botones (que alternaria la salida), pero eso con agregarle un "else" al primer if se solucionaria y le damos prioridad al encendido en este caso.

Código: C
  1. if(boton_on == 1)
  2.    {
  3.         salida_led = 1;
  4.    }
  5.    else
  6.    {
  7.       if(boton_off == 1)
  8.       {
  9.            salida_led = 0;
  10.       }
  11.    }

La idea fue hacerlo lo mas simple posible al codigo
Título: Re:Encender y apagarlo con distinto botom
Publicado por: micronet3 en 17 de Abril de 2018, 12:11:04
tienes razon killerjc, estaba considerando lo que tu explicas pero para este caso si funciona sin problemas, los rebotes no importan!
Título: Re:Encender y apagarlo con distinto botom
Publicado por: electroipod en 27 de Abril de 2018, 01:02:52
Creo que si nos complicamos un poco la vida también podría ser así.

while (1)
{
while (boton_off ^boton_on) ;
salida_led=! boton_off&&boton_on;
while (boton _on) ;
while (boton_off) ;
}
Título: Re:Encender y apagarlo con distinto botom
Publicado por: KILLERJC en 27 de Abril de 2018, 08:41:45
Podes reemplazar:

Código: C
  1. while (boton _on) ;
  2. while (boton_off) ;

Por:

Código: C
  1. while (boton _on || boton_off) ;

Pero no la compliquemos y la hagamos bloqueante.. simplifiquemos mas siguiendo tu metodo:

Código: C
  1. while(1)
  2. {
  3.   if(boton_off ^ boton_on)
  4.     salida_led=boton_on;
  5. }

Suponiendo que no cambie el estado del boton luego de pasar el IF, al if pasa con 2 opciones, uno tienen que ser 0 y el otro 1. O sea 01 y 10, Y justamente tiene el estado correcto del boton_on, asi que no es necesario poner boton_off. Pero para estar bien seguros nunca deberia suceder lo de la "posibilidad" que cambie el estado mientras pasa, asi que deberia usarse una variable para cargar boton_off y boton_on y usar esta.

Código: C
  1. while(1)
  2. {
  3.   char a = boton_off ^ boton_on;
  4.   if(a)
  5.     salida_led=a;
  6. }
Título: Re:Encender y apagarlo con distinto botom
Publicado por: electroipod en 27 de Abril de 2018, 10:42:12
Podes reemplazar:

Código: C
  1. while (boton _on) ;
  2. while (boton_off) ;

Por:

Código: C
  1. while (boton _on || boton_off) ;

Pero no la compliquemos y la hagamos bloqueante.. simplifiquemos mas siguiendo tu metodo:

Código: C
  1. while(1)
  2. {
  3.   if(boton_off ^ boton_on)
  4.     salida_led=boton_on;
  5. }

Suponiendo que no cambie el estado del boton luego de pasar el IF, al if pasa con 2 opciones, uno tienen que ser 0 y el otro 1. O sea 01 y 10, Y justamente tiene el estado correcto del boton_on, asi que no es necesario poner boton_off. Pero para estar bien seguros nunca deberia suceder lo de la "posibilidad" que cambie el estado mientras pasa, asi que deberia usarse una variable para cargar boton_off y boton_on y usar esta.

Código: C
  1. while(1)
  2. {
  3.   char a = boton_off ^ boton_on;
  4.   if(a)
  5.     salida_led=a;
  6. }
Pero el led nunca se va apagar, revisa tu código.
Título: Re:Encender y apagarlo con distinto botom
Publicado por: KILLERJC en 27 de Abril de 2018, 10:56:18
Tenes razón, en mi ultimo código nunca se va a apagar. Pero este funcionaria (jugando a la ruleta rusa  :D ):

Código: C
  1. while(1)
  2. {
  3.   if(boton_off ^ boton_on)
  4.     salida_led=boton_on;
  5. }

Todas las soluciones para incorporar alguna especie de protección ante el cambio de la entrada en ese punto que se me ocurren ahora ya vamos a definir 2 o mas variables.. y dejan de ser tan cortitas asi  :(
Me refiero a sin hacerlas bloqueante, sino agregandole un while al final lo soluciona. Del mismo tipo que tenes vos, es decir:

Código: C
  1. while(1)
  2. {
  3.   if(boton_off ^ boton_on)
  4.     salida_led=boton_on;
  5.   while( boton_on || boton_off );
  6. }

O de ultima y creo que solucion final ahora si, entonces no hay mas problemas con que cambie boton_on en medio de la situacion (aunque para mi lo correcto es que se tomen ambos botones y leerse juntos):

Código: C
  1. while(1)
  2. {
  3.   bool a = boton_on;
  4.   if(boton_off ^ a)
  5.     salida_led=a;
  6. }

PD: Esto es puramente por diversion jeje
PD2: Espero no haberme equivocado de nuevo