Autor Tema: Envío comandos AT en Codewarrior 6.3  (Leído 8074 veces)

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

Desconectado edusito

  • PIC10
  • *
  • Mensajes: 14
Envío comandos AT en Codewarrior 6.3
« 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

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Envío comandos AT en Codewarrior 6.3
« Respuesta #1 en: 12 de Octubre de 2011, 14:39:55 »
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 !

Desconectado edusito

  • PIC10
  • *
  • Mensajes: 14
Re: Envío comandos AT en Codewarrior 6.3
« Respuesta #2 en: 12 de Octubre de 2011, 16:01:34 »
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

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Envío comandos AT en Codewarrior 6.3
« Respuesta #3 en: 12 de Octubre de 2011, 16:06:11 »
Hola, ok. Fijate si podes enviar el comando asi:

Código: C
  1. printf("AT^SICS=0,contype,gprs0\n" );

Saludos !

Desconectado edusito

  • PIC10
  • *
  • Mensajes: 14
Re: Envío comandos AT en Codewarrior 6.3
« Respuesta #4 en: 12 de Octubre de 2011, 16:20:41 »
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

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Envío comandos AT en Codewarrior 6.3
« Respuesta #5 en: 12 de Octubre de 2011, 16:36:21 »
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 !

Desconectado edusito

  • PIC10
  • *
  • Mensajes: 14
Re: Envío comandos AT en Codewarrior 6.3
« Respuesta #6 en: 12 de Octubre de 2011, 16:56:06 »
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

Desconectado edusito

  • PIC10
  • *
  • Mensajes: 14
Re: Envío comandos AT en Codewarrior 6.3
« Respuesta #7 en: 12 de Octubre de 2011, 17:17:45 »
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

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Envío comandos AT en Codewarrior 6.3
« Respuesta #8 en: 12 de Octubre de 2011, 17:26:39 »
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 !

Desconectado edusito

  • PIC10
  • *
  • Mensajes: 14
Re: Envío comandos AT en Codewarrior 6.3
« Respuesta #9 en: 12 de Octubre de 2011, 17:45:43 »
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);

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Envío comandos AT en Codewarrior 6.3
« Respuesta #10 en: 12 de Octubre de 2011, 18:03:46 »
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 !

Desconectado edusito

  • PIC10
  • *
  • Mensajes: 14
Re: Envío comandos AT en Codewarrior 6.3
« Respuesta #11 en: 12 de Octubre de 2011, 18:32:54 »
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;

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Envío comandos AT en Codewarrior 6.3
« Respuesta #12 en: 13 de Octubre de 2011, 11:55:48 »
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 !

Desconectado edusito

  • PIC10
  • *
  • Mensajes: 14
Re: Envío comandos AT en Codewarrior 6.3
« Respuesta #13 en: 14 de Octubre de 2011, 17:50:53 »
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

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Envío comandos AT en Codewarrior 6.3
« Respuesta #14 en: 14 de Octubre de 2011, 17:57:31 »
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 !