TODOPIC

Mecatrónica => Robótica => Mensaje iniciado por: MarcoPina en 03 de Abril de 2008, 15:07:58

Título: problema RF modulos de cebek
Publicado por: MarcoPina en 03 de Abril de 2008, 15:07:58
Hola, soy nuevo en este foro (la enhorabuena a todos sus credores XD) a ver si es posible que me ayuden con unos módulos RF que tengo...

Mis módulos son el C-0503 y el C-0504 de cebek.

Quiero enviar un byte para controlar un bot desde el teclado del ordenador utilizando el hyperterminal de windows. Lo que no se es la velocidad en baudios que tengo que ponerle, he probado mirando la salida del receptor (c-0504) con un osciloscopio y creo que si me recibe lo mismo que envio , pero tengo que hacerlo a una velocidad de 300 baudios...

Pero a la hora de ponerlo en el bot, creo que pierde información por el camino o algo porque me hace cosas raras. He leido por este foro que poniais un protocolo de comunicación o algo (no entiendo demasiado...como puede apreciarse jeje).

Lo que tengo que controlar en el bot es un motor de CC y un servo, les explico:

Mi proyecto consiste literalmente en un coche radio control, la unica diferencia es que lo controlo desde el teclado del pc...pero me esta dando problemas la RF, si me pudierais echar una mano os estaria muy agradecidos.

PD: El lenguaje de programación que utilizo es ensamblador (ASM) y no conozco nigun otro jeje...asi que seria de agradecer que si me comentan algo del protocolo de comunicación que cite antes les agradeceria que fuera en este lenguaje (principalmente porque no entendo otro XD)
Título: Re: problema RF modulos de cebek
Publicado por: elmasvital en 03 de Abril de 2008, 18:12:22
Te lo he puesto como un tema autonomo.

Con respecto a la duda el buscador lanza este tema

http://www.todopic.com.ar/foros/index.php?topic=10707.0

en el que dogflu menciona haber utilizado esos mismos modulos. A ver si se pasa y te comenta cómo se manejan.

mira tambien aqui

http://www.todopic.com.ar/foros/index.php?topic=8307.0

http://www.todopic.com.ar/foros/index.php?topic=14601.0

http://www.todopic.com.ar/foros/index.php?topic=14601.0

http://www.todopic.com.ar/foros/index.php?topic=8838.0

http://www.todopic.com.ar/foros/index.php?topic=8587.0


creo que con eso sacaras algo en claro.

 1 saludo.
Título: Re: problema RF modulos de cebek
Publicado por: dogflu66 en 04 de Abril de 2008, 12:08:40
Hay mucha información en el foro sobre control mediante RF, en el mismo índice de robótica
hay varios proyectos de bot controlados por RF. El problema esta en que todos se utiliza
Lenguaje de alto nivel.

Te recomiendo que comiences por hacer la comunicación por cable RS232 y cuando te funcione
todo quitas los driver RS232 y adaptas los módulos de RF que es una operación muy sencilla
quedando tan solo hacer la pequeña adaptación del soft a los módulos de RF.

Aqui te dejo una info que es recomendable leer antes de comenzar con estos modulos:

http://www.freewebs.com/glafebre/controlderelesrf.htm

Título: Re: problema RF modulos de cebek
Publicado por: dogflu66 en 04 de Abril de 2008, 12:28:03
Y comunicacion con el PC:

Indice:

http://www.todopic.com.ar/foros/index.php?topic=14917.0

Buscar "COMUNICACION CON EL PC"

Todos estos ejemplos son mediante comunicacion serie por cable, la adaptacion
para trabajar con los modulos de RF es minima.
Título: Re: problema RF modulos de cebek
Publicado por: dogflu66 en 04 de Abril de 2008, 12:42:45
PD. La velocidad máxima que he trabajado con esos módulos es de 2400baudios pero siempre trabajo con ellos a 1200baudios.
Título: Re: problema RF modulos de cebek
Publicado por: MarcoPina en 04 de Abril de 2008, 14:24:50
Hola dogflu66, gracias por responder. Ya estuve mirando lo que encontre en el foro publicado sobre la RF pero me quedaba igual, no me solucionaba gran cosa...

Creo que lo mejor es que exponga aqui claramente todo lo que hago y si me pueden ayudar se lo agradeceria:

