TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Kurt Cobain en 29 de Enero de 2013, 16:11:32
-
Hola a todos, tengo un proyecto el cual con el pic16f84a se tiene que controlar las grados de un servomotor (sg90) a Rb0. Explico: con 2 pulsadores conectados a ra0 y ra1 se tiene que manipular los grados (ya sea un pulsador para mas grados y el otro para menos).
Hice este código que tiene una parte de lo que necesito por que solo tengo un pulsador a ra0, pero no funciona, (no soy muy bueno en esto :( )
# include <16F84A.h>
# use delay(clock=4000000)
# fuses XT,NOWDT
# byte puerto_b=06
# byte puerto_a=05
int contador=0,estado=1;
void main() {
set_tris_b(0x00);
set_tris_a(0x1F);
puerto_b=0;
if (input(pin_a0)) estado=0; //Si se pulsa.
if (estado==0 && (input(pin_a0))) { //Si se pulsa y se libera.
contador++;
if (contador>4) contador=1;
estado=1;
}
switch (contador){
case 1:{output_high(PIN_B0);
delay_us(1499); //1.500us (neutral)
output_low(PIN_B0);
delay_us(8500);
break;}
case 2:{output_high(PIN_B0);
delay_us (1949); //1.950us (-45 grados)
output_low(PIN_B0);
delay_us(18050);
break;}
case 3:{output_high(PIN_B0);
Delay_us(1049); //1.050us (+45 grados)
output_low(PIN_B0);
Delay_us(18950);
break;}
case 4:{output_high(PIN_B0);
Delay_us(599); //600us (+90 grados)
output_low(PIN_B0);
Delay_us(19400);
break;}
}
}
Agradeceré cualquier ayuda.
Saludos
-
A simple vista, el ciclo del programa sólo se ejecuta una vez. Tendrías que incorporar un while(TRUE) que encierre todo el código a partir del testeo de la tecla.
-
Yo quitaria las llaves que estas poniendo en los casos,yo utilizo la estructura switch de la siguiente manera los que saben mas me corregiran:
switch(opcion)
{
case x:
aqui lo que quieras que haga en este caso
break;
case x2:
aqui lo que quieras que haga en este caso
break;
default:
aqui lo que quieras que haga en el caso default
break;
}
digo...asi me lo enseñaron a mi,aparte de lo que bien dice angelgris,que solo se ejecuta el programa una sola ves
-
Ya modificado el código, en proteus el servomotor va a +117 y el pulsador no responde.
Aquí les dejo adjuntados los archivos
Saludos.
-
Haber Kurt,prueba este codigo lo modifique un poco,sinceramente tus tiempos de activacion no se como los calculas los deje igual,pero pruebalo y me dices,modifique tambien el archivo de proteus,comentas
-
Haber Kurt,prueba este codigo lo modifique un poco,sinceramente tus tiempos de activacion no se como los calculas los deje igual,pero pruebalo y me dices,modifique tambien el archivo de proteus,comentas
Hola, gracias por modificarlo, resolvió muchas de mis dudas y errores aunque ahora el problema es posicionar a el servomotor en cualquier grado que quiera con 2 pulsadores (para + y - grados) con el código anterior tengo mas idea de como debe ir conformado, espero lograrlo, agradezco mucho tu ayuda.
De antemano muchas gracias y saludos.
-
output_high(PIN_B0);
delay_us (x); //1.950us (-45 grados)
output_low(PIN_B0);
delay_us(y);
Con poner los valores de los retardos mediante una variable tendria que funcionar.
En otra parte del programa tendrias que hacer los cálculos y variar los valores de "x" e "y" en función de los pulsadores.
Lo que tendrías que hacer es sacar el switch.
-
output_high(PIN_B0);
delay_us (x); //1.950us (-45 grados)
output_low(PIN_B0);
delay_us(y);
Con poner los valores de los retardos mediante una variable tendria que funcionar.
En otra parte del programa tendrias que hacer los cálculos y variar los valores de "x" e "y" en función de los pulsadores.
Lo que tendrías que hacer es sacar el switch.
Listo, ahora el programa funciona bien ((:-)) ahora a seguir con el siguiente proyecto que es el control de un motor a pasos.
Saludos.