TODOPIC
Otros Microcontroladores / Dispositivos programables => Microcontroladores ARM => Mensaje iniciado por: edusito en 12 de Octubre de 2011, 12:48:28
-
Hola a todos
Estoy trabajando con un MCU de Freescale (MCF51JE), lo tengo conectado a un moden TC63i de CInterion. Tengo un programa embebido en el MCU que procesa cierta informacion y los resultados los necesito enviar a traves del SCI1 que esta conectado al modem para que este a su vez los envie a traves de la red GPRS. El prgroama esta casi listo pues las pruebas resultaron OK. Asi mismo configuré e hice las pruebas de envio por el modem a traves del Hyperterminal (manualmente). Lo que necesito saber ahora es como enviar los comandos AT al modem pero desde el lenguaje C. Para el desarrollo utilzo CodeWarrior 6.3.
Espero que alguien me pueda ayudar...
Saludos
Edu
-
Hola, tu pregunta es un poco amplia. Si no tenes idea de como comenzar te recomiendo el uso del Process Expert que esta incluido dentro del CodeWarrior. En este tenes que seleccionar un "beam" que es un objeto que arma código automaticamente, en tu caso debes elegir el beam Asynchro Serial que es simplemente una UART. En forma visual tendrás todos los parámetros para configurarla, baud, buffers, modos, etc, etc. Una que tienes eso ya puedes enviar y recibir datos de la uart interna del micro con el módulo.
Saludos !
-
La comunicacion serial no es el problema que tengo, puedo enviar y recibir datos a traves del SCI1 y SCI2, el problema es que no se como enviar los comandos AT al modem. El modem lo tengo conectado al SCI1, necesito enviar el siguiente comando "AT^SICS=0,contype,gprs0" y una serie de comandos para inicializar la comunicacion GPRS, estoy utkizando printf("AT^SICS=0,contype,gprs0"); luego envio putchar(0x0d); pero el modem no se configura completamente, solo recepta la primera linea de comandos y el resto no sucede nada, ni siquiera me sale un mensaje de error.
Saludos
Edu
-
Hola, ok. Fijate si podes enviar el comando asi:
printf("AT^SICS=0,contype,gprs0\n" );
Saludos !
-
se envia sin problemas, no sale ningun error pero de esa forma no se configura ni siquiera la primera linea del modem.... Tendran algo que ver los tiempo?? Cuando ejecuto alguna instruccion en Hyperterminal mediante comandos AT el modem me devuelve siempre "OK", esta respuesta del modem me estará causando algun problema???
Edu
-
Hola, normalmente a los modem hay que "prenderlos", no conozco el Cinterion, pero casi todos los módulos tienen un circuito de encendido ( es un pin de misno ). Yo normalemente en el inicio envió ATE0 que elimina el eco local. Antes de empezar a configurarlo porque no envías solamente AT y esperas que te devuelva OK
Saludos !
-
Hola, no he probado eliminando el eco local, Lo que si te puedo decir es que con la forma que tenia al principio se configura, pero no se ejecutan todas las configuraciuones que le envío por el SCI, no tengo idea de porq pasa esto. Voy a eliminar el eco local y te aviso como me fue..
Saludos
-
Hola, eliminé el eco local (ATE) pero sigue funcionando igual... La velocidad (baudrate) que estoy utilizando es de 115200 tanto para el micro como para el modem, esto me podria general algun inconveniente??
Saludos
-
Hola, en primer lugar deberías verificar que un comando AT sea aceptado por el módulo, esto se verifica recibiendo el la respuesta OK. Por cada comando enviado al módulo debes si o si esperar la respuesta, esto es para darle tiempo al módulo para que procese el comando. Algunos comandos pueden tardar varios segundos. Normalmente casi todos los módulos tienen auto baudrate. Pero insito proba solamente enviando un AT\n.
Saludos !
-
Si, creo que tienes razon, las demas lineas no se estan ejecutando por el tiempo de respuesta del modem.. como hago para leer la respuesta del modem?, debo utilizar el comando scanf("%s",&respuesta) o algo parecido???? Existe alguna otra forma de leer la respuesta del modem???
No se si esto esta bien, por favor corrigeme:
char *respuesta;
printf("at^sics=0,conType,gprs0"); (esta linea si se ejecuta en el modem)
putchar(0x0d);
scanf("%s", &respuesta);
-
Hola, pude ser ... no uso printf y scanf para leer /escribir por la UART, uso mis propias funciones. Podes ahorrarte el ultimo putchar escribiendolo como te comente antes.
Saludos !
-
Aqui esta la rutina que uso con el scanf:
if (SCI1S1_RDRF)
rec_char = SCI1D;
SCI1C2_RE = 1; //Habilito SCI1 para Rx
while(!SCI1S1_RDRF){}; //espero hasta que ingrese un caracter
rec_char = (char)SCI1D;
return (char) rec_char;
-
Hola, tanto la función printf como scanf terminan apuntando a dos funciones para enviar o recibir los caracteres. En en el caso de scanf termina llamando a la función TERMIO_GetChar. Esta por defecto esta definida en el módulo \CodeWarrior\lib\hc08c\src\termio.c podes pegarle una mirada de como trabaja.
Saludos !
-
Hola, gracias por el tip, la el problema que tenia con el printf es que al final le puse \r en lugar de \n, con ese cambio me evite estar usnado putchar(0x0d);.... Ya puedo enviar los comandos AT al modem, el problema que tengo ahora es que debo implementar un tiempo de espera luego de enviar cada comando AT. Implemente una funcion sencilla en base a la fercuencia del crystal que estoy utilizando, pero lo raro del asunto es que a veces el delay funciona y otras veces no... Espero que el problema no sea con el micro, de todas menaras envío el codigo utilizado para ver si existen errores y me corrigan ya sea con el tipo de datos o cualquier cosa por favor.
void delay(unsigned long tiempo)
{
unsigned long limite=0;
while (limite < tiempo)
limite++;
}
printf("at^siso=9\r");
delay(500000); //esta instruccion debe ir luego del envio de caada comando
Gracias
-
Hola, para implementar funciones de delay podes hacer dos cosas.
- Usar un timer y programarlo para que te interrumpa en forma periódica y de esa manera contar los "ticks"
- Usar el Process Expert, cuando seteas los parametros de clock, el mismo te genera código para una función llamada us_delay que produce 100 us de delay utulizando instrucciones del micro
Saludos !
-
Nunca he utilizado process expert en el desarrollo de un programa, una vez lo utilice como prueba y creo haber visto esa funcion.. Si lo utilizo puedo tener algun conflicto en mi programa??
-
Hola, yo cuando creo un proyecto nuevo creo dos carpetas, standalone, llamo a mi proyecto real, y otro Process Expert donde creo el mismo proyecto pero con el expert. Lo uso mucho para setear parámetros de inicialización de clock y demás coas, después copio el código. Contestando a tu pregunta, crea un proyecto alternativo y configura las cosas ahí y luego Ctrl-C y Ctrl-V en tu código !
Saludos !
-
Hola gracias por tu consejo, no lo habia pensado de esa manera... voy a intentarlo y luego te contaré como me fue..
Saludos
-
Hola, suerte con eso !!! y un placer poder darte una ayudita.
Saludos !
-
Aqui estoy de vuelta.
Gracias a tu ayuda he podido conectarme con el modem y enviar datos al mismo. Pero ahora tengo otro problema, he estado realizando la comunicacion del micro con el modem sin utilizar el control de flujo y he estado manejando los errores recibidos del modem por medio de programacion, pero muchas veces se presentan nuevos errores y tengo que estar modificando el programa dentro del micro para que no sucedan cosas inesperadas y este deje de enviar los datos.
Ahora quiero utilizar el control de flujo por hardware, pero no estoy seguro de que pines del micro debo utilizar para que actuen como CTS y RTS, tengo una duda si debo utilizar los SPIs o los GPIOs. El micro que estoy utilizando es un MCF51JE256 de freescale.
Gracias por tu ayuda
Saludos
-
Hola, disculpa por la tardanza de la respuesta. El micro en cuestión ( MCF51JE256 ) no posee control de flujo por hardware asi que lo deberás simular por hardware. Hay varias maneras de hacerlo y la web seguramente muchos ejemplos. La que uso yo con módulos GPRS es esta. La linea que maneja el RTS es un simple GPIO, esa linea, depende del módulo, siempre la coloco en estado ON que es normalmente falso indicandole al modulo que siempre me puede enviar datos. La otra linea involucrada en el protocolo es CTS, esa linea es conveniente conectarla a una linea GPIO que tenga la posibilidad de generar interrupciones por flancos, en los FreeScale se logra eso usando las lineas del KeyBoard. Para el punto de vista del micro es una linea de entrada, que genera interrupción cuando se produce un flanco decreciente, es decir pasa de 1 a 0. Es necesario monitorear esa linea en el caso de que tengas que subir muchos datos al GPRS ya que es la única mamera de que el módulo te avise que este listo cuando estas conectado, siempre hablando del modo llamado transaparente, que el cual lo que escribís por el serie del módulo sale directamente al TCP. Suponiendo que tengas las trasniciones por interrupción, cosa que es lo recomendable, antes de transmitir checkeas el valor de esa entrada que este en 0, eso te indica que el módulo puede recibir el dato, y lo colocas en el buffer de transmición. Si el valor de la entrada es 1 ( módulo ocupado ) colocas en valor en un buffer temporario y salis de la interrupción. Cuando el módulo vuelva a estar desocupado, la linea pasara de 1 a 0 produciendose el disparo de la interrupción por flanco de bajada, entonces tomas el valor del buffer temporario y lo transmitis, obvio que hay que colocar flags para controlar la sincronicidad de todo esto pero esta es la idea.
Saludos !