Yo uso ensamblador como lenguaje de programacion (yo tenia entendio que era de bajo nivel pero bueno, no viene al caso XD), la programación del bot la tengo completa llendo sin los modulos RF, es decir, sustituyendo ambos por un cable. La programacion me va bien asi, pero cuando le pongo la RF , consigo que me detecte los movimientos del servo (me tarda un poquito en reaccionar, pero supongo que será normal,por tenerlo a una velocidad de 300 baudios) pero en cuanto le doy para que me entre en funcionamiento el motor de continua, se me queda cogio y no es capaz de detectarme nada mas, se queda como estuviera el servo y haciendo lo que le has indicao que haga el motor de CC, pero ya esta, no me deja hacer nada más.

He leido por el foro que tu utilizas un pequeño protocolo para que se comuniquen correctamente...eso no se como va. Yo lo que hago es conectar el PC con un MAX232 y este a C-0503, nose si esto es recomendable, pero mirandolo a traves de un osciloscopio si se veia a la salida del C-0504 lo mismo que entreba en el C-0503...no se si es que en el osciloscopio no se puede apreciar los bit esos que se puedan deteriorar o algo...

Me seria de gran ayuda que me explicases con mas detenimiento (si tienes tiempo) eso del protocolo, porque iba a probar ponerle la velocidad minima que permite el hyperterminal (110 baudios) para ver si me funciona asi y es capaz de detectar correctamente los bytes...sino po tendre que montar otra placa emisora incorporando un pic, en el que poder introducir el protocolo ese que dices.

Muchas gracias de antemano por perder vuestro tiempo conmigo...gracias.
Título: Re: problema RF modulos de cebek
Publicado por: dogflu66 en 04 de Abril de 2008, 16:49:06
Si, el ensamblador es un lenguaje de bajo nivel, no me referia a el.
Pues seguro que habra solucion... :wink:
Título: Re: problema RF modulos de cebek
Publicado por: dogflu66 en 05 de Abril de 2008, 09:48:31

He leido por el foro que tu utilizas un pequeño protocolo para que se comuniquen correctamente...eso no se como va. Yo lo que hago es conectar el PC con un MAX232 y este a C-0503, nose si esto es recomendable, pero mirandolo a traves de un osciloscopio si se veia a la salida del C-0504 lo mismo que entreba en el C-0503...no se si es que en el osciloscopio no se puede apreciar los bit esos que se puedan deteriorar o algo...


Hola;

Entiendo que utilizas el MAX232 para convertir los niveles RS232 a ttl y luego estos se los aplicas al modulo de RF. Siempre utilizo un circuito con PIC que es el que recopila los datos del puerto serie y los adapta para trabajar con el modulo de RF. Usando el modulo conectado de esta forma al PC, pienso que no te va hacer valido el hiperterminal, en todo caso necesitaras crearte tu propio terminal con un lenguaje de programación para PC que te haga de filtro al enviar los datos al puerto rs232 haciendo las correcciones en la trama de datos.

Tienes que tener en cuenta que este tipo de módulos son de muy bajo coste y a un que funcionan cuesta ponerlos en marcha ya que tienden a corromper el BIT de arranque del primer Byte de datos del protocolo físico del RS232. Por lo que siempre hay perdida de datos. Para corregir esto se suele enviar un primer Byte basura que no se interpreta en el destino seguido de un Byte de cabecera o sincronismo. Por ejemplo yo envío el 0 como Byte basura que será ignorado seguido de 255 que es el Byte de sincronismo, si este ultimo Byte llega bien entiendo que hay sincronización entre TX y Rx y comienzo a almacenar la trama de datos de longitud fija, se puede hacer de longitud variable sin problemas, ya sea indicada su longitud por un Byte, por el tipo de comando recibido o por un Byte determinado que indica la terminación de la trama o paquete de datos. El uso de longitud de trama fija es más fácil. En mi caso él ultimo Byte contiene el modulo de la suma de toda la trama este Byte nos hace de checsun y es el que nos indicara si la trama es valida.

Todo esto ultimo incluyendo la estructura de la trama de datos esta explicado en él articulo de los reles controlados por RF.
De todas formas si necesitas mas detalle sobre algo en concreto que este en mi mano con gusto lo comentare.
Título: Re: problema RF modulos de cebek
Publicado por: MarcoPina en 05 de Abril de 2008, 16:13:38
Entonces crees que no habra mejoria si le bajo la velicidad al hyperterminal no?, voy a tener que diseñar otra placa emisora para incorporar el pic.

Este pic lo recomiendas que tenga tb la tecnologia USART???


