Muchas gracias por vuestra ayuda.El siguiente código hace que se mueva el servo a un lado y otro según la pulsación de un botón.Se puede aumentar o disminuir el recorrido pulsando otro botón. Una pulsación aumenta ,otra disminuye ,otra aumenta ,etc.
El valor del recorrido se graba en la eeprom, así como la situación en la que quedó el servo a derecha o izquierda.Se puede depurar un poco más.Voy a intentar que con otro botón se pueda aumentar o disminuir la velocidad de movimiento del servo.Seguramente no pueda ya que estoy algo justo de memoria.
'Trabajando con servos, PIC12F629
Define CONF_WORD = 0x3184
Define CLOCK_FREQUENCY = 4
Define SIMULATION_WAITMS_VALUE = 1
AllDigital
Symbol verde = GPIO.0
Symbol rojo = GPIO.1
Symbol boton = GPIO.2
Symbol mas = GPIO.3
Symbol menos = GPIO.4
Symbol servo = GPIO.5
TRISIO = %011100
'#########################################################################
'define variables
Dim n As Byte
Dim a As Byte
'Dim flag As Byte
Dim flag1 As Byte
'Dim p1 As Byte
'Dim p2 As Byte
Dim posicion As Byte '1 centro 2-dch 3-izq posicion servo
Dim pulso_dch As Byte 'angulo dch servo
Dim pulso_izq As Byte 'angulo izq servo
Dim outon As Byte 'Tiempo de la señal de control del servo a On (duty cycle)
Dim outoff As Word
Dim periodo As Word
'Dim off1 As Word
'Dim off2 As Word
'##########################################################################
a = 1
Gosub leer
rojo = 0
verde = 0
servo = 0
periodo = 2000
If posicion = 01 Or posicion = 0xff Then 'mueve el servo al centro e inicializa variables
Write 01, 01
Write 03, 155
Write 04, 155
Write 05, 01 'flag1
rojo = 1
verde = 1
Call servo_inicio(155)
Endif
If posicion = 02 Then
Write 05, 01
rojo = 1
verde = 0
Call servo_inicio(pulso_dch)
Endif
If posicion = 03 Then
rojo = 0
verde = 1
Call servo_inicio(pulso_izq)
Endif
'######################################################
'inicio programa
main:
OPTION.INTEDG = 1
INTCON.INTE = 1
INTCON.GIE = 1
Enable
'#####################################################
'si se pulsa el boton aumentar ángulo
If mas = 1 Then
WaitUs 50
While mas = 1
Gosub leer
If flag1 = 1 Then
If posicion = 01 Or posicion = 02 Then Call aumentar(pulso_dch)
If posicion = 03 Then Call disminuir(pulso_izq)
Endif
If flag1 = 2 Then
If posicion = 01 Or posicion = 02 Then Call disminuir(pulso_dch)
If posicion = 03 Then Call aumentar(pulso_izq)
Endif
Wend
flag1 = flag1 + 1
If flag1 > 2 Then
flag1 = 1
Endif
Write 05, flag1
Endif
Goto main
End
'###################################################
'mueve el servo
On Interrupt
Read 01, posicion
Read 03, pulso_dch
Read 04, pulso_izq
Select Case posicion
Case 01
outoff = (2000 - 155) * 10
For n = 1 To 75
ServoOut servo, 155
WaitUs outoff
Next n
rojo = 0
verde = 1
posicion = 02
Write 01, posicion
Case 02
'el servo està en dch y tiene que pasar a izq
For outon = pulso_dch To pulso_izq Step -1 'De un punto a otro
outoff = (2000 - outon) * 10 'Calculo tiempo de la senal a Off en uSeg.
For n = 0 To 12 'Control velocidad
ServoOut servo, outon 'Senal a on
WaitUs outoff 'Tiempo de la senal a Off
Next n
Next outon
rojo = 1
verde = 0
posicion = 03
Write 01, posicion
Case 03
For outon = pulso_izq To pulso_dch 'De un punto a otro
outoff = (2000 - outon) * 10 'Calculo tiempo de la senal a Off en uSeg.
For n = 0 To 12 'Control velocidad
ServoOut servo, outon 'Senal a on
WaitUs outoff 'Tiempo de la senal a Off
Next n
Next outon
rojo = 0
verde = 1
Write 01, 02
EndSelect
INTCON.INTF = 0
Resume
leer:
Read 01, posicion
Read 03, pulso_dch
Read 04, pulso_izq
Read 05, flag1
Return
Proc servo_inicio(x As Byte)
Dim outoff1 As Word
outoff1 = (2000 - x) * 10 'Calculo tiempo de la señal a Off en uSeg.
For n = 1 To 5 'poner 75 Se repite durante 1500mSeg. para dar tiempo al servo a posicionarse
ServoOut servo, x '1.6mSeg. (señal a On)
WaitUs outoff1 'Tiempo de la señal a Off
Next n
End Proc
Proc aumentar(y As Byte) 'y toma valor pulso_dch o pulso_izq
Dim p1 As Byte
Dim off1 As Word
p1 = y + 1
If p1 = 215 Then
p1 = 155
y = 155
Endif
For n = y To p1
off1 = (2000 - n) * 10
ServoOut servo, n
WaitUs off1
Next n
y = p1
If posicion = 01 Or posicion = 02 Then
Write 03, y 'graba nuevo valor de pulso_dch
Endif
If posicion = 03 Then
Write 04, y 'graba nuevo valor de pulso_izq
Endif
End Proc
Proc disminuir(y1 As Byte)
Dim p2 As Byte
Dim off2 As Word
p2 = y1 - 1
If p2 < 155 Then
y1 = 155
p2 = 155
Endif
For n = y1 To p2 Step -1
off2 = (2000 - n) * 10
ServoOut servo, n
WaitUs off2
Next n
y1 = p2
If posicion = 01 Or posicion = 02 Then Write 03, y1 'graba nuevo valor de pulso_dch
If posicion = 03 Then Write 04, y1 'graba nuevo valor de pulso_izq
End Proc
Está en pic simulador y para el movimiento del servo he utilizado una rutina que en su día dogflu66 hizo en respuesta a otra duda.La electrónica todavía no la tengo terminada.
Un saludo