Aquí dejo otra versión:
'******************************* WWW.PICKEY.ES ****************************
'**************************************************************************
'NOMBRE: MnEBasic Ejemplo Basico Servo 03
'MICRO: PIC12F683
'LENGUAJE: Basic del PSI
'DESCRIPCIÓN: Trabajando con servos
'AUTOR: By COS (dogflu66, www.pickey.es, info@pickey.es)
'FECHA: 05/12
'**************************************************************************
'VERSIÓN 1.3:
'Controlando la velocidad del servomotor Futaba S3003
'Función para control del servomotor con selección del pin y velocidad
'**************************************************************************
'Configuración del módulo ADC
'Comfiguración del Timer1
'Habilitación de un puerto RS232 optoacoplado, por software (simulacion)
'Trabajando con el reloj interno.
'Programación del microcontrolador en placa (ICSP)
'RS232: Los datos los recibirá el programa hyperterminal del Windows
'También se puede utilizar cualquier otra consola de datos serie para el PC
'Configuración del hyperterminal del Pc:
'Bits por segundo: 2400
'Bits de datos: 8
'Paridad: Ninguno
'Bits de parada: 1
'Control de flujo: Ninguno
'Fin configuración hyperterminal de Windows
'**************************************************************************
Define CONF_WORD = 0x31c4 '/* _CPD_OFF, _CP_OFF, _BODEN_ON, _MCLRE_OFF,
'_wdt_off, _intrc_osc_noclkout */
Define CLOCK_FREQUENCY = 4 'Frecuencia cristal oscilador del micro en Mhz.
'Define SEROUT_DELAYUS = 1 'Solo para simulación
'************* Configuracion modulos generales (E/S) **********************
'cmcon = 0x07 'Comparator off
VRCON = 0x00 'Vref off, comparador
ANSEL = %00011000 'Fosc/8 (4Mhz=2uSeg.), AN3 mode analogico, resto digitales
ADCON0 = %00001101 'Adc a 8bit, vdd reference, CH3, adc On
'osccal = 0x50 'Calibracion del oscilador interno (cada chip es diferente)
TRISIO = 0xff 'Se definen los pin como entradas
'TRISIO.4 = 1 'GP4 pin, AN3 como entrada, lectura de la resistencia ajustable
TRISIO.5 = 0 'GP5 pin, como salida, Tx puerto serie
TRISIO.2 = 0 'GP2 pin, como salida, Control del servomotor
GPIO.2 = 0 'Valor inicial a cero
TRISIO = 0
'********************* Configuracion del Timer1 ***************************
T1CON.TMR1ON = 1 'Bit de habilitacion del temporizador timer1
T1CON.TMR1CS = 0 'Bit de seleccion de reloj para el timer1, interno Fosc/4
T1CON.T1CKPS0 = 0 'Bit de seleccion del prescaler para el reloj del timer1
T1CON.T1CKPS1 = 0 'Bit de seleccion del prescaler para el reloj del timer1
TMR1H = 0xfc 'Carga el byte alto del registro del tiemr1 (1mSeg)
TMR1L = 0x18 'Carga el byte bajo del registro del timer1 (1mSeg)
PIE1.TMR1IE = 1 'Activa la interrupcion del timer1 por rebose
'********************* Habilitacion Interrupciones ************************
'INTCON.PEIE = 1 'habilitacion de interrupciones de perifericos
'Enable 'intcon.GIE = 1, habilita las interrupciones generales
'************* Rutina del programa ****************************************
'----Asignaciones de nombres
Symbol rs232tx = GP5 'Salida de datos puerto serie tipo RS232
Symbol c_servo = GP2 'Control del servo
'--- Variables
Dim n As Word 'Se declara entero de 2Bytes
n = 400 'Inicializa n con valor 400
'--- Rutina programa
'Posición inicial del servo
For n = 0 To 100
Call servo(2, 2200, 100) 'Full speed
Next n
main:
'Movimiento a una velocidad dada
ServoOut GPIO.3, 200 'Se mantiene la posición del servo que no se usa
Call servo(2, 400, 1) 'Servo a controlar la velocidad
Goto main 'Retorna a principal, bucle infinito
End
'Función para control de velocidad de servomotor (Futaba S3003)
'x = Posición del servo
'pin = pin de la señal de control del servo
'vlc = velocidad servo
'Máximo izquierda 2200uSeg., máximo derecha 400uSeg., periodo 15000+x
Proc servo(pin As Byte, x As Word, vlc As Byte)
Const lde = 400 'Limite derecha
Const liz = 2200 'Limite izquierda
Const llow = 15000 'Señal low
Dim pst As Word 'Posición actual del servo
If pst < x Then pst = pst + vlc
If pst > x And pst > vlc Then pst = pst - vlc
If pst > x And pst < vlc Then pst = lde
If pst > liz Then pst = liz
If pst < lde Then pst = lde
If pin = 0 Then GPIO.0 = 1 '/* Pin de control a On
If pin = 1 Then GPIO.1 = 1
If pin = 2 Then GPIO.2 = 1
If pin = 4 Then GPIO.4 = 1
If pin = 5 Then GPIO.5 = 1 '*/
WaitUs pst 'Señal de control a On
If pin = 0 Then GPIO.0 = 0 '/* Pin de control a Off
If pin = 1 Then GPIO.1 = 0
If pin = 2 Then GPIO.2 = 0
If pin = 4 Then GPIO.4 = 0
If pin = 5 Then GPIO.5 = 0 '*/
WaitUs llow
End Proc