Estoy intentando hacer un programador para la posición de servos.Con un teclado y un pequeño menú en un lcd mando la posición derecha e izquierda al servo a un 12f629, según el fichero de proteus.El programa que va en el 12f629 es el siguiente
''****************************************************************
'* Name : UNTITLED.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 07/07/2011 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
Define osc = 4
include "modedefs.bas"
CMCON = 7
vrcon=0
'Trabajando con servos, PIC12F629
Define CONF_WORD = 0x3184
Define CLOCK_FREQUENCY = 4
'OPTION_REG = %1011111
'INTCON = %10010000
Symbol rojo = GPIO.1
Symbol boton = GPIO.2
Symbol verde = GPIO.3
Symbol rele = GPIO.4
Symbol servo = GPIO.5
TRISIO = %000101
'#########################################################################
'define variables
velocidad var Byte
c var byte
n var Byte
total var Word
p1 var Byte
p2 var Byte
p3 var Byte
p4 var Byte
posicion var Byte '1 centro 2-dch 3-izq posicion servo
pulso var byte
pulso1 var byte
pulso_dch var Byte 'angulo dch servo
pulso_izq var Byte 'angulo izq servo
outon var Byte 'Tiempo de la señal de control del servo a On (duty cycle)
outon1 var Byte
outoff var Word
outoff1 var Word
periodo var Word
off1 var Word
off2 var Word
off3 var Word
off4 var Word
'##########################################################################
Gosub leer
rojo = 1
verde = 1
servo = 0
periodo = 2000
If posicion = $ff or posicion=0 Then 'el servo se conecta la primera vez
posicion = 01
rojo=1
verde=1
Write 01, posicion
pulso_dch = 155
Write 03, pulso_dch
pulso_izq = 155
Write 04, pulso_izq
velocidad = 1
Write 06, velocidad
servo = 0
rele = 0
Endif
If posicion = 02 Then
pulso=pulso_dch
Call servo_inicio
servo = 0
rojo = 1
verde = 0
rele = 0
Endif
If posicion = 03 Then
pulso=pulso_izq
Call servo_inicio
servo = 0
rojo = 0
verde = 1
rele = 1
Endif
'Enable
'######################################################
'inicio programa
main:
Read 01, posicion
Read 03, pulso_dch
Read 04, pulso_izq
Read 06, velocidad
for c=0 to 6
SerOut gpio.4, T300, [6,6,"OK",3]
next c
Serin GPIO.0, T300, ["OK"],#total
If total > 1000 And total < 2000 Then
velocidad = total - 1000
Write 06, velocidad
Endif
If total > 7000 And total < 8000 Then 'pulso izq
pulso_izq = total - 7000
Write 04, pulso_izq
Endif
If total > 4000 And total < 5000 Then
pulso_dch = total - 4000
Write 03, pulso_dch
Endif
for c=1 to 8
SerOut gpio.4, T1200, [6,6,"OK",#total]
pause 200
next c
If boton = 1 Then Gosub mover_servo
Goto main
End
'###################################################
'mueve el servo
mover_servo:
'On Interrupt
Gosub leer
'Select Case posicion
'Case 0
If posicion = 01 Then
pulso=155
Call servo_directo
servo = 0
rojo = 0
verde = 0
pause 200
rojo = 0
verde = 1
rele = 0
Write 01, 02
Return
Endif
If posicion = 02 Then
'el servo està en dch y tiene que pasar a izq
pulso=pulso_dch
pulso1=pulso_izq
Call servo_inverso
servo = 0
rojo = 0
verde = 0
pause 200
rojo = 1
verde = 0
rele = 1
Write 01, 03
Return
Endif
If posicion = 03 Then
'Case 03
pulso=pulso_dch
pulso1=pulso_izq
Call servo_directo
'el servo está en izq y tiene que pasar a dch
servo = 0
rojo = 0
verde = 0
pause 200
rojo = 0
verde = 1
rele = 0
Write 01, 02
Return
Endif
'Case Else
'EndSelect
'INTCON.1 = 0
'Resume
Return
leer:
Read 01, posicion
Read 03, pulso_dch
Read 04, pulso_izq
Read 06, velocidad
Return
servo_inicio:
periodo1 con 2000
outoff1 = (periodo1 - pulso) * 10 'Calculo tiempo de la señal a Off en uSeg.
For n = 1 To 75 'Se repite durante 1500mSeg. para dar tiempo al servo a posicionarse
pulsOut servo, pulso '1.6mSeg. (señal a On)
pauseUs outoff1 'Tiempo de la señal a Off
Next n
return
servo_directo:
periodo2 Con 2000
outoff2 var Word
outon_2 var Byte
For outon_2 = pulso_izq To pulso_dch 'De un punto a otro
outoff2 = (periodo2 - outon_2) * 10 'Calculo tiempo de la senal a Off en uSeg.
For n = 0 To velocidad 'Control velocidad
pulsout servo, outon_2 'Senal a on
pauseus outoff2 'Tiempo de la senal a Off
Next n
Next outon_2
return
servo_inverso:
periodo3 con 2000
outoff3 var Word
outon_3 var Byte
For outon_3 = pulso_dch To pulso_izq Step -1 'De un punto a otro
outoff3 = (periodo3 - outon_3) * 10 'Calculo tiempo de la senal a Off en uSeg.
For n = 0 To velocidad 'Control velocidad
pulsout servo, outon_3 'Senal a on
pauseus outoff3 'Tiempo de la senal a Off
Next n
Next outon_3
return
Al inicio del programa digo que se enciendan dos leds, pero no hace nada y no sé a que se debe. ¿encontrais algún fallo? ¿tengo algo mal configurado?
Muchas gracias