Autor Tema: problema RF modulos de cebek  (Leído 11442 veces)

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

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: problema RF modulos de cebek
« Respuesta #15 en: 06 de Abril de 2008, 14:08:39 »
Eso es, si no recuerdo mal son dos registros y pico los que tiene y se van vaciando según se leen, y hay que leerlos antes que llegue el tercer Byte o los bloquea y ya no recibe. Para controlar estoy hay un flag que indica el error y después unos registros que hay que leer y escribir para que se desbloquee, estúdialo y si es esto, te buscare la forma de quitar el bloqueo en tiempo de ejecucion, yo trabajo en lenguaje de alto nivel pero mi forma de programar viene del ensamblador por lo que trato los registros muy frecuentemente.
Saludos desde Granada, España.

Desconectado MarcoPina

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 14
Re: problema RF modulos de cebek
« Respuesta #16 en: 07 de Abril de 2008, 13:33:23 »
OK, gracias. Hoy me he dado cuenta que no tenia puesto el condensador ese de 10nF junto la patilla de alimentacion del PIC, lo he puesto pensando en que podia ser algo de eso pero me sigue haciendo lo mismo.

Segun el profesor, cuando lees esos registros se vacian, y eso si lo hago, el valor del RCREG lo paso a W y de W a un registro que me he creado excusivamente para ir metiendo los datos del RCREG, ¿con esto bastaria para vaciar el RCREG? si es asi eso lo llevo haciendo desde el principio, por lo que el problema es otro.

Sigo todavia controlando el servo unicamente, a pesar de lo que mando siempre (ya sea para indicar la orden que ha de hacer el servo como la que debe hacer el motor de CC) un byte, pero con el motor CC se me queda todo bloqueado y no me responde a nada.

La masa del motor de continua y la del servo es comun a la del resto del circuito (incluyendo al modulo C-0504)...¿puede ser que el motor meta ruido al circuito?? porque solo pasa cuando entra en funcionamiento este motor, con el servo no me pasa.

Tambien he llegao a pensar que sea problemas de corrientes, que cuando empieza a funcionar, este deja de suministro al modulo, aunque no lo creo, porque como estoy probando lo conecto todo con una fuente de alimentacion (de estas del taller de clase XD) por lo que no deberia ser un problema...pero nose, empiezo a creer que voy a tener que llamar a un exorcista o algo porque el bot parace poseido vamos.


Muchas gracias dogflu66 por tu tiempo. (ya mismo me estaras mandando a freir esparrados jejeje)

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: problema RF modulos de cebek
« Respuesta #17 en: 07 de Abril de 2008, 17:33:34 »
Para nada de nada.. jeje.

El valor tipico del condensador de desacoplo de la alimetnacion del PIC es de 100nF, me imagino que solo fue una errata... :mrgreen:
Y ese condensador tenemos que colocarlo a cada uno de los circuitos integrados que utilicemos como si la vida nos
dependiera de ello.

Puedes comprobar el estado de ese flag de error de la USART ya que no cuesta nada. Y de todas formas es una buena
costumbre hacerlo.
Saludos desde Granada, España.

Desconectado MarcoPina

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 14
Re: problema RF modulos de cebek
« Respuesta #18 en: 07 de Abril de 2008, 17:52:17 »
cierto, tengo puesto el de 100nf XD.

Mañana probare eso, pero se vacia el registro RCREG cada vez que lo paso a W no?, si es asi siempre lo estoy vaciando, por lo que no deberia quedarse bloqueado....pero tu eres el que entiendo asi que lo probare de todas formas.

GRACIAS

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: problema RF modulos de cebek
« Respuesta #19 en: 08 de Abril de 2008, 06:23:25 »
Cierto se vacia, pero de todas formas suele ser un error muy comun.
Como es facil de comprobar asi descartas.
Saludos desde Granada, España.

Desconectado MarcoPina

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 14
Re: problema RF modulos de cebek
« Respuesta #20 en: 08 de Abril de 2008, 13:03:06 »
Mira estos son los bit del registro RCSTA.

SPEN, a “1” habilita el puerto serie.
RX9, a “1” recepción con 9 bits, a “0” con 8 bits.
SREN, a “1” habilita la recepción sencilla, a “0” la deshabilita.
CREN, en modo asíncrono  “1” habilita el modo de recepción continua,  “0“ lo deshabilita. Y en modo síncrono “1” habilita la recepción continua hasta que el bit CREN es borrado.
ADDEN, a “1” activa la detección de dirección.
FERR, a “1” indica error de trama.
RX9D, noveno bit del dato a recibir.

Y esta es la configuracion que le tengo

   movlw   b'10010000'   ;Valor para configurar USART
   movwf   RCSTA      ;RC7/Rx/DT en recepción continua

Cada vez que entro en una interrupcion, deshabilito y habilito el CREN, para que durante la interrupcion no reciba nada, para evitar problemas. Esto lo averigüe porque al dejar la tecla pulsada se me quedaba bloqueado. Esto puede ser que tenga que ver con lo de que se llena el registro ese de recepcion y se bloquee.

Te pongo esto para que me des tu opinion sobre la configuracion de este registro.
Pero creo que de esto no es porque si no con el cable tampoco deberia ir.


¿Deberia de testear alguno de estos bit?

ADDEN, FERR, RX9D


Creo que lo mejor sera hacerme otra placa emisora incluyendo el pic, por eso del protocolo. Ya que parace que lo que pasa es que se pierden bytes, ya que (y ya se que parezco pesao tanto repetir lo mismo...) con el cable me va.


Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: problema RF modulos de cebek
« Respuesta #21 en: 08 de Abril de 2008, 16:34:32 »
No me acordaba que con el cable te funciona.
Exacto, ya controlas que no se quede bloquedo el modulo USART.