GRACIAS por responder tan rapido... me estas salvando la vida jeje
Título: Re: problema RF modulos de cebek
Publicado por: dogflu66 en 05 de Abril de 2008, 19:30:27
Pues solo he utilizado comunicación empleando la uar por hard así que no te puedo ayudar en este caso.
Desde luego yo prefiero utilizar el modulo uar del PIC. De todos modos si no me quedara mas remedio
que utilizar simulación de uar no utilizaría un cristal menor a 20Mhz en el micro para estar seguro que
no tendré problemas de velocidad de proceso.
Título: Re: problema RF modulos de cebek
Publicado por: MarcoPina en 06 de Abril de 2008, 07:25:59
Hola, Dogflu66 no encuentro ese articulo que dices de los reles controlados por RF, sino te importa...¿me podrias mandar el enlace?

Una cosa mas, cuando te referias a esto...:



 Usando el modulo conectado de esta forma al PC, pienso que no te va hacer valido el hiperterminal, en todo caso necesitaras crearte tu propio terminal con un lenguaje de programación para PC que te haga de filtro al enviar los datos al puerto rs232 haciendo las correcciones en la trama de datos.


Es decir, ¿que como lo tengo ahora mismo no me va ir la RF en la vida no? que necesito incluir un pic en la placa emisora.
Si introduzco el pic16F876, que tiene la tecnologia necesaria para la comunicacion serie, es mejor que tener que diseñarle esa rutina no? ya que en este pic ya existe un registro de recepcion  y envio  en serie, solo tengo que leer ese registro y mandar los datos al de envio (o algo asi, no recuerdo bien ahora mismo).

Muchas gracias Dogflu66 y perdona por las molestias.
Título: Re: problema RF modulos de cebek
Publicado por: MarcoPina en 06 de Abril de 2008, 07:54:42
Hay una cosa que no entiendo muy bien del todo, teniendo los modulos conectados, las bytes correspondentes al servo si me los coge bien, pero cuando le doy a alguno de los que controla el motor de CC se me queda to bloqueado, es decir, que no me recibe mas nada. Si fuera que no me recibiera nada de nada incluso estaria mas tranquilo, pero es que el servo si me lo hace bien, no lo entiendo, y si fuera que estuviera mal hecho el programa no funcionaria tampoco conectando las placas directamente con un cable.

De hay que te comentase de intentar bajarle la velocidad de envio en el hyperterminal (configurandolo tambien en el programa, ya que deben de ir a la misma velocidad), para ver si conseguia mandarlo todo bien.

Si se te ocurre alguna explicación te lo agradeceria muchisimo.


GRACIAS
Título: Re: problema RF modulos de cebek
Publicado por: dogflu66 en 06 de Abril de 2008, 08:59:11
La única cosa que se me ocurre es que estés usando el modulo uar como RX y este modulo si los datos no se extraen
con suficiente velocidad queda bloqueado, hay que vaciar los registro de paso antes que lleguen unos nuevos valores,
y para que vuelva a funcionar hay que desbloquear el modulo.... no se me ocurre ninguna otra cosa.
Título: Re: problema RF modulos de cebek
Publicado por: dogflu66 en 06 de Abril de 2008, 09:02:36
PD. Creo recordar que eso tambien me ha pasado a mi, si envio ordenes sencillas de uno o dos bytes si funciona,
pero si envio algo mas largo no funcionaba, y es por lo que te he dicho. Y si no usas el modulo usart pues seguramente
sera una tonteria en el programa que tendras que localizar.
Título: Re: problema RF modulos de cebek
Publicado por: MarcoPina en 06 de Abril de 2008, 13:48:08
Te refieres al registro de recepcion del USART no? el RCREG, ese es el que eso.

Dices que hay que vaciar ese registro cada vez que se use no? eso me quieres decir? porque se queda bloqueado y no permite que reciba mas bytes...no?.

Ok, mañana probare eso, y como me funcione te hago una estatua vamos XD.
Título: Re: problema RF modulos de cebek
Publicado por: dogflu66 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.
Título: Re: problema RF modulos de cebek
Publicado por: MarcoPina 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)
Título: Re: problema RF modulos de cebek
Publicado por: dogflu66 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.
Título: Re: problema RF modulos de cebek
Publicado por: MarcoPina 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
Título: Re: problema RF modulos de cebek
Publicado por: dogflu66 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.
Título: Re: problema RF modulos de cebek
Publicado por: MarcoPina 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.

Título: Re: problema RF modulos de cebek
Publicado por: dogflu66 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:
Título: Re: problema RF modulos de cebek
Publicado por: MarcoPina 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?.
Título: Re: problema RF modulos de cebek
Publicado por: dogflu66 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. :?
Título: Re: problema RF modulos de cebek
Publicado por: dogflu66 en 09 de Abril de 2008, 18:53:52
PD. Nunca he utilizado la configuracion a 9Bit.
Título: Re: problema RF modulos de cebek
Publicado por: MarcoPina 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.
Título: Re: problema RF modulos de cebek
Publicado por: dogflu66 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.                                                                                  
Título: Re: problema RF modulos de cebek
Publicado por: dogflu66 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
Título: Re: problema RF modulos de cebek
Publicado por: dogflu66 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).
Título: Re: problema RF modulos de cebek
Publicado por: MarcoPina 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.

