TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Kurt Cobain en 06 de Febrero de 2013, 01:29:39
-
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;
}
}
}
-
Te falta un OR en el segudo IF:
Cambia esto: if ((input(pin_A1)==1) & (x==1) ){
x=2;
}
Por esto:
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.
-
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...
-
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.-
-
Te falta un OR en el segudo IF:
Cambia esto: if ((input(pin_A1)==1) & (x==1) ){
x=2;
}
Por esto:
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 ((:-))