TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: NoSepComo en 24 de Noviembre de 2011, 10:01:47

Título: xbee maxstream con pic 18f45k20
Publicado por: NoSepComo en 24 de Noviembre de 2011, 10:01:47
Hola a todos,
estoy tratando de hacer una comunicación sencilla, por un lado tengo un pic 18f45k20 conectado a un xbee pro (simple, Dout con RX y din con tx) funcionando a 2400 baudios y lo que quiero es comunicarlo con otro modulo xbee conectado al PC mediante una placa de desarrollo de las que te da digi cunado adquieres el kit. Lo que intento es que cuando pulse un interruptor mande un simple "hola" al PC y lo recoja y verlo en el programa que da digi (X-CTU). El caso es que es imposible, no reacciona cunado envío datos y cuando recibe alguno se satura (creo que genera interrupciones de UART constantemente). Los módulos están funcionando en modo transparente y punto a punto.
Mi pregunta es si alguien a desarrollado con estos módulos y pic algún programa, yo desarrollo en CCS pero me valdrían ejemplos en cualquier compilador para comprender un poco como se hace correctamente por que estoy desesperando.
Gracias por vuestra ayuda.
Título: Re: xbee maxstream con pic 18f45k20
Publicado por: NoSepComo en 25 de Noviembre de 2011, 10:50:27
Hola otra vez, os comento mis mini-avances, he conseguido que se hablen, es decir que dos módulos se comuniquen, el problema que tenía y no veía es que uno estaba en modo API y el otro no, por eso no podía hacer nada.
Ahora tengo muchos otros problemas, como por ejemplo, que no se entiende lo que mando a uno en el otro, es decir, yo mando una h desde un módulo conectado al pic, y en el PC con la aplicación X_CTU se ve: "..", además cuandoenvío desde el PC algo al módulo del PIC, es como que se satura, se queda bloqueado, yo creo que es por que no para de recibir interrupciones de la UART, porque si comento el código del RDA sigue funcionando.
Alguien me podría echar una mano o pasar algún ejemplo de código.
Gracias de antemano.
Título: Re: xbee maxstream con pic 18f45k20
Publicado por: fabianjsm en 27 de Noviembre de 2011, 01:52:48
Si envías un dato y recibes dos, tal vez los puertos series estén configurados a velocidades distintas.
porque si comento el código del RDA sigue funcionando.
Viendo tu código, alguno con más experiencia podría percatarse del error.
Título: Re: xbee maxstream con pic 18f45k20
Publicado por: cristian_elect en 27 de Noviembre de 2011, 02:38:59
Yo con los xbee no tuve problemas, primero se prueba la comunicación de pic a PC con cable si funciona bien hay pruebo con los xbee.
Con un diagrama del circuito puede puede ver mejor el problema.
Título: Re: xbee maxstream con pic 18f45k20
Publicado por: NoSepComo en 28 de Noviembre de 2011, 05:56:50
Hola, como te dije, las pruebas ahora las estoy haciendo entre un módulo xbee mas un PIC y el PC con otro xbee y el entrenador que incluye el kit de digi.
En el PC, mediante el software X-CTU, envío un paquete al módulo enganchado al PIC con una palabra y ya. El pic en la rutina de la RDA, simplemente recoge lo que entra con un gets(recibido) (recibido es un vector de chars), y eso es lo que lo deja colgado al PIC.
Por que cuando hago la comunicación en otro sentido, del PIC al PC, va bie, no se satura, utilizo un puts("hola"), lo único que lo que le llega al PC son cosas muy raras, pero imagino que será la codificación o algo de eso.
Por eso si alguien me pudiese facilitar algún ejemplo de código le estaría muy agradecido.
Título: Re: xbee maxstream con pic 18f45k20
Publicado por: wannaky en 28 de Noviembre de 2011, 08:44:11
Hola NoSepComo, a mi me pasó lo mismo que a ti... resulta que de un día para otro me dejó de funcionar la comunicación... y probando los módulos resulta que solo recibía ".." tuve que cambiar los dos módulos porque estaban estropeados, yo creo que fue por culpa de una descarga que le di yo de estática, ya que los tenia por encima de la mesa del taller y no los cuidé mucho, fue comprar unos nuevos, ponerlos, y listo... funcionando.

