Autor Tema: Falla en en código que activa pulsador para cambio de giro de motor dc  (Leído 1668 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Kurt Cobain

  • PIC10
  • *
  • Mensajes: 29
Hola a todos, tengo un problema con mi código de control de motor dc con el pic16f84a y l293d, explico: el motor esta controlado por arranque (ra0), paro (ra3 y sentido de giro (ra1 y ra2). La secuencia es la siguiente;

Presiono ra0 y arranca (no tiene que arrancar con ningún otro), luego presiono ra1 y cambia de sentido de giro y después presiono ra2 y cambia de sentido de giro !pero! si vuelvo a presionar ra1 ya no cambia de sentido de giro hasta que vuelva a precionar ra0, ese es el único problema. Espero alguien tenga la solución pues ya he tratado de modificar el código y no obtengo el resultado esperado, es muy enrredoso todo esto  :(  Aquí les dejo el código y la simulación...

#include <16F84A.h>
#FUSES NOWDT,XT,NOPROTECT                                 
#use delay(clock=4000000)
int x=0;

void main()
{

   set_tris_A(0b11111);
   set_tris_B(0b00000000);
   output_B(0b00000000);
   

while(true)             
{

input_A();
 if ((input(pin_A0)==1) ){
    x=1;
 }
 if ((input(pin_A1)==1) & (x==1)  ){
    x=2;
 }
 if ((input(pin_A2)==1) & (x==2)  ){
    x=3;
 }
 if ((input(pin_A3)==1) ){
    x=4;
 }
if(x==1){
       output_high(PIN_B2);
        output_low(PIN_B3);     
}
if(x==2){
          output_high(PIN_B3);
          output_low(PIN_B2) ;     
         
}
if(x==3){
          output_high(PIN_B2);
          output_low(PIN_B3);     
}

if(x==4){
          output_low(PIN_B2); 
          output_low(PIN_B3);       
        x=0;
}
}
}

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Falla en en código que activa pulsador para cambio de giro de motor dc
« Respuesta #1 en: 06 de Febrero de 2013, 02:44:11 »

Te falta un OR en el segudo IF:

Cambia esto:
Código: [Seleccionar]
if ((input(pin_A1)==1) & (x==1)  ){
    x=2;
 }

Por esto:
Código: [Seleccionar]
if ((input(pin_A1)==1) & (x==1 || x==3)  ){
    x=2;
 }


PD: el operador OR en C32 son dos barras horizontales ||, no se cual será en el compilador que estás usando, de hecho el AND lógico en C32 es && y no &, el & en C32 es un operador Bitwise. En cualquier caso te falta un OR.

PD2: Convendría tambien que depurases un poco ese código, tantos IF son innecesarios, mete ELSE para evitar comprobaciones innecesarias, o mejor cambia todo ese churro de IF, por un SWITCH CASE.








Desconectado camhost1

  • PIC12
  • **
  • Mensajes: 51
Re: Falla en en código que activa pulsador para cambio de giro de motor dc
« Respuesta #2 en: 06 de Febrero de 2013, 15:53:14 »
Hola, al parecer programas con ccs compiler, pues yo te sugiero que que utilices una interrupción por el puerto B, la que detecta el cambio de estado entre los pines B4-B7 (#int_RB), así guardas ese valor en una variable, y como te recomiendan en el comentario anterior utilizas un switch para detectar que salidas necesitas habilitar. Saludos...

Desconectado korpaztk

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 202
Re: Falla en en código que activa pulsador para cambio de giro de motor dc
« Respuesta #3 en: 21 de Febrero de 2013, 23:27:56 »
coincido con camhost1 si no utilizas otros pines del pic, me iría a los pines del puerto b y utilizaría las interrupciones ahí estarías mas seguro con tu código.-

Saludos.-
Korpaz.
Técnico Electronico.

El Papel Es Mi Mejor Psicologo

Desconectado Kurt Cobain

  • PIC10
  • *
  • Mensajes: 29
Re: Falla en en código que activa pulsador para cambio de giro de motor dc
« Respuesta #4 en: 07 de Marzo de 2013, 03:46:24 »

Te falta un OR en el segudo IF:

Cambia esto:
Código: [Seleccionar]
if ((input(pin_A1)==1) & (x==1)  ){
    x=2;
 }

Por esto:
Código: [Seleccionar]


 if ((input(pin_A1)==1) & (x==1 || x==3)  ){
    x=2;
 }


PD: el operador OR en C32 son dos barras horizontales ||, no se cual será en el compilador que estás usando, de hecho el AND lógico en C32 es && y no &, el & en C32 es un operador Bitwise. En cualquier caso te falta un OR.

PD2: Convendría tambien que depurases un poco ese código, tantos IF son innecesarios, mete ELSE para evitar comprobaciones innecesarias, o mejor cambia todo ese churro de IF, por un SWITCH CASE.











Muchas gracias ahora el código funciona bien  ((:-))