Hola Amigos:
Estoy intentando desarrollar un programa con el pic 16f628a para manejar un servo FUTABA FP-S148, pero no he logrado hacerlo funcionar correctamente. Baje un programa de internet para un 16f877 y lo he estado modificando para el 16f628 pero lo maximo qie he conseguido es un movimiento erratico del servo; la idea es que a travez de 3 pulsadores se pueda seleccionar el angulo de posicion del servo es decir 0º, 90º o 180º, el manejo de los pulsadores y el servo lo estoy haciendo por el PORTA del pic (0, 1, 2 y 3) y las rutinas de tiempo con el TMR1, adjunto el programa y agradezco en lo que me puedan colaborar. Gracias.
;Prueba de Servo Motor TowerPro SG-5010
;usando PWM T1=0.9ms, T2=1.5ms, T3=2.1ms, T=20ms f=50Hz
;El servomotor gira a la posición 0 = 0° luego gira a
;la posición 1 = 90°, luego gira a la posición 2 =
;180° por último regresa a la posición 1, esto se repite
;continuamente. El programa se inicia al presionar el pulsador
;ubicado en el pin RC5.
LIST P=16F628A
INCLUDE<P16F628A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _LVP_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF
RADIX hex
#DEFINE Bank0 bcf STATUS,RP0 ; Fija banco 0 de la memoria
#DEFINE Bank1 bsf STATUS,RP0 ; Fija banco 1 de la memoria
CUENTA EQU 20H ;Variable CUENTA
goto main
ORG 0004H
main
;******************************************************************
;************************* CONFIGURACION ************************
;******************************************************************
;Habilito y configuro TMR1
;TMR1 se encargará de generar los pulsos
Bank1
movlw B'00001110' ;RA0:Salida y RA1, RA2, RA3: Entrada
movwf PORTA ;RA0:PWM y RA1:Pulsador
Bank0
movlw .7 ; deshabilita comparadores. Esto es
movwf CMCON ; algo importante en el PIC 16F628A
movlw B'11010001' ;T1CKPS1=0,T1CKPS0=1; Pre:x2/TMR1 Temp
movwf T1CON
clrf PORTA ;Limpio Puerto A
clrf CUENTA ;Reinicio Contador
;******************************************************************
;Espera que se presione y suelte el pulsador ubicado en RC5
btfss PORTA,1
call Posicion_0
btfss PORTA,2
call Posicion_1
btfss PORTA,3
call Posicion_2
goto $-6
;Movemos el servomotor haciendo uso de rutinas
;REPITE
; call Posicion_0 ;Mueve el servomotor a la posicion 0°
; call Posicion_1 ;Mueve el servomotor a la posicion 90°
; call Posicion_2 ;Mueve el servomotor a la posicion 180°
; call Posicion_1 ;Mueve el servomotor a la posicion 90°
; goto REPITE
;******************************************************************
;*************************** RUTINAS ****************************
;******************************************************************
;Mueve el Servomotor a su posición inicial, Angulo = 0°
Posicion_0
movlw .50
movwf CUENTA ;CUENTA = 50
señal_1
bsf PORTA,0 ;Señal en alto
call ret_0_9ms ;durante 0.9ms
bcf PORTA,0 ;Señal en bajo
call ret_19_1ms ;durante 19.1ms para completar los 20ms
decfsz CUENTA ;CUENTA = CUENTA - 1, CUENTA=0?
goto señal_1 ;no --> repetimos la señal
clrf CUENTA ;si --> reiniciamos CUENTA y regresamos
return
;Mueve el Servomotor a su segunda posición, Angulo = 90°
Posicion_1
movlw .50
movwf CUENTA ;CUENTA = 50
señal_2
bsf PORTA,0 ;Señal en alto
call ret_1_5ms ;durante 1.5ms
bcf PORTA,0 ;Señal en bajo
call ret_18_5ms ;durante 18.5ms para completar los 20ms
decfsz CUENTA ;CUENTA = CUENTA - 1, CUENTA=0?
goto señal_2 ;no --> repetimos la señal
clrf CUENTA ;si --> reiniciamos CUENTA y regresamos
return
;Mueve el Servomotor a su tercera posición, Angulo = 180°
Posicion_2
movlw .50
movwf CUENTA ;CUENTA = 50
señal_3
bsf PORTA,0 ;Señal en alto
call ret_2_1ms ;durante 2.1ms
bcf PORTA,0 ;Señal en bajo
call ret_17_9ms ;durante 17.9ms para completar los 20ms
decfsz CUENTA ;CUENTA = CUENTA - 1, CUENTA=0?
goto señal_3 ;no --> repetimos la señal
clrf CUENTA ;si --> reiniciamos CUENTA y regresamos
return
;******************************************************************
;************************** RETARDOS ****************************
;******************************************************************
;Retardo de 0.9ms
ret_0_9ms
movlw 0x36
movwf TMR1L
movlw 0xF7
movwf TMR1H
btfss PIR1,TMR1IF
goto $-1
bcf PIR1,TMR1IF
return
;Retardo de 1.5ms
ret_1_5ms
movlw 0x5A
movwf TMR1L
movlw 0xF1
movwf TMR1H
btfss PIR1,TMR1IF
goto $-1
bcf PIR1,TMR1IF
return
;Retardo de 2.1ms
ret_2_1ms
movlw 0x7E
movwf TMR1L
movlw 0xEB
movwf TMR1H
btfss PIR1,TMR1IF
goto $-1
bcf PIR1,TMR1IF
return
;Retardo de 19.1ms
ret_19_1ms
movlw 0x7A
movwf TMR1L
movlw 0x45
movwf TMR1H
btfss PIR1,TMR1IF
goto $-1
bcf PIR1,TMR1IF
return
;Retardo de 18.5ms
ret_18_5ms
movlw 0x56
movwf TMR1L
movlw 0x4B
movwf TMR1H
btfss PIR1,TMR1IF
goto $-1
bcf PIR1,TMR1IF
return
;Retardo de 17.9ms
ret_17_9ms
movlw 0x32
movwf TMR1L
movlw 0x51
movwf TMR1H
btfss PIR1,TMR1IF
goto $-1
bcf PIR1,TMR1IF
return
END