Prueba de leer en la rutina del RDA con el fgetc(); en lugar de con el gets();, ya que el gets() creo que espera un 0 de final de trama y creo que el X-CTU no lo envía, y por eso se te queda colgado. Ten en cuenta que el fgetc() solo recibe un caracter...

Si no te funciona, prueba de intercambiarlos entre ellos, por lo que dices uno emite y recibe bien y el otro no...

Has probado de leer la configuración de los módulos con el X-CTU en la pestaña "Modem Configuration"?!?!?! prueba de leer la configuración y luego de escribirla...

Para que puedas descartar si los módulos están estropeados, a mi el X-CTU ni me los detectaba cuando le daba al botón "Test/Query"... si te detecta la versión de firmware del módulo y todo lo demás... seguro que funciona ok...

ya dirás que tal va...

Saludos...

PD: si ves que se continua quedando colgado en la rutina del RDA, te busco el código que utilicé y te lo subo...
Título: Re: xbee maxstream con pic 18f45k20
Publicado por: NoSepComo en 28 de Noviembre de 2011, 09:38:49
Hola de nuevo,
wannaky gracias por tu respuesta, he probado con el getc y almacenarlo en un entero y efectivamente ahora no se me cuelga, pero recibe cosas raras, porque hago un eco de lo que llega y es algo raro. Después, en cuanto a la transmisión , si pongo un putc o un puts llega siempre el punto que mencionas. Estoy desconcertado, voy a probar a intercambiar módulos a ver que sucede o a usar otros.
Gracias por vuestra ayuda, si alguien me pudiese adjuntar un codigo que funcione estaría bien.
Título: Re: xbee maxstream con pic 18f45k20
Publicado por: NoSepComo en 28 de Noviembre de 2011, 10:06:25
Hola otra vez, sigo frustrado con esto, a ver, he cambiado los módulos de posición y sigue en lo mismo, e igual si uso otros. En la rutina de recepción serie, simplemente con un getc() recojo lo que me mandan, lo almaceno en un char y lo reenvío con un putc, y para este caso, si que se reenvía un caracter aunque no coincide en muchos casos con lo que llega, pero lo raro es que si en el main, yo envío un putc del caracter que sea, solo llegan "." al xctu. No entiendo nada.
Gracias por vuestra ayuda por adelantado.
Título: Re: xbee maxstream con pic 18f45k20
Publicado por: NoSepComo en 29 de Noviembre de 2011, 09:14:00
Hola a todos, sigo con mi desesperación con este tema, os comento las experiencias que voy teniendo a ver si a alguien le resultan familiares o me puede echar una mano.
He probado en la rutina de interrupción a recibir con un getc() un simple caracter y retransmitirlo al xbee (con un putc()) que va con el PC, y en la mayoría de los caracteres el eco que retransmito es otro caracter distinto, pero no varía.
Sin embargo cuando yo utilizo el putc dentro del main para mandar un caracter, lo único que se recibe en el xctu es un "." o en hexadecimal "FF".
Asique no entiendo nada.
He probado el código entre dos PICs conectados en serie y no hay problema alguno con las comunicaciones.
Agradezco cualquier ayuda, un saludo.
Título: Re: xbee maxstream con pic 18f45k20
Publicado por: wannaky en 29 de Noviembre de 2011, 11:55:07
Hola NoSepComo, esta tarde pruebo de hacer el eco con el pic hacia el xbee, que me han operado de la rodilla y estoy algo distanciado del taller...  :5] :5] :5]
pero de todos modos prueba de cambiar el putc() por el printf()... pero que ya te digo que yo lo hice y no me resultó ningún problema de los que te da a ti...