Título: Re: problema RF modulos de cebek
Publicado por: dogflu66 en 12 de Abril de 2008, 19:44:22
El lenguaje que uso es el Basic del Pic Simulator IDE.

No se me ocurre como puedes hacer lo en Assembler.

Primero compongo la trama y luego la envío, de todas formas ten en cuenta
que mis trabajos no son exactamente igual al tuyo, ya que mi placa es la que
genera la trama directamente, ósea no la recibe por el puerto serie y luego
la envía al modulo de radio.
Título: Re: problema RF modulos de cebek
Publicado por: dogflu66 en 12 de Abril de 2008, 19:53:29
PD. De todas formas recién que termine algunos experimentos
(http://www.todopic.com.ar/foros/index.php?topic=14917.msg164031#msg164031),
y he comenzado con algo que trabaja parecido a lo que tu indicas, recibo datos por
el puerto serie y los envío por radio... a ver que sale... :mrgreen:
Título: Re: problema RF modulos de cebek
Publicado por: MarcoPina en 13 de Abril de 2008, 13:35:54
ok, a ver como me las apaño para que ande. Os tendre informado de mis avances o mis fracasos XD.

GRACIAS
Título: Re: problema RF modulos de cebek
Publicado por: dogflu66 en 13 de Abril de 2008, 21:09:32
Hola, he terminado unas pruebas y esto es lo que tengo hasta la presente:

Una placa conectada mediante el modulo USART al puerto RS232 del PC, con
una velocidad de comunicación 1200Baudios. Los datos que se escriben en
el teclado son enviados mediante el hyperterminal a la placa, y a su vez, la placa
los devuelve al hyperterminal para que los escriba en pantalla, ósea no
tengo activada la opción de eco en el hyperterminal. Este dato es
recibido y almacenado en un búfer serie y va siendo transmitido al modulo de
RF (Tx) por una emulación de UAR, ósea una UAR por soft. Los datos son mostrados
en el display de 2x16caracteres de la placa. Estos son cambiados de velocidad
y salen al aire a 2400Baudios. Los datos recibidos de forma inalámbrica por la
placa de RX son mostrados también en un LCD 2x16 caracteres,
En este caso si esta conectada la placa de RX al modulo USART del PIC.
He enviado archivos de texto por el hyperterminal y no he observado perdida de datos.
Ambas placas tienen un búfer de entrada de 80bytes por lo que pueden seguir mostrando
caracteres, después de terminar el PC de enviar datos al puerto serie. Las placas trabajan
con un reloj interno a 8Mhz (Pic16F88).

Cuando tenga todo el programa depurado y comentado intentare hacer funcionar de forma
inalámbrica un par de servos en la placa remota controlados por medio del teclado del PC.

La trama esta compuesta:
1º Byte = 0, basura o de apertura del puerto (mejor resultado obtenido con el 0)
2º Byte = 255, Byte de cabecera, sincronismo de trama o red.
3º Byte = dato, es el dato
4º Byte = checsun.lb, Byte menos significativo del checsun
5º Byte = checsun.hb, Byte más significativo del checsun

Serout RA4, 2400, 0, 255, dato, checsun.LB, checsun.HB

 :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-)
Título: Re: problema RF modulos de cebek
Publicado por: MarcoPina en 16 de Abril de 2008, 20:50:07
OK, muchisimas gracias.

En este momento, por falta de tiempo no he tenido mas remedio que dejar un poco de lado lo de la RF, pero me sigue interesando lo que dices, por lo que te agradezco mucho el esfuerzo que estas haciendo...gracias.

PD: Para evitar estos enrreos de lenguajes de programacion, tengo pensado hacer un cursillo o algo de C y intentar aprender por mi cuenta algo de basic (a ver si soy capaz XD). ¿tu usabas basic no? ¿lo aprendiste por tu cuenta con tutoriales?
Título: Re: problema RF modulos de cebek
Publicado por: dogflu66 en 17 de Abril de 2008, 17:05:26
Me encargaron un trabajo que tenia que ser forzosamente realizado en un tipo de Basic y desde entonces lo utilizo.

Desde luego el saber manejar assembler y C es una buena opcion hoy en dia, pero lo importante es tener la mente
abierta a cualquier otro lenguaje ya que no sabes en realidad que te puede tocar.