TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Kurt Cobain en 29 de Enero de 2013, 16:11:32

Título: Codigo C control de servomotor (GRADOS) con PIC16F84A
Publicado 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
Título: Re: Codigo C control de servomotor (GRADOS) con PIC16F84A
Publicado por: AngelGris en 29 de Enero de 2013, 19:17:40
  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.
Título: Re: Codigo C control de servomotor (GRADOS) con PIC16F84A
Publicado por: thegame en 29 de Enero de 2013, 19:25:24
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:

Código: [Seleccionar]
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
Título: Re: Codigo C control de servomotor (GRADOS) con PIC16F84A
Publicado por: Kurt Cobain en 30 de Enero de 2013, 00:28:32
Ya modificado el código, en proteus el servomotor va a +117 y el pulsador no responde.
Aquí les dejo adjuntados los archivos

Saludos.
Título: Re: Codigo C control de servomotor (GRADOS) con PIC16F84A
Publicado por: thegame en 30 de Enero de 2013, 02:42:38
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
Título: Re: Codigo C control de servomotor (GRADOS) con PIC16F84A
Publicado por: Kurt Cobain en 01 de Febrero de 2013, 00:44:02
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.
Título: Re: Codigo C control de servomotor (GRADOS) con PIC16F84A
Publicado por: willynovi en 01 de Febrero de 2013, 09:03:48
Código: [Seleccionar]
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.
Título: Re: Codigo C control de servomotor (GRADOS) con PIC16F84A
Publicado por: Kurt Cobain en 02 de Febrero de 2013, 15:05:46
Código: [Seleccionar]
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.