saludos...
Título: Re: xbee maxstream con pic 18f45k20
Publicado por: wannaky en 29 de Noviembre de 2011, 17:52:07
Hola NoSepComo,

Aquí tienes un código que acabo de probar y funciona bien... el pic hace un eco de lo que escribes en el terminal del X-CTU y te vuelve a salir escrito en el terminal

Código: [Seleccionar]
#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,NOWRT
#use delay(clock=3686400)

#use RS232 (baud=4800, bits=8, parity=N, xmit=PIN_C6, rcv=PIN_C7)

int1 flag_rf;
char dato_rx;

#int_RDA
void RDA_isr()
{
   dato_rx=fgetc();
   flag_rf=1;
}

void main()
{
   delay_ms(50);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   flag_rf=0;

   while(true)
   {
      if(flag_rf==1)
      {
         flag_rf=0;
         printf("%c",dato_rx);
      }     
   }
}

Que oscilador estas utilizando?!?!?! te pregunto esto porque cuando estaba haciendo el código este he recordado que yo tuve problemas con la velocidad de comunicación cuando transmitía a 9600bps por utilizar un oscilador de 4MHz, miré el datasheet y ponía que con ese clock la tasa de error a 9600bps era cercana al 7%, lo puse a 4800bps y con un oscilador de 3.6864MHz (el fabricante te da una tasa de error del 0%) y todo fue de maravilla :-/ :-/ :-/

Prueba y ya nos dirás...

Saludos...
Título: Re: xbee maxstream con pic 18f45k20
Publicado por: NoSepComo en 30 de Noviembre de 2011, 08:39:46
Hola wannaky, muchas gracias por tu ayuda, con el fgetc() me funciona mejor, no se porque, que con el getc(), ahora ya recibo y envío cosas coherentes. Tambien tendrá que ver que ahora trabajo a 2400 en vez de a 9600.
Ahora me falta pulir alguna cosilla, porque estoy intentando comparar los caracteres que recojo con un vector de chars pero aun no he conseguido hacerlo bien, de todas formas ya estoy mucho más tranquilo, gracias por vuestra ayuda, si me atsco otra vez ya volveré por aquí a dar la coña ;).
Gracias.
Título: Re: xbee maxstream con pic 18f45k20
Publicado por: Leonid@s en 09 de Diciembre de 2011, 13:33:51
Nosepcomo sera que porfavor puedes subir tu codigo para que todos podamos aprender de el?

Gracias  :lol:
Título: Re: xbee maxstream con pic 18f45k20
Publicado por: wannaky en 10 de Diciembre de 2011, 09:17:25
Leonid@s, el código de NoSepComo lo único que hacía es enviar un carácter vía seria por el XBee, y el PIC hacía un eco y retornaba el mismo carácter.

este es el código que hace eso, solo sirve para verificar que hay comunicación entre los módulos y es correcta...
Código: [Seleccionar]
#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,NOWRT
#use delay(clock=3686400)

#use RS232 (baud=4800, bits=8, parity=N, xmit=PIN_C6, rcv=PIN_C7)

int1 flag_rf;
char dato_rx;

#int_RDA
void RDA_isr()
{
   dato_rx=fgetc();
   flag_rf=1;
}

void main()
{
   delay_ms(50);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   flag_rf=0;

   while(true)
   {
      if(flag_rf==1)
      {
         flag_rf=0;
         printf("%c",dato_rx);
      }     
   }
}


que necesitas tú exactamente?!?!?!

