Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

05/09/2014 #1


¿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.
05/09/2014 #2

Avatar de JoaquinFerrero

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.

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

      if ( 
input(pin_a2) == ) {
          
output_low(pin_b0);
          
output_low(pin_b3);
      }
      else {
          
output_high(pin_b0);
          
output_high(pin_b3);
      }
   }

05/09/2014 #3


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?
05/09/2014 #4

Avatar de papirrin

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.


EDITO:

entraron juntos los mensajes ... 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 ));
}
05/09/2014 #5

Avatar de JoaquinFerrero

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):

Código 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_b0pulsador1);
            
output_bit(pin_b2pulsador1);
        }

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

            
output_bit(pin_b1pulsador2);
            
output_bit(pin_b3pulsador2);
        }

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

            
output_bit(pin_b0pulsador3);
            
output_bit(pin_b3pulsador3);
        }
    }

05/09/2014 #6


muchas gracias, ahora pruebo lo que me dijeron y les digo
12/09/2014 #7


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?
12/09/2014 #8

Avatar de papirrin

Si, al parecer la ultima respuesta de joaquin Ferrero fue la que le agrado, pero se fue a moderacion.

no esta de mas que hagas tu tus pruebas.
24/09/2014 #9


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ó
25/09/2014 #10

Avatar de jmth

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.
25/09/2014 #11


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..
26/09/2014 #12


quizás puedas probar usando optoacopladores, y alimentando de forma separada el circuito del pic con el de los motores
27/09/2014 #13


lamentablemente no voy a poder probar lo que me dijiste hasta el miercoles.. pero lo tendré en cuenta para ese dia, gracias
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.