Y lo comentado anteriormete, la mayor parte de la gente que trabaja
por primera vez con este tipo de modulos se queja de la perdida de
datos al principio hasta cogerles el manejo..:mrgreen:
Saludos desde Granada, España.

Desconectado MarcoPina

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 14
Re: problema RF modulos de cebek
« Respuesta #22 en: 08 de Abril de 2008, 20:03:04 »
OK gracias.

Supongo que se te ha pasado pero...no me has contestao a la pregunta de si deberia testear algunos de estos bit: ADDEN, FERR, RX9D. Es solo para eliminar posibles errores de programacion, para ir sobre seguro.

Hoy he probado a intentar hacer andar el bot con los modulos RF a 1200 baudios mediante la conexion que tengo hecha, ( del PC al MAX232 y de este al C-0504) el servo me va (medio que, pero bueno jeje), y el motor de continua algunas veces hace algo y se queda pillao y otras me hace como..."amagos" como si intentara ir.

Creo que no le voy a dar mas vueltas y voy a hacer eso del ponerle el pic en la placa emisora, ¿tu que opinas?.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: problema RF modulos de cebek
« Respuesta #23 en: 09 de Abril de 2008, 18:43:31 »
Hola, yo siempre testeo el RCSTA.OERR. Pero como has dicho que te funciona por cable no hay error de este tipo.
Y como estamos seguros que el modulo usart funciona correctamente, pues si nadie nos da una solucuion, me parece
que te va a tocar realizar una plaquita con pic para hacer de enlace con el PC. :?
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: problema RF modulos de cebek
« Respuesta #24 en: 09 de Abril de 2008, 18:53:52 »
PD. Nunca he utilizado la configuracion a 9Bit.
Saludos desde Granada, España.

Desconectado MarcoPina

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 14
Re: problema RF modulos de cebek
« Respuesta #25 en: 10 de Abril de 2008, 16:31:26 »
OK, muchas gracias.
Cuando tenga la plaquita hecha y la pruebe ya te comentare como ha ido y eso.

GRACIAS.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: problema RF modulos de cebek
« Respuesta #26 en: 11 de Abril de 2008, 19:29:33 »
Aqui te dejo el programa del Bot controlado por RF, en realidad este programa ya fue publicado en ese hilo.
De todas formas creo que el protocolo de comunicacion entre las placas esta mas claro en el pequeño
articulo de los reles controlados por RF.

Programa 1ª:

Código: QBasic/QuickBASIC
  1. Define CONF_WORD = 0x3d32
  2. Define CLOCK_FREQUENCY = 20
  3. '***************** Explorer RX ***************************************
  4. 'NOMBRE: Explorer_Rx_Tx_18
  5. 'MICRO: PIC16f877A
  6. 'DESCRIPCION: COMUNICACION RF PARA CONTROLAR 2 MOTORES y 5 Servos, tipo Mando/Receptor
  7. 'tiempo de lectura entre byte y byte del puerto serie +-10mseg maximo y un +-milisegundo minimo
  8. 'Version 1.0
  9. 'Programa Bot_Miguelito_RF_10
  10. 'Se le añade una quinta tecla o maniobra
  11. 'Version 1.1
  12. 'Implementacion de hasta 11 byte en la trama de datos
  13. 'Version 1.2
  14. 'Implementacion de un servo_1 en el PROTC.2
  15. 'Implementacion de up/down cada 100ms para servo_1
  16. 'Version 1.3
  17. 'Mejora de la resolucion del servo_1
  18. 'Eliminacion de los 100ms de retrazo para servo_1
  19. 'Version 1.4
  20. 'Implementacion de cinco servos
  21. 'No funciona bien el PORTA.4 para manejar servos, asi que se cambia al PORTA.5
  22. 'Implementacion del control de los servos con el teclado de cinco teclas
  23. 'Version 1.5
  24. 'Se mejora la rutina del control de los servos para que actue sobre todo el recorrido de estos
  25. 'Nuevo calibrado del punto de reposo de los servos y punto maximo y minimo de cada articulacion
  26. 'Version 1.6
  27. 'Se cambia la rutina de las bases de tiempo
  28. 'Se refresca el display cada 100ms
  29. 'Se hace independiente el posicionamiento de los servos (del main) de la llamada a la lectura del bufer
  30. 'Se refresca la nueva posicion de los servos cada 100ms
  31. 'Version 1.7
  32. 'Se amplia el numero de timer
  33. 'Se refresca el display cada 50ms
  34. 'Se aumenta el paso de los codos a 200ms y el resto se disminulle a 50ms
  35. 'Se asocia la pinza/muñeca a la misma maniobra piza/codo, se mantiene tambien la anterior asociacion
  36. 'Se rectifica la rutina de los servos y pequeño calibrado de los puntos de trabajo
  37. 'No se ejecuta el codigo de la usart ubicado en el vector interrupciones, mientras funciona el codigo de los servos
  38. 'para evitar temblores en las articulaciones en reposo
  39. 'Version 1.8
  40. 'Incremeto de la velocidad de los comandos que manejan el display
  41. '************************************************************************************************
  42. '-------------------------------------Lo primero Programa-----------------------------------------
  43. '-------------------------------------PUERTOS DEFINIDOS POR EL SISTEMA----------------------------
  44. '-------------------------------------Puertos del LCD---------------------------------------------
  45. Define LCD_BITS = 8
  46. Define LCD_DREG = PORTB
  47. Define LCD_DBIT = 0
  48. Define LCD_RSREG = PORTC
  49. Define LCD_RSBIT = 0
  50. Define LCD_EREG = PORTC
  51. Define LCD_EBIT = 4
  52. Define LCD_RWREG = PORTC
  53. Define LCD_RWBIT = 1
  54. Define LCD_COMMANDUS = 2000  'Tiempo de espera despues de ejecutar un comand del lcd
  55. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al lcd
  56. Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el display, solo se ejecuta una vez
  57. '--------------------------------------DEFINICION DE VARIABLES-------------------------------------
  58. '-------------------------------------Variables sub_rutinas del puerto serie---------------------
  59. DIM assi AS Byte  'Contiene el valor de lectura del puerto serie
  60. DIM n_usart AS Byte  'Numero de datos del USART y del bufer IMAGEN de control
  61. DIM usart AS Byte  'Variable indice que apunta al ultimo dato adquirido por la USART
  62. DIM aux_usart AS Byte  'Auxiliar de la variable indice usart del USART
  63. DIM c_serial AS Byte  'Como USART pero para la lectura de control del bufer IMAGEN
  64. DIM bufer AS Byte  'Indica si hay datos por leer en el bufer USART
  65. '-------------------------------------Variables del contador del TIMER1----------------------------
  66. DIM aux_pause AS Word  'variable auxiiar
  67. DIM pause AS Word  'contiene el valor para simular el comando Waitms
  68. DIM basetimer_1ms AS Byte  'base de tiempos raiz
  69. DIM timer_1ms AS Word  'base de tiempos se incrementa cada 1mSeg
  70. DIM timer1_10ms AS Byte  'base de tiempos se incrementa cada 10mSeg minimo
  71. DIM timer2_10ms AS Byte
  72. DIM timer3_10ms AS Byte
  73. DIM timer4_10ms AS Byte
  74. DIM timer5_10ms AS Byte
  75. DIM timer6_10ms AS Byte
  76. DIM timer1 AS Byte  'fija el valor real de los timer
  77. DIM timer2 AS Byte
  78. DIM timer3 AS Byte
  79. DIM timer4 AS Byte
  80. DIM timer5 AS Byte
  81. DIM timer6 AS Byte
  82. '--------------------------------------Variables R/W de la Trama de Datos y Lectura Entradas --------
  83. DIM arranque AS Byte  'arranque, estabiliza el bit de bajada
  84. DIM grupo AS Byte  'byte de sincronismo (grupo de trabajo)
  85. DIM checsum AS Byte  'interviene en la deteccion de errores en las tramas de datos
  86. DIM w_posrx AS Byte  'Tiempo entre lectura y lectura del bufer
  87. DIM rd_grupo AS Byte  'Variables imagen (contienen los datos leidos del puerto serie)
  88. DIM rd_checsum AS Byte
  89. DIM rd_ent0 AS Byte
  90. DIM rd_ent1 AS Byte
  91. DIM rd_ent2 AS Byte
  92. DIM rd_ent3 AS Byte
  93. DIM rd_ent4 AS Byte
  94. DIM rd_ent5 AS Byte
  95. DIM rd_ent6 AS Byte
  96. DIM rd_ent7 AS Byte
  97. DIM rd_ent8 AS Byte
  98. DIM rd_ent9 AS Byte
  99. DIM rd_ent10 AS Byte
  100. DIM entrada AS Byte  'contiene el valor de las entradas
  101. DIM aux_ent0 AS Byte  'Contienen el estado de las entradas para enviar en la trama
  102. DIM aux_ent1 AS Byte
  103. DIM aux_ent2 AS Byte
  104. DIM aux_ent3 AS Byte
  105. DIM aux_ent4 AS Byte
  106. DIM aux_ent5 AS Byte
  107. DIM aux_ent6 AS Byte
  108. DIM aux_ent7 AS Byte
  109. DIM aux_ent8 AS Byte
  110. DIM aux_ent9 AS Byte
  111. DIM aux_ent10 AS Byte
  112. DIM e_0 AS Byte  'contiene los ultimos valores para aplicar leidos de la trama
  113. DIM e_1 AS Byte
  114. DIM e_2 AS Byte
  115. DIM e_3 AS Byte
  116. DIM e_4 AS Byte
  117. DIM e_5 AS Byte
  118. DIM e_6 AS Byte
  119. DIM e_7 AS Byte
  120. DIM e_8 AS Byte
  121. DIM e_9 AS Byte
  122. DIM e_10 AS Byte
  123. '---------------------------------------Variables del Control de los Servos ------------------------
  124. DIM servos_control AS Byte  'Controla que se ejecute la rutina de control de los servos
  125. DIM servos_contador AS Byte  'Indica el tiempo de control transcurrido en la rutina de servos
  126. DIM servos_aux_contador AS Byte
  127. DIM servo_1 AS Byte  'Pinza/Pinza
  128. DIM servo_2 AS Byte  'Pinza/Muñeca
  129. DIM servo_3 AS Byte  'Pinza/Codo
  130. DIM servo_4 AS Byte  'Camara/Muñeca
  131. DIM servo_5 AS Byte  'Camara/Codo
  132. DIM mecanismo AS Byte  'Selecciona el mecanismo a controlar, 0 = motores ruedas, 1 = pinza/pinza y pinza/muñeca
  133. '2 = pinza/muñeca y pinza/codo, 3 = camara/muñeca y camara/codo
  134. '---------------------------------------Variables del Programa -------------------------------------
  135. DIM n AS Byte  'variable auxiliar para las rutinas del programa
  136. '------------------------------------VARIABLES tipo array programa----------------------------------
  137. '------------------------------------VARIABLES tipo array sub_rutinas-------------------------------
  138. '------------------------------------Variables tipo array puerto serie------------------------------
  139. DIM usart_imagen(31) AS Byte  'Componen el bufer IMAGEN para control del bufer USART
  140. DIM usart_bufer(31) AS Byte  'Componen el bufer de la USART de bajo nivel
  141. '-----------------------------------------------ASIGNACIONES----------------------------------------
  142. '-------------------------------------Asigana valores a las variables de la rutina de los servos----
  143. servos_control = 0
  144. servos_contador = 0
  145. servos_aux_contador = 0
  146. servo_1 = 63  'Pinza/Pinza
  147. servo_2 = 46  'Pinza/Muñeca
  148. servo_3 = 61  'Pinza/Codo
  149. servo_4 = 47  'Camara/Muñeca
  150. servo_5 = 50  'Camara/Codo
  151. mecanismo = 1
  152. '-------------------------------------Asigna valores a las variables de la rutina del puerto serie--
  153. usart = 0
  154. aux_usart = 0
  155. c_serial = 0
  156. bufer = 0
  157. n_usart = 30
  158. assi = 0
  159. '-------------------------------------AsignA valores a las variables del TIMER1---------------------
  160. aux_pause = 0
  161. pause = 0
  162. basetimer_1ms = 0
  163. timer_1ms = 0
  164. timer1_10ms = 0
  165. timer2_10ms = 0
  166. timer3_10ms = 0
  167. timer4_10ms = 0
  168. timer5_10ms = 0
  169. timer6_10ms = 0
  170. timer1 = 5  '50ms
  171. timer2 = 35  '350ms
  172. timer3 = 5  '50ms
  173. timer4 = 20  '200ms
  174. timer5 = 5  '50ms
  175. timer6 = 20  '200ms
  176. '--------------------------------------asignacion de valores generales-----------------------------
  177. arranque = 0
  178. grupo = 250
  179. rd_ent0 = 1
  180. rd_ent1 = 1
  181. rd_ent2 = 1
  182. rd_ent3 = 1
  183. rd_ent4 = 1
  184. rd_ent5 = 1
  185. rd_ent6 = 1
  186. rd_ent7 = 1
  187. rd_ent8 = 1
  188. rd_ent9 = 1
  189. rd_ent10 = 1
  190. aux_ent0 = 1
  191. aux_ent1 = 1
  192. aux_ent2 = 1
  193. aux_ent3 = 1
  194. aux_ent4 = 1
  195. aux_ent5 = 1
  196. aux_ent6 = 1
  197. aux_ent7 = 1
  198. aux_ent8 = 1
  199. aux_ent9 = 1
  200. aux_ent10 = 1
  201. entrada = 0
  202. entrada.0 = 1
  203. entrada.1 = 1
  204. entrada.2 = 1
  205. entrada.3 = 1
  206. entrada.4 = 1
  207. e_0 = 1
  208. e_1 = 1
  209. e_2 = 1
  210. e_3 = 1
  211. e_4 = 1
  212. e_5 = 1
  213. e_6 = 1
  214. e_7 = 1
  215. e_8 = 1
  216. e_9 = 1
  217. e_10 = 1
  218. w_posrx = 10  '10mSeg rf, se espera un maximo de tiempo antes de leer el bufer si no hay datos
  219. '--------------------------------------DEFINICION DE PUERTOS------------------------------------------------
  220. '--------------------------------ASIGNACION DE I/O y valores de inicion de las salidas----------------------
  221. ADCON1 = 0x07
  222. TRISA = 0xff
  223. TRISE.0 = 1
  224. TRISE.1 = 1
  225. TRISE.2 = 1
  226. TRISC.5 = 0
  227. TRISD = 0x00
  228. TRISD.0 = 1
  229. TRISD.1 = 1
  230. PORTC.5 = 0
  231. PORTD.2 = 1
  232. PORTD.3 = 1
  233. PORTD.4 = 1
  234. PORTD.5 = 1
  235. PORTD.6 = 1
  236. PORTD.7 = 1
  237. IF RE1 = 0 THEN  'Si trabajo en modo receptor
  238.         TRISA = 0x0
  239.         PORTA.0 = 0
  240.         PORTA.1 = 0
  241.         PORTA.2 = 0
  242.         PORTA.3 = 0
  243.         PORTA.4 = 0
  244.         PORTA.5 = 0
  245. Endif
  246. '------------------------------------INICIO DEL PUERTO SERIE, TIMER E INTERRUPCONES------------------
  247. Hseropen 1200  'Velocidad del puerto serie e inicializa los comandos de bajo nivel que controlan la USART
  248. INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos(USART), para que funcione la implementacio P.serie
  249. PIE1.RCIE = 1  'Activa la interrupcion de la USART en modo rx
  250. T1CON.TMR1ON = 1  'Configuracion y habilitacion del TMR1
  251. T1CON.TMR1CS = 0
  252. T1CON.T1CKPS0 = 0
  253. T1CON.T1CKPS1 = 0
  254. TMR1H = 0xec  'Para 1ms
  255. TMR1L = 0x78
  256. PIE1.TMR1IE = 1
  257. Enable  'INTCON.GIE habilita todas las interrupciones globales
  258. '--------------------------------------Inicio Programa--------------------------------------------------
  259. Lcdinit  'Inicializa el display
  260. pause = 1000
  261. GOSUB pause_ms
  262. Lcdcmdout LcdClear
  263. Lcdout "HOLA TOY LISTO:"
  264. GOSUB stop_md  'para motores
  265. GOSUB stop_mi
  266. GOSUB error_usart  'Borra el BUFFER IMAGEN y por lo tanto tambien al USART, OBLIGATORIO POR LO MENOS una vez
  267. pause = 500
  268. GOSUB pause_ms
  269. Lcdcmdout LcdClear
  270. '--------------------------------------Main Programa----------------------------------------------------
  271. main:
  272.         IF RCSTA.OERR = 1 THEN  'testea posible bloqueo del puerto fisico en modo Rx
  273.                 GOSUB error_usart
  274.         Endif
  275.         IF RE1 = 1 THEN  'trabajo en modo emisor
  276.                 GOSUB lectura_entradas  'lee las entradas en ent0...3, teclas
  277.                 GOSUB envio_comando  'envia la trama
  278.                 Lcdcmdout LcdHome  'muestra las teclas pulsadas
  279.                 Lcdout "Tx" #aux_ent0, #aux_ent1, #aux_ent2, #aux_ent3, #aux_ent4, " ", #aux_ent5, " ", #aux_ent6, " "
  280.                 Lcdcmdout LcdLine2Home
  281.                 Lcdout #aux_ent7, " ", #aux_ent8, " ", #aux_ent9, " ", #aux_ent10, " "
  282.         Endif
  283.         IF RE1 = 0 THEN  'trabajo en modo receptor
  284.                 IF timer1_10ms >= timer1 THEN  'muestra maniobras y posicion de los servos, cada 50ms
  285.                         Lcdcmdout LcdHome
  286.                         Lcdout "Rx" #e_0, #e_1, #e_2, #e_3, #e_4, " ", #servo_1, " ", #servo_2, " "
  287.                         Lcdcmdout LcdLine2Home
  288.                         Lcdout #servo_3, " ", #servo_4, " ", #servo_5, " ", #mecanismo, "  "
  289.                         timer1_10ms = 0
  290.                 Endif
  291.                 IF bufer > 0 THEN  'Rx, lee el puerto serie si hay datos y activo maniobras de los motores
  292.                         GOSUB recivo_comando
  293.                 Endif
  294.                 IF e_4 = 0 THEN  'Selecciona el mecanismo a controlar
  295.                         IF timer2_10ms >= timer2 THEN
  296.                                 mecanismo = mecanismo + 1
  297.                                 IF mecanismo >= 4 THEN mecanismo = 0
  298.                                 timer2_10ms = 0
  299.                         Endif
  300.                 Endif
  301.                 IF timer3_10ms >= timer3 THEN
  302.                         IF mecanismo = 1 THEN  'Control de la Pinza
  303.                                 IF e_3 = 0 THEN
  304.                                         IF servo_1 < 63 THEN servo_1 = servo_1 + 1  'Pinza/Pinza, superior
  305.                                 Endif
  306.                                 IF e_2 = 0 THEN
  307.                                         IF servo_1 > 30 THEN servo_1 = servo_1 - 1  'Pinza/Pinza, inferior
  308.                                 Endif
  309.                                 IF e_1 = 0 THEN
  310.                                         IF servo_2 < 75 THEN servo_2 = servo_2 + 1  'Pinza/Muñeca
  311.                                 Endif
  312.                                 IF e_0 = 0 THEN
  313.                                         IF servo_2 > 18 THEN servo_2 = servo_2 - 1
  314.                                 Endif
  315.                         Endif
  316.                         timer3_10ms = 0
  317.                 Endif
  318.                 IF mecanismo = 2 THEN
  319.                         IF timer5_10ms >= timer5 THEN
  320.                                 IF e_1 = 0 THEN
  321.                                         IF servo_2 < 75 THEN servo_2 = servo_2 + 1  'Pinza/Muñeca
  322.                                 Endif
  323.                                 IF e_0 = 0 THEN
  324.                                         IF servo_2 > 18 THEN servo_2 = servo_2 - 1
  325.                                 Endif
  326.                                 timer5_10ms = 0
  327.                         Endif
  328.                         IF timer4_10ms >= timer4 THEN
  329.                                 IF e_3 = 0 THEN
  330.                                         IF servo_3 < 73 THEN servo_3 = servo_3 + 1  'Pinza/codo
  331.                                 Endif
  332.                                 IF e_2 = 0 THEN
  333.                                         IF servo_3 > 36 THEN servo_3 = servo_3 - 1
  334.                                 Endif
  335.                                 timer4_10ms = 0
  336.                         Endif
  337.                 Endif
  338.                 IF mecanismo = 3 THEN  'Control de la Camara
  339.                         IF timer5_10ms >= timer5 THEN
  340.                                 IF e_0 = 0 THEN
  341.                                         IF servo_4 < 75 THEN servo_4 = servo_4 + 1  'Camara/Muñeca
  342.                                 Endif
  343.                                 IF e_1 = 0 THEN
  344.                                         IF servo_4 > 19 THEN servo_4 = servo_4 - 1
  345.                                 Endif
  346.                                 timer5_10ms = 0
  347.                         Endif
  348.                         IF timer6_10ms >= timer6 THEN
  349.                                 IF e_3 = 0 THEN
  350.                                         IF servo_5 < 75 THEN servo_5 = servo_5 + 1  'Camara/codo
  351.                                 Endif
  352.                                 IF e_2 = 0 THEN
  353.                                         IF servo_5 > 29 THEN servo_5 = servo_5 - 1
  354.                                 Endif
  355.                                 timer6_10ms = 0
  356.                         Endif
  357.                 Endif
  358.                 IF mecanismo = 0 THEN  'Control de los motores de avance
  359.                         IF e_0 = 0 THEN
  360.                                 GOSUB fwd_md
  361.                                 GOSUB rev_mi
  362.                                 GOSUB on_md
  363.                                 GOSUB on_mi
  364.                         Endif
  365.                         IF e_1 = 0 THEN
  366.                                 GOSUB rev_md
  367.                                 GOSUB fwd_mi
  368.                                 GOSUB on_md
  369.                                 GOSUB on_mi
  370.                         Endif
  371.                         IF e_2 = 0 THEN
  372.                                 GOSUB fwd_md
  373.                                 GOSUB fwd_mi
  374.                                 GOSUB on_md
  375.                                 GOSUB on_mi
  376.                         Endif
  377.                         IF e_3 = 0 THEN
  378.                                 GOSUB rev_md
  379.                                 GOSUB rev_mi
  380.                                 GOSUB on_md
  381.                                 GOSUB on_mi
  382.                         Endif
  383.                         IF e_0 = 1 AND e_1 = 1 AND e_2 = 1 AND e_3 = 1 THEN
  384.                                 GOSUB stop_md
  385.                                 GOSUB stop_mi
  386.                         Endif
  387.                 Endif
  388.         Endif
  389. GOTO main
  390. END                                              
  391. '--------------------------------------FIN DEL MAIN---------------------------------------------------
  392. '--------------------------------------Sub_Rutinas Programa-----------------------------------------------
  393. recivo_comando:  'leo el bufer del puerto serie
  394.         GOSUB readserial
  395.         IF assi = grupo THEN
  396.                 rd_grupo = assi
  397.         ELSE
  398.                 RETURN
  399.         Endif
  400.         GOSUB readserial
  401.         rd_ent0 = assi
  402.         GOSUB readserial
  403.         rd_ent1 = assi
  404.         GOSUB readserial
  405.         rd_ent2 = assi
  406.         GOSUB readserial
  407.         rd_ent3 = assi
  408.         GOSUB readserial
  409.         rd_ent4 = assi
  410.         GOSUB readserial
  411.         rd_ent5 = assi
  412.         GOSUB readserial
  413.         rd_ent6 = assi
  414.         GOSUB readserial
  415.         rd_ent7 = assi
  416.         GOSUB readserial
  417.         rd_ent8 = assi
  418.         GOSUB readserial
  419.         rd_ent9 = assi
  420.         GOSUB readserial
  421.         rd_ent10 = assi
  422.         GOSUB readserial
  423.         rd_checsum = rd_ent0 + rd_ent1 + rd_ent2 + rd_ent3 + rd_ent4 + rd_ent5
  424.         rd_checsum = rd_ent6 + rd_checsum + rd_ent7 + rd_ent8 + rd_ent9 + rd_ent10
  425.         IF assi = rd_checsum THEN  'renuevo los valores de las entradas con los valores leidos del bufer
  426.                 e_0 = rd_ent0
  427.                 e_1 = rd_ent1
  428.                 e_2 = rd_ent2
  429.                 e_3 = rd_ent3
  430.                 e_4 = rd_ent4
  431.                 e_5 = rd_ent5
  432.                 e_6 = rd_ent6
  433.                 e_7 = rd_ent7
  434.                 e_8 = rd_ent8
  435.                 e_9 = rd_ent9
  436.                 e_10 = rd_ent10
  437.         Endif
  438. RETURN                                            
  439. envio_comando:  'transmite la trama de datos, modo tx
  440.         pause = 5  'pausa antes de enviar la trama
  441.         GOSUB pause_ms
  442.         aux_ent0.0 = entrada.0
  443.         aux_ent1.0 = entrada.1
  444.         aux_ent2.0 = entrada.2
  445.         aux_ent3.0 = entrada.3
  446.         aux_ent4.0 = entrada.4
  447.         checsum = aux_ent0 + aux_ent1 + aux_ent2 + aux_ent3 + aux_ent4 + aux_ent5
  448.         checsum = checsum + aux_ent6 + aux_ent7 + aux_ent8 + aux_ent9 + aux_ent10
  449.         Hserout arranque, grupo, aux_ent0, aux_ent1, aux_ent2, aux_ent3, aux_ent4, aux_ent5, aux_ent6, aux_ent7, aux_ent8, aux_ent9, aux_ent10, checsum
  450.         pause = 1  'pausa despues de enviar la trama
  451.         GOSUB pause_ms
  452. RETURN                                            
  453. lectura_entradas:  'lee las entradas o controles del bot, modo tx
  454.         entrada.0 = RA0
  455.         entrada.1 = RA1
  456.         entrada.2 = RA2
  457.         entrada.3 = RA3
  458.         entrada.4 = RA4
  459. RETURN                                            
  460. pause_ms:  'rutina de espera, rutina tipo Waitms, pause establese el tiempo total en mSeg
  461.         aux_pause = 0  'variable auxiliar lleva la cuenta de los ms
  462.         timer_1ms = 0  'al borrar el contador se activa y comienza la cuenta de 1mSeg
  463.         WHILE aux_pause <= pause  'tiempo en mSeg maximos a contar
  464.                 aux_pause = aux_pause + 1  'variable auxiliar lleva la cuenta de los ms
  465.                 IF timer_1ms > 0 THEN timer_1ms = 0  'al borrar el contador se activa y cuenta 1mSeg
  466.                 WHILE timer_1ms < 1  'espera un miliesegundo
  467.                 WEND
  468.         WEND
  469. RETURN                                            
  470. pause_ms_rx:  'rutina de espera antes de leer el bufer, rutina tipo Waitms, w_posrx establese el tiempo total en mSeg
  471.         aux_pause = 0  'variable auxiliar lleva la cuenta de los ms
  472.         timer_1ms = 0  'al borrar el contador se activa y comienza la cuenta de 1mSeg
  473.         WHILE aux_pause <= w_posrx  'tiempo en mSeg maximos a contar
  474.                 IF bufer > 0 THEN aux_pause = w_posrx  'si entran datos en el bufer se termina el contaje
  475.                 aux_pause = aux_pause + 1  'variable auxiliar lleva la cuenta de los ms
  476.                 IF timer_1ms > 0 THEN timer_1ms = 0  'al borrar el contador se acitva y cuenta 1mSeg
  477.                 WHILE timer_1ms < 1  'espera un miliesegundo
  478.                 WEND
  479.         WEND
  480. RETURN                                            
  481. on_md:  'activa el motor derecho
  482.         PORTD.7 = 1
  483. RETURN                                            
  484. stop_md:  'para el motor derecho
  485.         PORTD.7 = 0
  486. RETURN                                            
  487. on_mi:  'activa el motor izquierdo
  488.         PORTD.4 = 1
  489. RETURN                                            
  490. stop_mi:  'para el motor izquierdo
  491.         PORTD.4 = 0
  492. RETURN                                            
  493. fwd_md:  'sentido adelante motor derecho (no lo pone en marcha)
  494.         PORTD.5 = 0
  495.         PORTD.6 = 1
  496. RETURN                                            
  497. rev_md:  'sentido atras derecho (no activa el motor)
  498.         PORTD.5 = 1
  499.         PORTD.6 = 0
  500. RETURN                                            
  501. fwd_mi:  'sentido adelante izquierdo (no activa el motor)
  502.         PORTD.2 = 0
  503.         PORTD.3 = 1
  504. RETURN                                            
  505. rev_mi:  'sentido atras izquierdo (no activa el motor)
  506.         PORTD.2 = 1
  507.         PORTD.3 = 0
  508. RETURN                                            
  509.                                                                                  
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: problema RF modulos de cebek
« Respuesta #27 en: 11 de Abril de 2008, 19:30:57 »
Programa 2ª (continuacion):