Saludos...
Título: Re: xbee maxstream con pic 18f45k20
Publicado por: NoSepComo en 12 de Diciembre de 2011, 09:43:31
Hola. Tengo un problemmilla al comunicarme con el x-ctu, yo estoy haciendo un programita que recoja lo que mando, entonces voy llenando un buffer de chars, caundo ese buffer llega a tres posiciones rellenas lo comparo con otra palabra que yo tengo almacenada en otro buffer para ver si coincide, sin embargo no hace nada, y es que creo que manda mas caracteres el xctu cuando utilizas el send, pongo el código para que lo veáis a ver si se entiende mejor:
dentro de la isr:
    if(kbhit())
    {
      recibido = fgetc();
      delay_ms(20);
                i++;
    }
        if(i >= 2)
   {
      bandera = 1;
      for(i=0;i<3;i++)
      {
         if(recibido != clave)
         {
            bandera = 0;
         }
      }
      i = 0;
      if(bandera == 1)
      {
         printf("ok");
      }
      else
      {
         printf("no");
      }
      limpia();
   }
Título: Re: xbee maxstream con pic 18f45k20
Publicado por: fabianjsm en 12 de Diciembre de 2011, 10:14:43
Supongo que desaparecieron los corchetes porque 'codigo != clave' no es la forma de comparar cadenas  :oops: Utiliza GeSHi para insertar código.
Si todo ese código  esta dentro de la rutina que atiende la interrupción, te pierdes datos mientras se procesa el código, printf por ejemplo consume mucho recurso.
El código de wannaky después de leer el byte lo señala con un flag. Al detectar el flag lo guardas rápidamente y después lo procesas.
Con la ISR del codigo de wannaky algo como esto funciona en tu main:
Código: C
  1. for(;;)
  2.     if(flag_rf && dato_rx == 'x') {
  3.         flag_rf=0;
  4.         printf("ok");
  5.     }
Título: Re: xbee maxstream con pic 18f45k20
Publicado por: wannaky en 12 de Diciembre de 2011, 10:35:15
NoSepComo te recomiendo que dentro de la isr hagas las menos tareas posibles, ya que si pones delay_ms, printf, etc... todo esto hace que el micro esté mucho tiempo dentro de la interrupción, y piensa que mientras estés en la interrupción, si te llega otro carácter, no te vas a enterar.

Te recomiendo que hagas algo así...

Código: [Seleccionar]
void RDA_isr()
{
   if (kbhit())
   {
      dato_rx=fgetc();
      if(dato_rx=='Z')
      {
         bandera=1;
         cadena_rx[incremento_cadena]=dato_rx;
         incremento_cadena=0;
      }
      else
      {
         cadena_rx[incremento_cadena]=dato_rx;
         incremento_cadena++;
      }
   }
}

este código almacena en "cadena_rx" todo lo que llega por el serie hasta que recibe una 'Z' que yo he asignado como carácter de final de trama. Una vez ha recibido la 'Z' pone bandera=1, y es en tu main donde has de comparar las cadenas y hacer todo lo que tengas que hacer, pero no dentro de la interrupción.

dentro de tu main, has de tener algo así...

Código: [Seleccionar]

while(TRUE)
{
     if(bandera==1)
     {
          bandera=0;
          incremento_cadena=0;
     
          (...) aquí comparas tus cadenas de caracteres y lo que tengas que hacer
     }
}



Saludos...
Título: Re: xbee maxstream con pic 18f45k20
Publicado por: NoSepComo en 12 de Diciembre de 2011, 12:54:22
Gracias por vuestras respuestas, los corchetes se perdieron efectivamente.
Probaré a hacerlo fuera de la rutina de interrupción a ver que pasa y luego os lo cuento.
Un saludo.
Título: Re: xbee maxstream con pic 18f45k20
Publicado por: NoSepComo en 12 de Diciembre de 2011, 13:20:25
Hola otra vez, he hecho el código fuera de la rutina, en el bucle infinito y ahora funciona muy bien.
Muchas gracias por vuestra ayuda :).
Ahora intentaré mandarle comandos ya como ultima fase a ver que hace.