Autor Tema: Control servos con pic simulador  (Leído 12516 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Control servos con pic simulador
« Respuesta #15 en: 02 de Enero de 2011, 10:28:54 »
Es un programa demasiado extenso como para que lo pueda verificar sin correrlo sobre el hard. De todas formas en las rutinas tipo “ETIQUETA/RETURN”  no se puede salir de ellas usando “GOTO” hay que salir utilizando “RETURN”, de otra manera saturamos el stack del micro y hace cosas raras, a esto se le llama fallo por “HARDWARE STACK OVERFLOW”. De todas formas los “GOTOS” en los lenguajes de alto nivel no es recomendable su uso. Solo se utiliza una sola vez para mantener el bucle infinito en la rutina principal de programa.

Otro tema es que repetiste nombres en el código y no podía compilar.

De todas formas te recomiendo que primero lo simules en el Pic Simulator IDE, con la opción saltar los Wait en el programa y luego configuras el PSI con Ultímate y deshabilitas el Track del editor, esto acelera mucho la simulación. El PSI suele mostrar fácilmente los fallos de este tipo.

Código: vb.net
  1. 'Trabajando con servos, PIC12F629
  2. Define CONF_WORD = 0x3184
  3. Define CLOCK_FREQUENCY = 4
  4. Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo activar esta linea en simulacion
  5. AllDigital
  6. Symbol mass = GPIO.0
  7. Symbol rojo = GPIO.1
  8. Symbol verde = GPIO.2
  9. Symbol menoss = GPIO.3
  10. Symbol boton = GPIO.4
  11. Symbol servos = GPIO.5
  12. TRISIO = %011001
  13. 'define variables
  14. Dim velocidad As Byte
  15. velocidad = 3
  16. Dim n As Byte
  17. Dim posicion As Byte  '1 centro 2-dch 3-izq posicion servo
  18. Dim pulso_dch As Byte  'angulo dch servo
  19. Dim pulso_izq As Byte  'angulo izq servo
  20. Dim pulso_dch1 As Byte
  21. Dim pulso_izq1 As Byte
  22. Dim outon As Byte  'Tiempo de la señal de control del servo a On (duty cycle)
  23. Dim outon1 As Byte
  24. 'Dim outoff As Word
  25. 'Dim periodo As Word
  26. Gosub leer
  27. rojo = 0
  28. verde = 0
  29. servos = 0
  30. '###################################################################################################
  31. 'posiciona los servos como habían quedado
  32. If posicion = 0xff Or posicion = 01 Then  'el servo está en el centro o se conecta la primera vez
  33.         'mueve el servo al centro e inicializa variables
  34.         posicion = 01
  35.         Write 01, posicion
  36.         pulso_dch = 155
  37.         Write 03, pulso_dch
  38.         pulso_izq = 155
  39.         Write 04, pulso_izq
  40.         Call servo_inicio(pulso_dch)
  41.         rojo = 1
  42.         verde = 1
  43. Endif
  44. If posicion = 02 Then
  45.         Call servo_inicio(pulso_dch)
  46.         rojo = 1
  47.         verde = 0
  48. Endif
  49. If posicion = 03 Then
  50.         Call servo_inicio(pulso_izq)
  51.         rojo = 0
  52.         verde = 1
  53. Endif
  54. '####################################################################################################
  55. 'inicio programa
  56. main:
  57.         Gosub leer
  58.         If mass = 1 Then
  59.                 WaitMs 200
  60.                 Gosub mas
  61.         Endif
  62.  
  63.         If menoss = 1 Then
  64.                 WaitMs 200
  65.                 Gosub menos
  66.         Endif
  67.  
  68.         If boton = 1 Then
  69.                 WaitMs 400
  70.                 Gosub mover_servo
  71.         Endif
  72. Goto main
  73. End                                              
  74. '###################################################################################################
  75. mas:
  76.         Gosub leer
  77.         Select Case posicion
  78.                 Case 01
  79.                         pulso_dch1 = pulso_dch + 1
  80.                         If pulso_dch1 > 210 Then
  81.                                 pulso_dch = 155
  82.                                 pulso_dch1 = pulso_dch + 1
  83.                                 WaitMs 1000
  84.                                 verde = 1
  85.                                 rojo = 1
  86.                         Endif
  87.                         Call servo3(pulso_dch, pulso_dch1)
  88.                         pulso_dch = pulso_dch1
  89.                         Write 03, pulso_dch
  90.                 Case 02
  91.                         pulso_dch1 = pulso_dch + 1
  92.                         If pulso_dch1 > 210 Then
  93.                                 pulso_dch = 155
  94.                                 pulso_dch1 = pulso_dch + 1
  95.                                 WaitMs 1000
  96.                                 verde = 1
  97.                                 rojo = 1
  98.                         Endif
  99.                         Call servo3(pulso_dch, pulso_dch1)
  100.                         pulso_dch = pulso_dch1
  101.                         Write 03, pulso_dch
  102.                 Case 03
  103.                         pulso_izq1 = pulso_izq - 1
  104.                         If pulso_izq1 < 100 Then
  105.                                 pulso_izq = 155
  106.                                 pulso_izq1 = pulso_izq - 1
  107.                                 WaitMs 1000
  108.                                 verde = 1
  109.                                 rojo = 1
  110.                         Endif
  111.                         Call servo4(pulso_izq, pulso_izq1)
  112.                         pulso_izq = pulso_izq1
  113.                         Write 04, pulso_izq
  114.         EndSelect
  115. Return                                            
  116. menos:
  117.         Gosub leer
  118.         Select Case posicion
  119.                 Case 01
  120.                         pulso_dch1 = pulso_dch - 1
  121.                         If pulso_dch1 < 155 Then
  122.                                 pulso_dch = 155
  123.                                 pulso_dch1 = pulso_dch + 1
  124.                                 WaitMs 1000
  125.                                 verde = 1
  126.                                 rojo = 1
  127.                         Endif
  128.                         Call servo4(pulso_dch, pulso_dch1)
  129.                         pulso_dch = pulso_dch1
  130.                         Write 03, pulso_dch
  131.                 Case 02
  132.                         pulso_dch1 = pulso_dch - 1
  133.                         If pulso_dch1 < 155 Then
  134.                                 pulso_dch = 155
  135.                                 pulso_dch1 = pulso_dch + 1
  136.                                 WaitMs 1000
  137.                                 verde = 1
  138.                                 rojo = 1
  139.                         Endif
  140.                         Call servo4(pulso_dch, pulso_dch1)
  141.                         pulso_dch = pulso_dch1
  142.                         Write 03, pulso_dch
  143.                 Case 03
  144.                         pulso_izq1 = pulso_izq + 1
  145.                         If pulso_izq1 > 155 Then
  146.                                 pulso_izq = 155
  147.                                 pulso_izq1 = pulso_izq - 1
  148.                                 WaitMs 1000
  149.                                 verde = 1
  150.                                 rojo = 1
  151.                         Endif
  152.                         Call servo3(pulso_izq, pulso_izq1)
  153.                         pulso_izq = pulso_izq1
  154.                         Write 04, pulso_izq
  155.         EndSelect
  156. Return                                            
  157. '####################################################################
  158. 'mueve el servo
  159. mover_servo:
  160.         Gosub leer
  161.         If posicion = 01 Then
  162.         'el servo està en centro y tiene que pasar a dch
  163.                 Call servo(155, pulso_dch, velocidad)
  164.                 servos = 0
  165.                 rojo = 0
  166.                 verde = 0
  167.                 WaitMs 200
  168.                 rojo = 1
  169.                 verde = 0
  170.                 boton = 0
  171.                 posicion = 02
  172.                 Write 01, posicion
  173.                 Goto main  'NO SE PUEDE SALIR DE UN ETIQUETA/RETURN CON GOTO HAY QUE SALIR CON RETURN
  174.         Endif
  175.         If posicion = 02 Then
  176.         'el servo està en dch y tiene que pasar a izq
  177.                 Call servo1(pulso_dch, pulso_izq, velocidad)
  178.                 servos = 0
  179.                 rojo = 0
  180.                 verde = 0
  181.                 WaitMs 200
  182.                 rojo = 0
  183.                 verde = 1
  184.                 boton = 0
  185.                 posicion = 03
  186.                 Write 01, posicion
  187.                 Goto main  'NO SE PUEDE SALIR DE UN ETIQUETA/RETURN CON GOTO HAY QUE SALIR CON RETURN
  188.         Endif
  189.         If posicion = 03 Then
  190.         'el servo está en izq y tiene que pasar a dch
  191.                 Call servo(pulso_izq, pulso_dch, velocidad)
  192.                 servos = 0
  193.                 rojo = 0
  194.                 verde = 0
  195.                 WaitMs 200
  196.                 rojo = 1
  197.                 verde = 0
  198.                 boton = 0
  199.                 Write 01, 02
  200.                 Goto main  'NO SE PUEDE SALIR DE UN ETIQUETA/RETURN CON GOTO HAY QUE SALIR CON RETURN
  201.         Endif
  202. Return                                            
  203. leer:
  204.         Read 01, posicion
  205.         Read 03, pulso_dch
  206.         Read 04, pulso_izq
  207. Return                                            
  208. '################################################################
  209. 'procedimiento para mover servo con control velocidad
  210. Proc servo(x1 As Byte, y1 As Byte, velocidad As Byte)
  211.         Const periodo = 20000  'Periodo en uSeg. para servos de 50Hz
  212.         Dim outoff As Word  'Variable local
  213.         For outon = x1 To y1
  214.                 outoff = (periodo - x1) * 10  'Calculo tiempo de la señal a Off en uSeg.
  215.                 For n = 0 To velocidad  'Se repite durante 1500mSeg. para dar tiempo al servo a posicionarse
  216.                         ServoOut servos, outon  '1.6mSeg. (señal a On)
  217.                         WaitUs outoff  'Tiempo de la señal a Off
  218.                 Next n
  219.         Next outon
  220. End Proc                                          
  221. '#################################################################
  222. 'procedimiento para mover servo con boton mas
  223. Proc servo3(x2 As Byte, y2 As Byte)
  224.         For n = x2 To y2
  225.                 ServoOut servos, n
  226.                 WaitMs 4
  227.         Next n
  228. End Proc                                          
  229. '##################################################################
  230. 'procedimiento para mover servo con boton menos
  231. Proc servo4(x3 As Byte, y3 As Byte)
  232.         For n = x3 To y3 Step -1
  233.                 ServoOut servos, n
  234.                 WaitMs 4
  235.         Next n
  236. End Proc                                          
  237. '################################################################
  238. 'procedimiento para mover servo con control velocidad en sentido negativo
  239. Proc servo1(x4 As Byte, y4 As Byte, velocidad As Byte)
  240.         Const periodo1 = 20000  'Periodo en uSeg. para servos de 50Hz
  241.         Dim outoff1 As Word  'Variable local
  242.         For outon = x4 To y4 Step -1
  243.                 outoff1 = (periodo1 - x4) * 10  'Calculo tiempo de la señal a Off en uSeg.
  244.                 For n = 0 To velocidad  'Se repite durante 1500mSeg. para dar tiempo al servo a posicionarse
  245.                         ServoOut servos, outon  '1.6mSeg. (señal a On)
  246.                         WaitUs outoff1  'Tiempo de la señal a Off
  247.                 Next n
  248.         Next outon
  249. End Proc                                          
  250. Proc servo_inicio(x5 As Byte)
  251.         Const periodo2 = 20000
  252.         Dim outoff2 As Word
  253.         outon = x5
  254.         outoff2 = (periodo2 - outon) * 10  'Calculo tiempo de la señal a Off en uSeg.
  255.         For n = 1 To 75  'Se repite durante 1500mSeg. para dar tiempo al servo a posicionarse
  256.                 ServoOut servos, outon  '1.6mSeg. (señal a On)
  257.                 WaitUs outoff2  'Tiempo de la señal a Off
  258.         Next n
  259. End Proc
« Última modificación: 02 de Enero de 2011, 11:21:16 por dogflu66 »
Saludos desde Granada, España.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Control servos con pic simulador
« Respuesta #16 en: 02 de Enero de 2011, 15:20:12 »
Los goto main es para que el programa vuelva a la rutina principal.No sé por qué no vuelve y el servo se mueve primero para un lado, después para el otro y a continuación se mantiene fijo ,con sólo apretar una vez el boton.En teoría debería moverse para un lado al pulsar,mantenerse ,pulsar , moverse para el otro y mantenerse. En teoría la rutina mover_servo termina con un return y debería pasar a main.Pero parece que vuelve a entrar en ella otra vez

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Control servos con pic simulador
« Respuesta #17 en: 02 de Enero de 2011, 15:52:38 »
Primero corregir el error y luego seguir buscando fallos:

Código: vb.net
  1. 'Trabajando con servos, PIC12F629
  2. Define CONF_WORD = 0x3184
  3. Define CLOCK_FREQUENCY = 4
  4. 'Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo activar esta linea en simulacion
  5. AllDigital
  6. Symbol mass = GPIO.0
  7. Symbol rojo = GPIO.1
  8. Symbol verde = GPIO.2
  9. Symbol menoss = GPIO.3
  10. Symbol boton = GPIO.4
  11. Symbol servos = GPIO.5
  12. TRISIO = %011001
  13. 'define variables
  14. Dim velocidad As Byte
  15. velocidad = 3
  16. Dim n As Byte
  17. Dim posicion As Byte  '1 centro 2-dch 3-izq posicion servo
  18. Dim pulso_dch As Byte  'angulo dch servo
  19. Dim pulso_izq As Byte  'angulo izq servo
  20. Dim pulso_dch1 As Byte
  21. Dim pulso_izq1 As Byte
  22. Dim outon As Byte  'Tiempo de la señal de control del servo a On (duty cycle)
  23. Dim outon1 As Byte
  24. 'Dim outoff As Word
  25. 'Dim periodo As Word
  26. Gosub leer
  27. rojo = 0
  28. verde = 0
  29. servos = 0
  30. '###################################################################################################
  31. 'posiciona los servos como habían quedado
  32. If posicion = 0xff Or posicion = 01 Then  'el servo está en el centro o se conecta la primera vez
  33.         'mueve el servo al centro e inicializa variables
  34.         posicion = 01
  35.         Write 01, posicion
  36.         pulso_dch = 155
  37.         Write 03, pulso_dch
  38.         pulso_izq = 155
  39.         Write 04, pulso_izq
  40.         Call servo_inicio(pulso_dch)
  41.         rojo = 1
  42.         verde = 1
  43. Endif
  44. If posicion = 02 Then
  45.         Call servo_inicio(pulso_dch)
  46.         rojo = 1
  47.         verde = 0
  48. Endif
  49. If posicion = 03 Then
  50.         Call servo_inicio(pulso_izq)
  51.         rojo = 0
  52.         verde = 1
  53. Endif
  54. '####################################################################################################
  55. 'inicio programa
  56. main:
  57.         Gosub leer
  58.         If mass = 1 Then
  59.                 WaitMs 200
  60.                 Gosub mas
  61.         Endif
  62.  
  63.         If menoss = 1 Then
  64.                 WaitMs 200
  65.                 Gosub menos
  66.         Endif
  67.  
  68.         If boton = 1 Then
  69.                 WaitMs 400
  70.                 Gosub mover_servo
  71.         Endif
  72. Goto main
  73. End                                              
  74. '###################################################################################################
  75. mas:
  76.         Gosub leer
  77.         Select Case posicion
  78.                 Case 01
  79.                         pulso_dch1 = pulso_dch + 1
  80.                         If pulso_dch1 > 210 Then
  81.                                 pulso_dch = 155
  82.                                 pulso_dch1 = pulso_dch + 1
  83.                                 WaitMs 1000
  84.                                 verde = 1
  85.                                 rojo = 1
  86.                         Endif
  87.                         Call servo3(pulso_dch, pulso_dch1)
  88.                         pulso_dch = pulso_dch1
  89.                         Write 03, pulso_dch
  90.                 Case 02
  91.                         pulso_dch1 = pulso_dch + 1
  92.                         If pulso_dch1 > 210 Then
  93.                                 pulso_dch = 155
  94.                                 pulso_dch1 = pulso_dch + 1
  95.                                 WaitMs 1000
  96.                                 verde = 1
  97.                                 rojo = 1
  98.                         Endif
  99.                         Call servo3(pulso_dch, pulso_dch1)
  100.                         pulso_dch = pulso_dch1
  101.                         Write 03, pulso_dch
  102.                 Case 03
  103.                         pulso_izq1 = pulso_izq - 1
  104.                         If pulso_izq1 < 100 Then
  105.                                 pulso_izq = 155
  106.                                 pulso_izq1 = pulso_izq - 1
  107.                                 WaitMs 1000
  108.                                 verde = 1
  109.                                 rojo = 1
  110.                         Endif
  111.                         Call servo4(pulso_izq, pulso_izq1)
  112.                         pulso_izq = pulso_izq1
  113.                         Write 04, pulso_izq
  114.         EndSelect
  115. Return                                            
  116. menos:
  117.         Gosub leer
  118.         Select Case posicion
  119.                 Case 01
  120.                         pulso_dch1 = pulso_dch - 1
  121.                         If pulso_dch1 < 155 Then
  122.                                 pulso_dch = 155
  123.                                 pulso_dch1 = pulso_dch + 1
  124.                                 WaitMs 1000
  125.                                 verde = 1
  126.                                 rojo = 1
  127.                         Endif
  128.                         Call servo4(pulso_dch, pulso_dch1)
  129.                         pulso_dch = pulso_dch1
  130.                         Write 03, pulso_dch
  131.                 Case 02
  132.                         pulso_dch1 = pulso_dch - 1
  133.                         If pulso_dch1 < 155 Then
  134.                                 pulso_dch = 155
  135.                                 pulso_dch1 = pulso_dch + 1
  136.                                 WaitMs 1000
  137.                                 verde = 1
  138.                                 rojo = 1
  139.                         Endif
  140.                         Call servo4(pulso_dch, pulso_dch1)
  141.                         pulso_dch = pulso_dch1
  142.                         Write 03, pulso_dch
  143.                 Case 03
  144.                         pulso_izq1 = pulso_izq + 1
  145.                         If pulso_izq1 > 155 Then
  146.                                 pulso_izq = 155
  147.                                 pulso_izq1 = pulso_izq - 1
  148.                                 WaitMs 1000
  149.                                 verde = 1
  150.                                 rojo = 1
  151.                         Endif
  152.                         Call servo3(pulso_izq, pulso_izq1)
  153.                         pulso_izq = pulso_izq1
  154.                         Write 04, pulso_izq
  155.         EndSelect
  156. Return                                            
  157. '####################################################################
  158. 'mueve el servo
  159. mover_servo:
  160.         Gosub leer
  161.         If posicion = 01 Then
  162.         'el servo està en centro y tiene que pasar a dch
  163.                 Call servo(155, pulso_dch, velocidad)
  164.                 servos = 0
  165.                 rojo = 0
  166.                 verde = 0
  167.                 WaitMs 200
  168.                 rojo = 1
  169.                 verde = 0
  170.                 boton = 0
  171.                 posicion = 02
  172.                 Write 01, posicion
  173.                 Return  'goto main  'NO SE PUEDE SALIR DE UN ETIQUETA/RETURN CON GOTO HAY QUE SALIR CON RETURN
  174.         Endif
  175.         If posicion = 02 Then
  176.         'el servo està en dch y tiene que pasar a izq
  177.                 Call servo1(pulso_dch, pulso_izq, velocidad)
  178.                 servos = 0
  179.                 rojo = 0
  180.                 verde = 0
  181.                 WaitMs 200
  182.                 rojo = 0
  183.                 verde = 1
  184.                 boton = 0
  185.                 posicion = 03
  186.                 Write 01, posicion
  187.                 Return  'goto main  'NO SE PUEDE SALIR DE UN ETIQUETA/RETURN CON GOTO HAY QUE SALIR CON RETURN
  188.         Endif
  189.         If posicion = 03 Then
  190.         'el servo está en izq y tiene que pasar a dch
  191.                 Call servo(pulso_izq, pulso_dch, velocidad)
  192.                 servos = 0
  193.                 rojo = 0
  194.                 verde = 0
  195.                 WaitMs 200
  196.                 rojo = 1
  197.                 verde = 0
  198.                 boton = 0
  199.                 Write 01, 02
  200.                 Return  'goto main  'NO SE PUEDE SALIR DE UN ETIQUETA/RETURN CON GOTO HAY QUE SALIR CON RETURN
  201.         Endif
  202. Return                                            
  203. leer:
  204.         Read 01, posicion
  205.         Read 03, pulso_dch
  206.         Read 04, pulso_izq
  207. Return                                            
  208. '################################################################
  209. 'procedimiento para mover servo con control velocidad
  210. Proc servo(x1 As Byte, y1 As Byte, velocidad As Byte)
  211.         Const periodo = 20000  'Periodo en uSeg. para servos de 50Hz
  212.         Dim outoff As Word  'Variable local
  213.         For outon = x1 To y1
  214.                 outoff = (periodo - x1) * 10  'Calculo tiempo de la señal a Off en uSeg.
  215.                 For n = 0 To velocidad  'Se repite durante 1500mSeg. para dar tiempo al servo a posicionarse
  216.                         ServoOut servos, outon  '1.6mSeg. (señal a On)
  217.                         WaitUs outoff  'Tiempo de la señal a Off
  218.                 Next n
  219.         Next outon
  220. End Proc                                          
  221. '#################################################################
  222. 'procedimiento para mover servo con boton mas
  223. Proc servo3(x2 As Byte, y2 As Byte)
  224.         For n = x2 To y2
  225.                 ServoOut servos, n
  226.                 WaitMs 4
  227.         Next n
  228. End Proc                                          
  229. '##################################################################
  230. 'procedimiento para mover servo con boton menos
  231. Proc servo4(x3 As Byte, y3 As Byte)
  232.         For n = x3 To y3 Step -1
  233.                 ServoOut servos, n
  234.                 WaitMs 4
  235.         Next n
  236. End Proc                                          
  237. '################################################################
  238. 'procedimiento para mover servo con control velocidad en sentido negativo
  239. Proc servo1(x4 As Byte, y4 As Byte, velocidad As Byte)
  240.         Const periodo1 = 20000  'Periodo en uSeg. para servos de 50Hz
  241.         Dim outoff1 As Word  'Variable local
  242.         For outon = x4 To y4 Step -1
  243.                 outoff1 = (periodo1 - x4) * 10  'Calculo tiempo de la señal a Off en uSeg.
  244.                 For n = 0 To velocidad  'Se repite durante 1500mSeg. para dar tiempo al servo a posicionarse
  245.                         ServoOut servos, outon  '1.6mSeg. (señal a On)
  246.                         WaitUs outoff1  'Tiempo de la señal a Off
  247.                 Next n
  248.         Next outon
  249. End Proc                                          
  250. Proc servo_inicio(x5 As Byte)
  251.         Const periodo2 = 20000
  252.         Dim outoff2 As Word
  253.         outon = x5
  254.         outoff2 = (periodo2 - outon) * 10  'Calculo tiempo de la señal a Off en uSeg.
  255.         For n = 1 To 75  'Se repite durante 1500mSeg. para dar tiempo al servo a posicionarse
  256.                 ServoOut servos, outon  '1.6mSeg. (señal a On)
  257.                 WaitUs outoff2  'Tiempo de la señal a Off
  258.         Next n
  259. End Proc                                          
  260. 'End
Saludos desde Granada, España.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Control servos con pic simulador
« Respuesta #18 en: 02 de Enero de 2011, 18:48:34 »
He modificado el código corrigiendo errores. No lo he simulado. Lo he pasado a la electrónica y parece que funciona.Si lo quieres simular y observas alguna cosa lo vuelvo a corregir.
Muchas gracias por tu ayuda y paciencia.

Código: [Seleccionar]
'Trabajando con servos, PIC12F629
Define CONF_WORD = 0x3184
Define CLOCK_FREQUENCY = 4
AllDigital
Symbol menos = GPIO.0
Symbol rojo = GPIO.1
Symbol verde = GPIO.2
Symbol mas = GPIO.3
Symbol boton = GPIO.4
Symbol servo = GPIO.5
TRISIO = %011001
'#########################################################################
'define variables
Dim velocidad As Byte
Dim n As Byte
Dim p1 As Byte
Dim p2 As Byte
Dim p3 As Byte
Dim p4 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 pulso_dch1 As Byte
Dim pulso_dch_1 As Byte
Dim pulso_izq1 As Byte
Dim outon As Byte  'Tiempo de la señal de control del servo a On (duty cycle)
Dim outon1 As Byte
Dim outoff As Word
Dim periodo As Word
Dim off1 As Word
Dim off2 As Word
Dim off3 As Word
Dim off4 As Word
'##########################################################################
Gosub leer
rojo = 0
verde = 0
servo = 0
periodo = 2000
If posicion = 0xff Or posicion = 01 Then  'el servo está en el centro o se conecta la primera vez
'mueve el servo al centro e inicializa variables
posicion = 01
Write 01, posicion
pulso_dch = 155
Write 03, pulso_dch
pulso_izq = 155
Write 04, pulso_izq
Call servo_inicio(pulso_dch)
servo = 0
rojo = 1
verde = 1
Endif


If posicion = 02 Then
Call servo_inicio(pulso_dch)
servo = 0
rojo = 1
verde = 0
Endif

If posicion = 03 Then
Call servo_inicio(pulso_izq)
servo = 0
rojo = 0
verde = 1
Endif
'######################################################
'inicio programa
main:
Read 01, posicion
Read 03, pulso_dch
Read 04, pulso_izq
'#####################################################
'si se pulsa el boton aumentar ángulo
If mas = 1 Then
WaitMs 250
Gosub leer

If posicion = 01 Or posicion = 02 Then
p1 = pulso_dch + 1
If p1 > 210 Then
pulso_dch = 155
p1 = pulso_dch + 1
WaitMs 1000
verde = 1
rojo = 1
Endif
For n = pulso_dch To p1
off1 = (2000 - n) * 10
ServoOut servo, n
WaitUs off1
Next n
pulso_dch = p1
Write 03, pulso_dch
Endif

If posicion = 03 Then
p2 = pulso_izq - 1
If p2 < 100 Then
pulso_izq = 155
p2 = pulso_izq - 1
WaitMs 1000
verde = 1
rojo = 1
Endif
For n = pulso_izq To p2 Step -1
off2 = (2000 - n) * 10
ServoOut servo, n
WaitUs off2
Next n
pulso_izq = p2
Write 04, pulso_izq
Endif

Endif
'############################################################
'si se pulsa el boton disminuir ángulo
If menos = 1 Then
WaitMs 250

If posicion = 01 Or posicion = 02 Then
p3 = pulso_dch - 1
If p3 < 155 Then
pulso_dch = 155
p3 = 155
WaitMs 1000
verde = 1
rojo = 1
Endif
For n = pulso_dch To p3 Step -1
off3 = (2000 - n) * 10
ServoOut servo, n
WaitUs off3
Next n
pulso_dch = p3
Write 03, pulso_dch
Endif

If posicion = 3 Then
p4 = pulso_izq + 1
If p4 > 155 Then
pulso_izq = 155
p4 = 155
WaitMs 1000
verde = 1
rojo = 1
Endif
For n = pulso_izq To p4
off4 = (2000 - n) * 10
ServoOut servo, n
WaitUs off3
Next n
pulso_izq = p4
Write 04, pulso_izq
Endif
Endif

'#######################################################
'si se pulsa el boón mover servo
If boton = 1 Then
WaitMs 400
Gosub mover_servo
Endif

Goto main
End                                               

'###################################################
'mueve el servo
mover_servo:
Gosub leer
If posicion = 01 Then
Call servo_directo(155, pulso_dch)
servo = 0
rojo = 0
verde = 0
WaitMs 200
rojo = 1
verde = 0
boton = 0
posicion = 02
Write 01, posicion
Return                                           
Endif

If posicion = 02 Then
'el servo està en dch y tiene que pasar a izq
Call servo_inverso(pulso_dch, pulso_izq)
servo = 0
rojo = 0
verde = 0
WaitMs 200
rojo = 0
verde = 1
boton = 0
posicion = 03
Write 01, posicion
Return                                           
Endif

If posicion = 03 Then
Call servo_directo(pulso_izq, pulso_dch)
'el servo está en izq y tiene que pasar a dch
servo = 0
rojo = 0
verde = 0
WaitMs 200
rojo = 1
verde = 0
boton = 0
Write 01, 02
Return                                           
Endif
Return                                           


leer:
Read 01, posicion
Read 03, pulso_dch
Read 04, pulso_izq
Return                                           


Proc servo_inicio(x As Byte)
Const periodo1 = 2000
Dim outoff1 As Word
outoff1 = (periodo1 - x) * 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
ServoOut servo, x  '1.6mSeg. (señal a On)
WaitUs outoff1  'Tiempo de la señal a Off
Next n
End Proc                                         


Proc servo_directo(x1 As Byte, y1 As Byte)
Const velocidad2 = 3  'Velocidad a la que se mueve el servo
Const periodo2 = 2000
Dim outoff2 As Word
Dim outon_2 As Byte
For outon_2 = x1 To y1  'De un punto a otro
outoff2 = (periodo2 - outon_2) * 10  'Calculo tiempo de la senal a Off en uSeg.
For n = 0 To velocidad2  'Control velocidad
ServoOut servo, outon_2  'Senal a on
WaitUs outoff2  'Tiempo de la senal a Off
Next n
Next outon_2
End Proc                                         


Proc servo_inverso(x2 As Byte, y2 As Byte)
Const velocidad3 = 3  'Velocidad a la que se mueve el servo
Const periodo3 = 2000
Dim outoff3 As Word
Dim outon_3 As Byte
For outon_3 = x2 To y2 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 velocidad3  'Control velocidad
ServoOut servo, outon_3  'Senal a on
WaitUs outoff3  'Tiempo de la senal a Off
Next n
Next outon_3
End Proc                                         




Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Control servos con pic simulador
« Respuesta #19 en: 04 de Enero de 2011, 09:21:25 »
Estoy intentando probar el programa en un 16f628.Es la primera vez que uso un micro de 18 patitas en el programador JDM que tengo. Cuando leo el pic me aparece todo 3FFF. ¿no debería de aparecer en alguna posición el valor de oscal (como sucede con un 12f628)  para usar el oscilador interno?
Pienso que igual tengo mal el programador

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Control servos con pic simulador
« Respuesta #20 en: 04 de Enero de 2011, 09:29:51 »
Es posible que este micro no tenga ese valor, en la mayoría de los PIC no se necesita hacer la corrección porque el oscilador es muy estable, sobre el 2% o menor. Pero en todos se permite hacer la corrección.
Saludos desde Granada, España.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Control servos con pic simulador
« Respuesta #21 en: 04 de Enero de 2011, 10:15:40 »
Vaya ,pues me parece que estoy liado con la configuración  del micro en el pic simulador y en el icprog.
En pic simulador tengo RA5/digital -----Oscilator intrc ¿es correcto?
En ic-prog cuando cargo el fichero me aparece el mensaje de "el fichero no contiene un valor de id para el dispositivo" el mismo que cuando cargo programas para los 12f,por eso pensaba que se necesitaba un valor y que si no se ponía se estropeaba el micro.O sea ¿puedo grabar aunque aparezca este mensaje?
Un saludo

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Control servos con pic simulador
« Respuesta #22 en: 04 de Enero de 2011, 13:00:41 »
Lo del oscilador es correcto y el mensaje que te da el IC-PROG, pues ni idea, porque no lo he utilizado en la vida.
Saludos desde Granada, España.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Control servos con pic simulador
« Respuesta #23 en: 04 de Enero de 2011, 14:35:10 »
Pues en algunos programadores la patita 10 del 16f628 la hay que dejar sin conectar.
Al hacerlo así y arrancar winpic me ha detectado inmediatamente el pic.
De momento el programa no funciona, pero eso es otro tema.
Un saludo

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Control servos con pic simulador
« Respuesta #24 en: 04 de Enero de 2011, 21:04:57 »
Pues te dejo el enlace para que puedas ver como programo mis micros, utilizo la forma clasica con cinco pin: Vdd, Vss, Data, Clock y Vpp.

http://www.pickey.es/programador_pic.html
Saludos desde Granada, España.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Control servos con pic simulador
« Respuesta #25 en: 11 de Enero de 2011, 13:02:19 »
Excelente programador. En cuanto denga tiempo hago la entrenadora.
Ya sé solucioné el problema con el 16f628. La fuente de alimentación daba poca potencia. He probado con otra y funciona perfectamente. Lo único quitar la patita 10 al programar.
un saludo

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Control servos con pic simulador
« Respuesta #26 en: 21 de Febrero de 2011, 18:22:26 »
Intento mejorar el programa.Un par de cuestiones
Para leer la posición de un servo ¿se utiliza servoin?
¿Es posible hacer que un servo gire y cuando la fuerza que tenga que hacer pase de un valor se pare?


 

anything