Código: QBasic/QuickBASIC
  1. '------------------------------ rutinas para el control del bufer del puerto serie-------------
  2. readserial:
  3. 'RUTINA DE LECTURA DEL BUFFER DEL PUERTO SERIE (ASSI)
  4.         GOSUB pause_ms_rx  'valor de entrada en mSeg de espera definido por w_posrx
  5.         assi = 0  'se borra el valor de assi, no se debe de utilizar cero como un valor de control
  6.         IF bufer = 1 THEN  'si bufer tiene datos
  7.                 assi = usart_bufer(c_serial)  'se lee el valor del bufer y se asigna assi
  8.                 usart_imagen(c_serial) = 0  'se marca como leida para que pueda ser llenada de nuevo
  9.                 c_serial = c_serial + 1  'se incrementa el indice del bufer
  10.                 IF c_serial >= n_usart THEN c_serial = 0  'se verifica si se llego al final del bufer
  11.                 IF usart_imagen(c_serial) = 0 THEN bufer = 0  'si no quedan mas datos en el bufer se marca como vacio
  12.         Endif
  13. RETURN                                            
  14. error_usart:
  15.         GOSUB clear_bufer
  16. RETURN                                            
  17. clear_bufer:
  18.         FOR n = 0 TO 1  'desbloquea el puerto serie fisico en caso de bloqueo por exceso de entrada de datos
  19.                 RCSTA.CREN = 0
  20.                 RCSTA.CREN = 1
  21.                 RCSTA.OERR = 0
  22.                 GOSUB clearbufer
  23.                 PIR1.RCIF = 0  'borra el flag de salto de la usart
  24.         NEXT n
  25. RETURN                                            
  26. clearbufer:  'BORRA E INICIALIZA EL BUFFER IMAGEN DEL PUERTO serie
  27.         FOR c_serial = 0 TO n_usart
  28.                 usart_imagen(c_serial) = 0
  29.         NEXT c_serial
  30.         c_serial = 0
  31.         usart = 0
  32.         bufer = 0
  33.         assi = 0
  34. RETURN
  35.   '--------------------------------------SIBRUTINAS ESPECIALES---------------------------------------------
  36. ON Interrupt  'Comienzan las rutinas de las interrupciones
  37.         Save SYSTEM  'Guarda los valores del sistema
  38. '--------------------------------------RUTINA TIMER_1----------------------------------------------------
  39.         IF PIR1.TMR1IF = 1 THEN  'comprueba que es esta la interrupcion activa
  40.                 IF servos_control = 0 THEN  '*** rutina de control de los servos, sobre los 2ms
  41.                         IF servos_contador = 0 THEN  'activo las salidas de control de los servos
  42.                                 PORTA.0 = 1
  43.                                 PORTA.1 = 1
  44.                                 PORTA.2 = 1
  45.                                 PORTA.3 = 1
  46.                                 PORTA.5 = 1
  47.                         Endif
  48.                         servos_contador = servos_contador + 1  'base de tiempos para el control de los servos
  49.                         IF servo_1 <= servos_contador THEN  'tiempo en que la salida de control del servo esta activada
  50.                                 PORTA.0 = 0
  51.                         Endif
  52.                         IF servo_2 <= servos_contador THEN
  53.                                 PORTA.1 = 0
  54.                         Endif
  55.                         IF servo_3 <= servos_contador THEN
  56.                                 PORTA.2 = 0
  57.                         Endif
  58.                         IF servo_4 <= servos_contador THEN
  59.                                 PORTA.3 = 0
  60.                         Endif
  61.                         IF servo_5 <= servos_contador THEN
  62.                                 PORTA.5 = 0
  63.                         Endif
  64.                         IF servos_contador >= 87 THEN  'marca el fin de la rutina de control de servos y calibrado de esta
  65.                                 servos_contador = 0
  66.                                 servos_control = 1
  67.                         ELSE  'recarga el contador del tiempo de control de la trama de los servos
  68.                                 TMR1H = 0xff  '0.008ms, 125
  69.                                 TMR1L = 0xd8  '0xd8
  70.                                 PIR1.TMR1IF = 0  'borra el flag de salto del tmr1
  71.                         Endif
  72.                 Endif
  73.                 IF servos_control = 1 THEN  'controla las bases de tiempos y el resto de tiempo de la señal de control servos
  74.                         basetimer_1ms = basetimer_1ms + 1  'lleva error de +-2mSg cada 18mSg
  75.                         IF timer_1ms < 1 THEN timer_1ms = timer_1ms + 1  'lleva error de +-2mSg cada 18mSg
  76.                         IF basetimer_1ms >= 10 THEN
  77.                                 IF timer1_10ms < timer1 THEN timer1_10ms = timer1_10ms + 1
  78.                                 IF timer2_10ms < timer2 THEN timer2_10ms = timer2_10ms + 1
  79.                                 IF timer3_10ms < timer3 THEN timer3_10ms = timer3_10ms + 1
  80.                                 IF timer4_10ms < timer4 THEN timer4_10ms = timer4_10ms + 1
  81.                                 IF timer5_10ms < timer5 THEN timer5_10ms = timer5_10ms + 1
  82.                                 IF timer6_10ms < timer6 THEN timer6_10ms = timer6_10ms + 1
  83.                                 basetimer_1ms = 0
  84.                         Endif
  85.                         servos_aux_contador = servos_aux_contador + 1  'control del resto del tiempo de la señal de los servos a nivel bajo
  86.                         IF servos_aux_contador >= 17 THEN
  87.                                 servos_control = 0
  88.                                 servos_aux_contador = 0
  89.                         Endif
  90.                         TMR1H = 0xec  '1ms
  91.                         TMR1L = 0x78
  92.                         PIR1.TMR1IF = 0  'borra el flag de salto del tmr1
  93.                 Endif
  94.         Endif
  95. '--------------------------------------BUFFER PUERTO SERIE-----------------------------------------------
  96.         IF servos_contador = 0 THEN  'impide que se ejecute durante la generacion de la señal de control servos +-2mSg
  97.                 IF PIR1.RCIF = 1 THEN  'comprueba que es esta la interrupcion activa
  98.                         IF usart < n_usart THEN  'comprueba que el bufer de entrada no esta lleno
  99.                                 IF usart_imagen(usart) = 0 THEN  'comprueba que la posicion esta vacia
  100.                                         aux_usart = usart  'retiene la posicion antigua del bufer
  101.                                         usart = usart + 1  'indica cual sera la posicion siguiente del bufer
  102.                                         usart_imagen(aux_usart) = 1  'indica que hay dato en el bufer de entrada
  103.                                         bufer = 1  'indica que el bufer tine datos
  104.                                         Hserget usart_bufer(aux_usart)  'carga el dato en el bufer
  105.                                 ELSE
  106.                                         Hserget usart_bufer(n_usart)  'descarga la usart para que no se bloquee porque el bufer de entrada esta lleno
  107.                                 Endif
  108.                         ELSE
  109.                                 IF usart_imagen(0) = 0 THEN  'comprueba que esta vacia la primera posicion del bufer
  110.                                         usart_imagen(0) = 1  'marca que hay dato en esa posicion del bufer
  111.                                         bufer = 1  'marca que el bufer tiene datos
  112.                                         usart = 1  'establece la proxima posicion del bufer
  113.                                         Hserget usart_bufer(0)  'lee la usart y guarda el dato en el bufer
  114.                                 ELSE
  115.                                         Hserget usart_bufer(n_usart)  'descarga la usart porque el bufer esta lleno
  116.                                 Endif
  117.                         Endif
  118.                         PIR1.RCIF = 0  'borra el flag de salto de la usart
  119.                 Endif
  120.         Endif
  121. RESUME
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: problema RF modulos de cebek
« Respuesta #28 en: 11 de Abril de 2008, 19:39:01 »
PD. El mismo programa es comun a las dos placas, solo un puente indica que placa sera la receptora (RX) o transmisora (TX).
Saludos desde Granada, España.

Desconectado MarcoPina

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 14
Re: problema RF modulos de cebek
« Respuesta #29 en: 12 de Abril de 2008, 13:17:47 »
ok, gracias por poner el programa de ese bot (aunque no entonedo ni papa de C jeje).

Una pregunta, bueno en verdad varias...

En cada envio de datos, ¿que se envian el 0, el 255 y el dato determinado? ¿o son por separado? y si es to seguio el envio...¿como hago pa diferenciar un byte de otro? ¿espero a que se llene el RCREG y lo leo o como?
Digo esto porque cada vez que envio un dato se me produce una interrupcion, por lo que cuando me llegue el 0 me hara una interrupcion (la cual debo despreciar), y ahora que...¿tedria que mandar el 255 seguido del cero para que no lo tome como otra interrupcion? ¿y con el dato lo mismo? es que si es asi no se como decirle al programa para que lea el segundo y el tercero diferenciando uno de otro, sin tener en cuanta el primero (el 0).

No se si en el lenguaje que tu usas se podra elegir el byte que quieres elegir dentro de la misma trama, porque en emsamblador no se me ocurre como hacerlo...

Si se te ocurre alguna sugerencia sera como siempre bienvenida XD.

Muchas gracias.



 

anything