¿Cómo encender y apagar LED's con PIC y PICC Compiler?

Hola. ¿Qué tal?
Tengo que realizar un programa en donde 4 led's y 4 pulsadores simulan el sentido de giro de 2 motores:
led1 (motor 1 der) pulsador1 ( los dos motores giran hacia la derecha)
led2 (motor 1 izq) pulsador2 ( los dos motores giran hacia la izquierda)
led3 (motor 2 der) pulsador 3 ( motor 1 gira hacia la derecha y motor 2 hacia la izquierda)
led4 (motor 2 izq) pulsador 4 ( motor 1 gira hacia izquierda y motor 2 hacia la derecha)

Entonces el problema es que haciendo hasta el pulsador 2 anda bien, pero con el pulsador 3 empieza a titilar el led1 y el led 4 porque se mezcla con las líneas de código del primer pulsador.

Aquí les dejo el código que llevo hasta ahora, incluido el problema:
Código:
void main()
{
set_tris_a(0b11111111);
set_tris_b(0b00000000);
while(true){
if(input(pin_a0)==0)
{
  output_low(pin_b0);
  output_low(pin_b2);
}
if(input(pin_a0)==1)
{
 output_high(pin_b0);
 output_high(pin_b2);
}
if(input(pin_a1)==0)
{
output_low(pin_b1);
output_low(pin_b3);
}
if(input(pin_a1)==1)
{
output_high(pin_b1);
output_high(pin_b3);
}
if(input(pin_a2)==0)
{
output_low(pin_b0);
output_low(pin_b3);
}
if(input(pin_a2)==1)
{
output_high(pin_b0);
output_high(pin_b3);
}
}
}
Si me pueden dar una solución se los agradecería.
Yo creo que una sería separando las líneas de código del pulsador uno de las del pulsador 3, pero no sé cómo la verdad.

Gracias.
 
Última edición por un moderador:
Yo, en el código, no veo problemas... pienso que debe haber un problema con el propio pulsador 3, y que lo que estás viendo es el rebote al pulsarlo.

PHP:
void main() {
    set_tris_a(0b11111111);
    set_tris_b(0b00000000);
    
    while (true) {
      if ( input(pin_a0) == 0 ) {
          output_low(pin_b0);
          output_low(pin_b2);
      }
      else {
          output_high(pin_b0);
          output_high(pin_b2);
      }
      
      if ( input(pin_a1) == 0 ) {
          output_low(pin_b1);
          output_low(pin_b3);
      }
      else {
          output_high(pin_b1);
          output_high(pin_b3);
      }

      if ( input(pin_a2) == 0 ) {
          output_low(pin_b0);
          output_low(pin_b3);
      }
      else {
          output_high(pin_b0);
          output_high(pin_b3);
      }
   }
}
 
es que mirá, el pulsador 3 tiene estas lineas :
if ( input(pin_a2) == 0 ) {
output_low(pin_b0);
output_low(pin_b3);
}

entonces cuando yo quiero pulsar el pulsador 1 el pulsador 3 esta abierto es decir en 0, entonces el programa pasa por la lineas del pulsador 1 y al llegar a la del pulsador 3 lo apaga por eso empieza a titilar.. porque se usa el mismo led.. no se si se entiende.. y ese es el problema, como hago para que cuando ejecuto las lineas del pulsador 1 no pase por las del pulsador 3?
 
la verdad es que no tengo idea de que quieres hacer, pero eso se puede simplificar asi(si no me equivoco XD):

output_bit( PIN_B0, input( PIN_A0 ));
output_bit( PIN_B2, input( PIN_A0 ));
output_bit( PIN_B1, input( PIN_A1 ));
output_bit( PIN_B3, input( PIN_A1 ));
output_bit( PIN_B0, input( PIN_A2 ));
output_bit( PIN_B3, input( PIN_A2 ));

quizas lo que necesitas es que no siempre este ejecutando la rutina. :unsure:


EDITO:

entraron juntos los mensajes ...:LOL: si, lo que necesitas es que no se repita...

puedes probar asi:

if (input( PIN_A0 )!=input(PIN_B2)){
output_bit( PIN_B0, input( PIN_A0 ));
output_bit( PIN_B2, input( PIN_A0 ));
}
if (input( PIN_A1 )!=input(PIN_B1)){
output_bit( PIN_B1, input( PIN_A1 ));
output_bit( PIN_B3, input( PIN_A1 ));
}
if (input( PIN_A2 )!=input(PIN_B3)){
output_bit( PIN_B0, input( PIN_A2 ));
output_bit( PIN_B3, input( PIN_A2 ));
}
 
Última edición:
Bueno, una forma de resolverlo es usando unas variables que guarden el estado anterior de los pulsadores, y dentro del bucle ver si alguno de los pulsadores tiene un estado distinto al que guardan las variables, y si es así, des/activar las salidas correspondientes.

Sería algo así (no probado):

PHP:
void main() {
    char pulsador1;
    char pulsador2;
    char pulsador3;
    char pulsador1_antes;
    char pulsador2_antes;
    char pulsador3_antes;

    set_tris_a(0b11111111);
    set_tris_b(0b00000000);
    
    while (true) {
        /* leemos los pulsadores */
        pulsador1 = input(pin_a0);
        pulsador2 = input(pin_a1);
        pulsador3 = input(pin_a2);

        /* ver los cambios */
        if (pulsador1_antes != pulsador1) {      // si son distintos, hubo un cambio
            pulsador1_antes  = pulsador1;        // guardamos el nuevo valor

            output_bit(pin_b0, pulsador1);
            output_bit(pin_b2, pulsador1);
        }

        if (pulsador2_antes != pulsador2) {      // si son distintos, hubo un cambio
            pulsador2_antes  = pulsador2;        // guardamos el nuevo valor

            output_bit(pin_b1, pulsador2);
            output_bit(pin_b3, pulsador2);
        }

        if (pulsador3_antes != pulsador3) {     // si son distintos, hubo un cambio
            pulsador3_antes  = pulsador3;        // guardamos el nuevo valor

            output_bit(pin_b0, pulsador3);
            output_bit(pin_b3, pulsador3);
        }
    }
}
 
Última edición por un moderador:
al final lo pudiste hacer andar? lo que tenes que hacer es agregar un else en cada if que realice la acción contraria a la que hace en caso de ser verdadero. exactamente como lo hizo joaquinferrero, si no te funciona debe ser algún problema de conexión. estas usando pull up?
 
les pido mis disculpas, tuve varios problemas y no pude contestar.. les comento los que me sucedió con el programa, resulta que al armarlo en el protoboard y con la prueba de los leds funciona, pero al conectar los motores se cuelga el programa y encienden todos los leds.. voy a tratar de explicarles la situacion sin ser hacerlo muy extenso,tengo la placa que le manda a los motores los 12v y -12v y a esa placa se le conectan los pines de salida del pic, es decir los que estaba en el protoboard con los leds..
Espero que me sepan entender el tema que no conteste, o que piensen que soy un desagradecido.. pero en verdad se me complicó
 
Suponiendo que sea un puente H (por lo de 12 y -12 v), ¿Lleva una resistencia entre el pin del pic y los transistores? ¿La corriente de la fuente es suficiente para suministrar todo lo necesario? Ésto último es importante porque si los motores consumen más de lo que la fuente suministra, habrá una caída de tensión y normalmente el pic se reinicia.
 
si exacto, es el puente h integrado.. y si desde el pic está conectado con una recistencia hacia la placa.. lo que tendria que hacer el pic es entregarme 5v que es llevado hasta la placa del puente h y estos 5v van hacia el integrado, para que este me de los 12v y los -12v.. para mi es un problema en el programa.. tambien se probo con un diodo a la salida del pic por si la placa me daba tension de regreso.. pero tampoco es eso, el programa cuelga..
 
Atrás
Arriba