Ok. Muchas gracias Luis.
Lo probaré a ver qué tal. Usas el puerto A del PIC. Supongo que con cambiar al puerto C lo tendre listo. Ya te contaré qué tal me ha ido.
Un saludo y gracias,
Alberto
----- Original Message -----From: luis luisSent: Wednesday, July 07, 2004 12:33 PMSubject: Re: [microbotica] Control de servos con PICEs mejor usar asm en la rutina para tener menor codigo y mayor control del tiempoLas he usado en Pic 16F84//****************************************************************************// las dos rutinas mueven el servo a la posicion con movimiento en// sentido de las agujas del reloj de 0 a 180//*****************************************************************************// **************************************
// Rutina que mueve el servo lentamente *
// el valor grados es la posicion a la *
// que ira el servo entre 0 y 180 *
//***************************************
void mueve_servo_lento(grados)
{ int cero,veces,servo,Pdel0,Pdel1;
veces=25;
#asm
// retarda 20 mseg entre pulso y pulso de control al servoBucle10: movlw 40 ; 1 set number of repetitions (B)40
movwf PDel0 ; 1 |
PLoop21: movlw 141 ; 1 set number of repetitions (A)141
movwf PDel1 ; 1 |
PLoop22: clrwdt ; 1 clear watchdog
decfsz PDel1, 1 ; 1 + (1) is the time over? (A)
goto PLoop22 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) is the time over? (B)
goto PLoop21 ; 2 no, loop
PDelL21: goto PDelL22 ; 2 cycles delay
PDelL22: nop ; 1 cycle delaybsf PORTA,0 ; Pone a 1 la salida
movlw 220 ; pulso minimo de sincronismo del servo, depende del servo que sea
movwf cero
Bucle11: nop
decfsz cero,1
goto Bucle11
movf grados,0 ; carga grados en w
movwf servo ; carga w en grados_servo
incf servo,1 ; suma 1 al valor de grados por problemas de assembler
Bucle12: nop
nop
nop
nop
nop
nop
nop
decfsz servo,1 ; si grados_servo ha llegado a cero se salta la siguiente instruccion
goto Bucle12
bcf PORTA,0 ;pone a 0 la salida
decfsz veces,1 ; si veces ha llegado a cero se salta la siguiente instruccion
goto Bucle10#endasmreturn;
}
//***********************************
// Rutina que mueve el servo rapido *
//***********************************void posicionar_servo(grados)
{ int cero,veces,servo,Pdel0,Pdel1;
veces=10;
#asm
// retarda 20 mseg entre pulso y pulso de control al servoBucle10: movlw 40 ; 1 set number of repetitions (B)40
movwf PDel0 ; 1 |
PLoop21: movlw 141 ; 1 set number of repetitions (A)141
movwf PDel1 ; 1 |
PLoop22: clrwdt ; 1 clear watchdog
decfsz PDel1, 1 ; 1 + (1) is the time over? (A)
goto PLoop22 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) is the time over? (B)
goto PLoop21 ; 2 no, loop
PDelL21: goto PDelL22 ; 2 cycles delay
PDelL22: nop ; 1 cycle delay
bsf PORTA,0 ; Pone a 1 la salida
movlw 220 ; pulso minimo de sincronismo del servo, depende del servo que sea
movwf cero
Bucle11: nop
decfsz cero,1
goto Bucle11
movf grados,0 ; carga grados en w
movwf servo ; carga w en grados_servo
incf servo,1 ; suma 1 al valor de grados por problemas de assembler
Bucle12: nop
nop
nop
nop
nop
nop
nop
decfsz servo,1 ; si grados_servo ha llegado a cero se salta la siguiente instruccion
goto Bucle12
bcf PORTA,0 ;pone a 0 la salida
decfsz veces,1 ; si veces ha llegado a cero se salta la siguiente instruccion
goto Bucle10#endasmreturn;
}
Alberto Caballero <kavan@...> wrote:Gracias Luis. Pues te agradecería que me enviases la rutina que dices. ¿Qué problemas hay al utilizar C? ¿Genera demasiado código? ¿Hay otros problemas?Saludos,Alberto----- Original Message -----From: luis luisSent: Wednesday, July 07, 2004 12:26 PMSubject: Re: [microbotica] Control de servos con PICYo he trabajado con los servos en C y con asm, lo mejor es usar una rutina asm en el programa C. Si quieres te paso la rutina que yo uso y veras como funciona perfectamente. La he usado con servos Hitec en un robot y con un control programable para una valvula de escape de un motor de 2 tiempos de una moto de competicion.En los dos casos funciono siempre bien.Pideme la rutina y no tendre problemas en enviartela
Alberto Caballero <kavan@...> wrote:Buenas. Estoy intentando controlar un servo con la salida PWM de un PIC (16f876A), pero no me salen las cuentas para configurar el timer2. Estoy utilizando C con el compilador CCS, y según la ayuda de los métodos setup_timer_2, set_pwx1_duty, el programa de ejemplo ex_pwm.c y demás, no puedo obtener un ciclo de 20 ms con el timer2 para poder generar la señal de reloj correspondiente.¿Alguien que se haya peleado con ésto me podría echar una mano para ver cómo hay que configurar el timer2?Muchas graciasAlberto
