TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: 1Roland1 en 29 de Diciembre de 2010, 17:47:53

Título: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 29 de Diciembre de 2010, 17:47:53
Buenas tardes compañeritos.

Estoy realizando un proyecto que consiste en counicar un pic con un nokia 3220 para por medio de sms controlar dispositivos. La comunicacion entre el pic y el celular lo he realizado sin problema puedo generar llamadas o enviar sms desde el pic por medio de este celular y con eso realizar varias aplicaciones. El problema que se me presenta es a la hora de tratar de leer un sms con el pic, estoy programando con ccs pcwhd por eso recurro a ustedes para ver si me pueden orientar con este asunto. Por ejemplo si yo mando un sms con la palabra "ENCENDER"quiero que el pic lea esta palabra y realice la acción del caso.

Saludos Cordiales.
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 29 de Diciembre de 2010, 18:34:52
Hola.

AT-PDU? AT-TEXTO? FBus? ....

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: ppyote en 29 de Diciembre de 2010, 20:49:48
Hola.

AT-PDU? AT-TEXTO? FBus? ....

Saludos
Perdonad el offtopic... MLO,sabes de todo jejeje
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 29 de Diciembre de 2010, 21:10:19
Casi todo lo he aprendido aca  :lol:

Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 05 de Enero de 2011, 20:34:30
Hola.

AT-PDU? AT-TEXTO? FBus? ....

Saludos

Hola compañeros

Deseandoles un Feliz año 2011 y que todos sus proyectos se realicen.
Hola MLO

Estoy usando la comunicacion con el celular por comandos AT en modo de texto, los comandos que se le envian al cel para leer los sms los tengo claro. Mi problema es a la hora de recibir la cadena de caracteres con el pic programando en ccs. Antes de meterme a leer los sms del cel quiero recibir la palabra RING que transmite el cel al realizarle una llamada para de este modo saber si recibe normalmente el pic, pero no consigo recibir esta palabra, no se si me pueden ayudar.

int ring[]="RING";
char string[5]=" ";

if(kbhit()){
gets(string);
]
if (strcmp(string,ring)==0){
output_high(pin_B5);
}

mas o menos ese es el codigo que se utiliza para hacer esto, en proteus tecleando caracter por caracter y al final el CR recibe normal y funciona perfecto, el problema viene cuando copio la palabra RING y lo pego en la ventana del virtual terminal y rapidamente le doy enter alli no reconoce la palabra y como que se cuelga el pic.

Solicito sugerencias.
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 07 de Enero de 2011, 14:59:57
Hola.

El string RING es para identificar la llamada entrante, para el SMS entrante debes usar otro comando.

Usa mejor la interrupción serial para recibir los strings, yo nunca he usado la función gets(), si no la función getc() y recibo byte a byte y lo almaceno en un buffer (lento pero seguro  :lol: )

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 07 de Enero de 2011, 18:33:55
Hola.

El string RING es para identificar la llamada entrante, para el SMS entrante debes usar otro comando.

Usa mejor la interrupción serial para recibir los strings, yo nunca he usado la función gets(), si no la función getc() y recibo byte a byte y lo almaceno en un buffer (lento pero seguro  :lol: )

Saludos


Hola MLO

Gracias por tu respuesta.

Si, lo que hago con RING es solo para  probar la recepcion en el pic antes de empezar a trabajar con los sms, quiero que cuando reciba esta palabra se prenda un led y asi comprobar que la recepcion esta perfecta, hecho esto podré empezar a trabajar con los comandos.
Te cuento que he probado recibir la cadena con getc() pero como que se me bloquea el pic. Si tu podrías con un ejemplo explicarme como hacer esto te agradeceria muchisimo ya que esto resulto un dolor de cabeza, no pense que iba a tener problemas con esto. Antes programaba en Basic y recientemente migre a este lenguaje porque es mucho mejor mas eficiente.

Saludos.

Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 07 de Enero de 2011, 22:37:02
Hola.

Sería algo así:
Código: C#
  1. #int_RDA
  2. void Serial_isr(void)
  3. {    
  4.         DatoRx=0;
  5.         if(kbhit())
  6.         {
  7.                 Bufer[ContBufer++]=getc();
  8.         }
  9. }

A medida que llegan los bytes se van almacenando en Bufer.

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 08 de Enero de 2011, 00:07:43
Gracias MLO.

Segun tu consejo lo hice asi:

Algo que este mal ? Si Puedes hacer alguna modificacion al codigo te agradeceria, ya lo compile no da errores y lo voy a simular en proteus

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 08 de Enero de 2011, 01:21:54
Hola.

Hay que tener en cuenta que a cada nuevo envío, hay que inicializar el contador i. El resto parece correcto.

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 08 de Enero de 2011, 11:57:03
Hola MLO

Gracias por tus respuestas.

Si la verdad no habia caido en cuenta lo del contador i, ya corregi eso y en la simulacion funciona perfecto. Ahora lo voy a probar ya en la practica con el celular. Como en este caso el cel solo va a transmitir esa palabra cuando le realicen una llamada funcionaria sin problema. Así quedó el codigo final:

Ahora en pruebas anteriores note que el cel en ASCII tx la palabra RING al hacerle una llamada, pero si cambio el terminal para visualizar en formato HEX me trnsmite 0D 0A 52 49 4E 47 0D 0A 00 00 con lo que creo tendria que filtrar y dejar solo 52 49 4E 47 que es en si la palabra RING.
Bueno voy a hacer las pruebas y muchas gracias por tu ayuda. Te contare como salieron las pruebas.

Saludos.
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 08 de Enero de 2011, 22:29:18
Hola.

Lo que te esta enviando el módem o el celular son los ASCII \r y \n, ellos también se van a guardar en el bufer. La idea sería cambiar la rutina de la interrupción para que solo guarde los bytes diferentes a \r y \n, se podría hacer con un if.

Saludos

Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 09 de Enero de 2011, 12:12:03
Hola.

Lo que te esta enviando el módem o el celular son los ASCII \r y \n, ellos también se van a guardar en el bufer. La idea sería cambiar la rutina de la interrupción para que solo guarde los bytes diferentes a \r y \n, se podría hacer con un if.

Saludos


Hola MLO

Gracias por tus respuestas.

Si la verdad había pensado hacer algo asi para filtrar esta palabra, todavia no hago las pruebas por falta de tiempo. Cuando las haga te contare como me fue.

Gracias MLO por tu ayuda.

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 10 de Enero de 2011, 00:08:51
Hola MLO

Te molesto de nuevo.

Para consultarte cual es tu opinion del siguiente codigo para discriminar los caracteres que no necesito y filtrar en este caso la palabra RING. LO pienso hacer así, tu que opinas... Te rogaría que modifiques el código si hay alguna observacion:

Gracias MLO
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 10 de Enero de 2011, 11:30:24
Hola.

Pues, yo lo haría con un if
Código: C#
  1. #int_RDA
  2. void Serial_isr(void)
  3. {    
  4.         c=0;
  5.         if(kbhit())
  6.         {
  7.         c=getc();
  8.                 if(c!='\r' && c!='\n')
  9.                         buffer[i++] = c;
  10.         }
  11. }

Saludos


Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 10 de Enero de 2011, 12:11:34
Hola.

Pues, yo lo haría con un if
Código: C#
  1. #int_RDA
  2. void Serial_isr(void)
  3. {    
  4.         c=0;
  5.         if(kbhit())
  6.         {
  7.         c=getc();
  8.                 if(c!='\r' && c!='\n')
  9.                         buffer[i++] = c;
  10.         }
  11. }

Saludos

Hola MLO.

Gracias por tu ayuda.
Voy a tomar en cuenta esta sugerencia ya que tengo problemas para filtrar la palabra.

Saludos.


Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 10 de Enero de 2011, 12:14:50
Una pregunta MLO.

Que ganaría si pongo un crystal de 20MHz en vez de utilizar el de 4MHz ?
 
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 10 de Enero de 2011, 12:20:27
Hola.

Con un cristal de 4MHz cada instrucción que haga el PIC tomará 1uS, mientras que con un cristal de 20MHz cada instrucción tomará 200nS. Ganas tiempo de proceso, ya que podrás hacer mas instrucciones.

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 10 de Enero de 2011, 12:52:17
Hola.

Para borrar el buffer de recepción puedes usar la instrucción memset()

Saludos

Título: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 10 de Enero de 2011, 14:46:38
Bueno gracias a la ayuda de MLO logre sacar el programa para leer una palabra del celular en este caso "RING" que es la palabra que tx el modem del cel al realizarle una llamada.

Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 10 de Enero de 2011, 15:01:43
Hola.

Pues, la idea es salir lo mas rápido posible de la interrupción, el printf y la comparación sería recomendable hacerla en el main.

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 11 de Enero de 2011, 00:01:24
Hola MLO

Si la verdad que se debe hacer eso porque en la simulacion funciona perfecto, pero ya en la practica cuando recibe el dato no sale de la interrupcion como que se queda colgado y no realiza ninguna accion
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 11 de Enero de 2011, 19:30:53
Hola

Finalmente con las sugerencias de MLO el programa quedó asi:

En proteus funciona perfecto, pero al programarlo en el pic tengo algunos problemas todavía. Tengo que adaptar los niveles de voltaje del cel a los del pic ya que al conectar el pic con el cel no trabaja el pic supongo porque el tx del cel me bota 2.8v y por eso el pic no funciona ya que este necesita idealmente 5v.
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 11 de Enero de 2011, 23:03:06
Hola.

Para adaptar los voltajes yo uso un diodo Zener de 3.6v para el pin Tx del PIC y un 74HC125 para el Tx del celular y funca bien  ;-)

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 14 de Enero de 2011, 14:34:20
Hola.

Para adaptar los voltajes yo uso un diodo Zener de 3.6v para el pin Tx del PIC y un 74HC125 para el Tx del celular y funca bien  ;-)

Saludos

Hola MLO

Me podrías pasar un esquema para ver como adaptas los voltajes, te agradeceria un mundo. Para el pin RX del cel no tengo problemas, uso un zener de 3.1v y recibe perfecto, para transmiir del cel al pic tengo problemas, habia pensado hacerlo con un par de transistores pero no se que tan confiable sea.

Saludos.
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 14 de Enero de 2011, 15:36:34
Hola.

Yo lo hago con el buffer 74HC125 .... la salida del Tx del celular va a la entrada de un bufer del 74HC125 y la salida del bufer la conecto al Rx del PIC. Lo paso por 2 buferes por si acaso ... jeje

(http://img703.imageshack.us/img703/7154/celpic.png)

Saludos

Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 14 de Enero de 2011, 20:24:26
Hola MLO

Gracias por tu colaboración.

Es extraño esto porque cuando programaba en BASIC estos mismos programas no tenia estos problemas, del Tx del cel lo conectaba directamente al pic y funcionaba sin problemas, bueno espero que soluciones estos problemas siguiendo tus consejos. Muchas gracias.

Saludos.
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 16 de Enero de 2011, 12:23:02
Hola

Definitivamente por mas que en la simulacion funciona perfecto, en el momento de conectar el pic con el cel y al realizarle la llamada como que se cuelga, no realiza la accion que deberia realizar, no se que pasa
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 16 de Enero de 2011, 12:55:32
Hola.

El baud rate si esta configurado con el mismo valor en ambos dispositivos?

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 16 de Enero de 2011, 20:08:52
Hola.

El baud rate si esta configurado con el mismo valor en ambos dispositivos?

Saludos

Hola MLO

Si todo está correcto, el cel es autobauding, los niveles de voltaje del cel y el pic están perfectamente acoplados pero al momento de realizar la llamada el cel tx RING y el pic como que entra a realizar el proceso de la interrupción pero no sale de él, como que no recibiera jamás el 0x0D y ya me está desesperando este asunto porque en vase a esto tengo que realizar mi tesis y no consigo recibir bien el dato, la parte de transmision no tengo problema por eso te digo que la velocidad y los niveles de voltaje estan bien. En BASIC no tenía problema al realizar esto, creo voy a tener que volver a BASIC :-(
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 17 de Enero de 2011, 12:56:46
Hola

Será que si aumento la velocidad del procesador a 20Mhz ya que lo he probado a 4Mhz y disminuyo la velocidad de tx/rx de datos que se yo a unos 2400 bauds será ese el problema ? He probado con el nokia 3220, siemens A71, A56 y nada de nada :-(
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 17 de Enero de 2011, 13:16:03
Hola.

Yo trabajo a 12MHz ... prueba a ver como te va.

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 17 de Enero de 2011, 18:40:14
Hola.

Yo trabajo a 12MHz ... prueba a ver como te va.

Saludos
Gracias MLO

Pues si voy a probar con 20Mhz no me voy a dar por vencido, todo esto en hex compone la palabra RING : 0D0A52494E470D0A

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 17 de Enero de 2011, 20:27:22
Hola.

Si, es tal como lo envía el módem. Yo lo que hago es discriminar con if, tal como lo postee anteriormente.

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 17 de Enero de 2011, 21:53:35
Código: C++
  1.  
Hola.

Si, es tal como lo envía el módem. Yo lo que hago es discriminar con if, tal como lo postee anteriormente.

Saludos
Hola MLO

Si, esta tarde me puse a reaizar pruebas directamente en formato hex y determine que no coje el 0x0D sino el ultimo dato 0x0A asi que modifique el programa y ya logre recibir el dato, para probar lo hice asi:

 :P

Siepre coje el ultimo dato voy a seguir tu consejo y discriminar con un if pero lo bueno que ya consegui la recepcion

Gracias MLO

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 18 de Enero de 2011, 11:38:30
Hola

Ya trate de hacerlo con un if pero no funciona, asumo que lo que sucede es que al recibir el 0D y como luego del 0D hay un 0A ingresa otra vez a la interrupcion, el micro entiende que es un nuevo dato que está ingresando y por esa razón ingresa nuevamente a la interrupción. No sé como corregir eso pero bueno tocará hasta mientras hacer la comparacion de esta palabra RING como RING\r
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 18 de Enero de 2011, 12:10:59
Hola.

Y si sabes que el envío comienza y termina con \r y \n, se puede gestionar el flag de aviso con el char \n no? al primer envío no va a procesar el comando porque el bufer de recepción rstá vacío, pero a la segunda llegada del char, el bufer esta lleno, por lo que se puede procesar el comando.

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 18 de Enero de 2011, 16:40:46
Hola.

Y si sabes que el envío comienza y termina con \r y \n, se puede gestionar el flag de aviso con el char \n no? al primer envío no va a procesar el comando porque el bufer de recepción rstá vacío, pero a la segunda llegada del char, el bufer esta lleno, por lo que se puede procesar el comando.

Saludos
Hola MLO

Se me presentó otro problema al intentar hacer el mismo programa pero con el PIC 16F628A comprobe que recibe y procesa bien el dato, osea realiza la comparación del dato que llega de manera exitosa, pero no me enciende ninguna salida, ya trabaje tanto con el osc interno como externo pero no enciende no se que podrá ser....

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 19 de Enero de 2011, 18:33:03
Hola.

Tengo problemas con el pic 16F628A ya que al recibir el dato OK o RING no me funcionan las salidas RA1 y RA2. En la simulación funciona perfecto y comprobé que los datos son recibidos y procesados adecuadamente pero no se encienden los leds. Voy a poner todo el codigo y si ven algun error o que falte algo les rogaría que me lo hagan saber:

Debo agregar que he trabajado tanto con el oscilador interno como con crristal de 4MHz pero no se encienden los leds en RA1 y RA2. Este ptograma funciona perfecto con el pic 16F877A.
No hay problemas con la fuente porque he probado estos pines al principio después del output_a(0x00);
Me interesa hacer un proyecto de una alarma con este pic ya que tengo 3 de estos y no quiero desperdiciarlos.

Saludos cordiales.
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 20 de Enero de 2011, 14:06:08
Hola

Bueno, el problema esta solucionado parcialmente ya que luego de nuevas pruebas al recibir el dato mande a encender todos los pines del puerto a y b y determinar cuales encienden y cuales no con lo que observe que del puerto A solo encendieron los pines A0 A2 A3 A6 y A7 y del puerto B encendieron todos
por lo que voy a utilizar los pines que se encendieron y los otros del puerto a los doy por muertos no se a que se debe que no encienden pero lo bueno es que los demás estan OK

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 20 de Enero de 2011, 17:10:26
Hola.

Probaste con otro PIC? no vaya y sea que este malogrado jeje

saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 20 de Enero de 2011, 23:00:54
Hola MLO

Si probé con otro pic y sucede lo mismo, pero bueno usaré los pines que encienden je je :-)

Ahora MLO abusando de tu confianza tengo otra duda, quiero agregarle al programa una interrupción externa para utilizar al máximo en lo posible los recursos de este pic, lo intenté de esta forma:

INT_RDA{
------------
-----------
}
INT_EXT{
-----------
-----------
}
void main(void){
------------------
------------------
ext_int_edge(H_TO_L);
enable_interrupts(int_ext);
enable_interrupts(int_rda);
enable_interrupts(GLOBAL);
--------------------
-------------------
}

Pero no me funciona la int_rda, no se como sería el procedimiento para utilizar las dos interrupciones; por eso te pido me ayudes con este nuevo problema que se me presenta.

Saludos.
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 20 de Enero de 2011, 23:14:18
Hola.

Pues  :? me parece raro que no te funcione, normalmente uno asigna de esa manera las interrupciones:
Código: CSS
  1. #int_RDA
  2. void Serial(void)
  3. {
  4. ...
  5. }
  6.  
  7. #int_EXT
  8. void Pulsos(void)
  9. {
  10. ...
  11. }

Puede ser un bug del compilador, CCS tiene sus cosas. Postea el código completo para ver que sucede.

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 20 de Enero de 2011, 23:31:38
Hola.

Pues  :? me parece raro que no te funcione, normalmente uno asigna de esa manera las interrupciones:
Código: CSS
  1. #int_RDA
  2. void Serial(void)
  3. {
  4. ...
  5. }
  6.  
  7. #int_EXT
  8. void Pulsos(void)
  9. {
  10. ...
  11. }

Puede ser un bug del compilador, CCS tiene sus cosas. Postea el código completo para ver que sucede.

Saludos
Hola MLO

Bueno lo que estoy haciendo es una alarma con simulador de presencia, si se activa la interrupción externa activa una sirena, realiza dos llamadas y enciende las luces de la casa, si no se activa la interrupción se puede simular presencia encendiendo las luces al realizarle una llamada(aquí debería activarse la int_rda para lograr esto) , como el cel que estoy usando ahora es un siemens A71 no soporta todos los comandos para hacerlo más preciso uso la palabra RING para encender y apagar las luces, este es el codigo un poco largo pero así salió je je:


void main(){

 CMCON = 0x07;
 set_tris_b(0x01);   <--------- AQUI ESTUVO LA FALLA :-)
 setup_vref(FALSE);
 setup_oscillator(OSC_4MHZ);
 output_a(0x00);
 output_b(0x00);

 ext_int_edge( H_TO_L );
 enable_interrupts(int_ext);
 enable_interrupts(int_rda);
 enable_interrupts(global);
 cel_start();
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 21 de Enero de 2011, 21:26:18
Hola

Bueno, en la mañana volvi a revisar de pies a cabeza el código y caí en cuenta de un error que cometí al setear el registro trisb con 0x01, de esta forma solo el RB0 estaba como entrada y al pin RB1  que es de recepcion de datos estaba de esta forma como salida razon por la cual nunca se iba a disparar la int_rda ya que no se recibían datos, entonces setee bien este registro con 0x03 y funcionó al fin el programa como quería.
Funciona a la perfección con los celulares nokia 3220b y siemens A56 pero al probarlo con el siemens A71 no me recibe bien los datos, como que se truncan intente hacerlo de varias formas pero nada de nada, hice un programita en BASIC para probar si era falla del cel y oh sorpresa con ese lenguaje funciona perfecto la comunicación en fin el programa funciona OK.

Saludos.
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 21 de Enero de 2011, 21:58:05
Ok.

Que bueno que lo solucionaras. Raro lo del cel, por eso es mejor trabajar con un módem.

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 23 de Enero de 2011, 20:34:34
................
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 27 de Enero de 2011, 00:58:56
HOLA MLO

Creo que podrías ayudarme en esto. Quiero que al enviar un sms se active o desactive algo pero no se como hacerlo, mi duda esta en la forma de monitorear la llegada de un SMS, como se haría esto.?

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 27 de Enero de 2011, 01:15:45
Hola.

Debes activar el flag de aviso para el SMS entrante, eso lo haces seteando el comando CNMI.

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 27 de Enero de 2011, 11:54:32
Hola.

Debes activar el flag de aviso para el SMS entrante, eso lo haces seteando el comando CNMI.

Saludos

Hola MLO

Sería asi: AT+CNMI=2,1,0,0,0  ???

Tambien tengo un problema con la fuente de alimentación, me pasa algo extraño; tengo una fuente electronica variable de 3 a 12V y el regulador 7805, cuando lo pongo en 6v a la fuente funciona OK, pero si aumento el voltaje deja de funcionar el circuito no se porque pasa eso, la fuente puede proporcionar hasta 1200mA.

Gracias por tus respuestas, saludos....
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 27 de Enero de 2011, 13:35:28
Hola.

Envía así:

AT+CNMI=1

Habría que medir el voltaje a la salida del regulador ... si puedes, sube un esquemático para tener una mejor idea.

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 27 de Enero de 2011, 17:06:14
Hola.

Envía así:

AT+CNMI=1

Habría que medir el voltaje a la salida del regulador ... si puedes, sube un esquemático para tener una mejor idea.

Saludos
Hola MLO

Gracias, por tus sugerencias; el voltaje a la salida del regulador siempre es de 4.90 - 4.98v y simplemente uso un regulador 78L05 con 2 capacitores a la entrada (100uF y 100nF) y dos a la salida (100nF y 10uF). A la entrada tengo una fuente electronica variable de 3-12v solo funciona al poner en 6v, cuando subo el voltaje o pongo otra fuente deja de funcionar el circuito. Será por la corriente ???

Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 28 de Enero de 2011, 00:16:31
Hola

El problema de la alimentacion ya lo resolvere luego, ahora tengo otro inconveniente; quiero recibir un sms, active la notificacion de sms entrante con AT+CNMI=1,2,0,0,0 a lo cual el cel responde +CMT: "SM",1 cuando le llega un sms, de ahi procedo a leerlo con AT+CGMR=1 a lo cual el cel responde por ejemplo así:

+CMGR: "REC UNREAD","+593xxxxxxxx",,"11/01/27,21:55:34-20"                     
ACTIVAR

Lo que me resulta un poco dificultoso es filtrar la palabra ACTIVAR, he intentado hacerlo de algunas formas y en la simulacion funciona perfecto pero ya en la practica no lo hace.
Solicito su ayuda para resolver este problema

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 28 de Enero de 2011, 09:15:46
Hola.

Pues yo lo hago teniendo en cuenta el número de veces que llegan los bytes \r y \n, a la primera que llega, no se hace nada, porque el bufer esta vacío, a la segunda vez el bufer no tiene la información que necesito (a menos que quieras verificar el número telefónico) y a la tercera ya verifico el comando.

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 28 de Enero de 2011, 17:41:29
Hola.

Pues yo lo hago teniendo en cuenta el número de veces que llegan los bytes \r y \n, a la primera que llega, no se hace nada, porque el bufer esta vacío, a la segunda vez el bufer no tiene la información que necesito (a menos que quieras verificar el número telefónico) y a la tercera ya verifico el comando.

Saludos
HOLA MLO
Estoy tratando de recibirlo asi, en la simulacion funciona perfecto pero ya en la realidad una vez coge el dato luego como que ya no guarda en la variabe datos, algunas funciones las omiti para que se vea solo las que intervienen:

..........................

En la simulacion funciona perfecto, pero ya en la practica solo una vez funcionó, el resto de veces lee el mensaje pero no se almacenan los datos, MLO tu que estas mas al tanto de esto podrías ver si algo está mal o sugerir una forma diferente ?

Gracias, saludos....
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 30 de Enero de 2011, 00:48:25
Ayuda !!!

Será que alguien puede poner algo de codigo de como decifrar un sms con con CCS ?

Se les agradecerá un mundo.
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 30 de Enero de 2011, 10:37:27
HOLA

Buneo, la verdad es que me estaba complicando la vida de gana ya que en vez de estar leyendo el sms que llega y se almacena en la localidad 1 de la sim mejor resulta activar el aviso de sms entrante con AT+CNMI=1,2,0,0,0 de esta forma cuando llegue un sms automaticamente  tx al pic todo el mensaje de esta forma:
+CMT: "+59384632408",,"XXXXXXXXXXXXXXXXXX"
ACTIVAR
Con esto en la recepcion por interrupciones le ordeno desechar todo hasta que llegue una R de RING, una O de OK y una A de ACTIVAR asi:

#int_RDA
void rda_isr(void){
 char c=0;
 buffer=0;
 if(kbhit()){
 do{
 c = getc();
 }while (c!='R'&& c!='O'&& c!='A'); // VERIFICO SI LLEGA UN RING, OK o ACTIVAR
 while(c!=0x0A){
 buffer[i++] = c;
 c = getc();
 }
 DatoRx=1;
 }
}
Funciona a la primera vez que envio el sms, pero a la segunda no hace nada, solo coge los RING supongo que debe ser porque no se vacía el buffer cuando por ejemplo lega un sms con muchos caracteres que se yo por ejemplo A xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  \n
Si me pueden ayudar con un procedimiento para vaciar el buffer ya que solo lo estaba haciendo con buffer=0;

Espero alguna sugerencia

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 30 de Enero de 2011, 20:57:34
HOLA

No se porque pero solo coje la primera vez que envío el sms. luego como que se cuelga :-(
Para borrar el buffer lo voy a hacer asi:

static char buffer[50];

for(i=1;i<=50;i++){
buffer[i++] = 0x00;
}

Ojalá con esto resulte cada vez que reciba un dato

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 30 de Enero de 2011, 23:58:11
Hola

Luego de unas pruebas determine que el programa marcha perfecto y el borrado del buffer funciona OK, comprobe que es problema de la fuente porque puse otra y con ella anda bien el programa.

Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 31 de Enero de 2011, 01:19:56
 :-/

Que bueno ... te hizo batallar  :mrgreen:

Pero cierto que post atrás mencionaste algo sobre ello.

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 31 de Enero de 2011, 19:57:00
:-( :-( :-(
Cuando estaba cantando victoria me di cuenta que cometi un error, ya que si me llega un sms que no tenga la palabra R, O u A de ACTIVAR el micro se va a quedar esperando hasta que lleguen cualquiera de esas letras iniciales de las palabras que monitoréo.

:-( Que decepcion y no se como mas hacer  :-(

if(kbhit()){
 do{
 c = getc();
 }while (c!='R'&& c!='O'&& c!='A'); // VERIFICO SI LLEGA UN RING, OK o ACTIVAR (Y si llega otra cosa menos estas letras ??? :-(  )
 while(c!=0x0A){
 buffer[i++] = c;
 c = getc();
 }
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 01 de Febrero de 2011, 11:33:06
HOLA MLO

Una consulta, esta bien si hago esto ???: Recibir sin interrupciones

void mensajes(){
 datos=0;
 char a=0;
 int k=0,l=0;

 disable_interrupts(GLOBAL);
 disable_interrupts(int_RDA);

printf("AT+CMGR=1\r"); //AQUI LEO EL SMS (RECEPTO SIN INTERRUPCIONES)

//AQUI FILTRO LA PALABRA QUE ME INTERESA Y DESCARTO TODO ESTO: +CMGR: "REC UNREAD","+593xxxxxxxx",,"11/01/27,21:55:34-20" (61 CARACTERES)

 do{
 a = getc();
 k++;
 }while (k!=61);
 
//AQUI RECIBO EL DATO QUE ME INTERESA Y LO ALMACENO EN datos[50]

while(a!=0x0A){
datos[l++] = a;
 a = getc();
 }
 SMS=1;
 clear_interrupt(int_RDA);
 enable_interrupts(GLOBAL);
 enable_interrupts(int_RDA);
}

Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 01 de Febrero de 2011, 14:35:52
Hola.

Pues yo lo hago teniendo en cuenta el número de veces que llegan los bytes \r y \n, a la primera que llega, no se hace nada, porque el bufer esta vacío, a la segunda vez el bufer no tiene la información que necesito (a menos que quieras verificar el número telefónico) y a la tercera ya verifico el comando.

Saludos
No mismo sale :-(

Podrias poner una parte de codigo de como lo haces ?

Te lo agradeceria mucho.
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 01 de Febrero de 2011, 18:12:52
Esta es la trama completa de caracteres recibidos, MLO filtra el sms contando los 0D a esto te refieres ???
     
0D\0A+CMGR: "REC READ","+59384073897",,"11/02/01,16:00:17-20"\0D                                     
\0AEl numero 59384378887 ha solicitado que lo llame.\0D                                             
\0A\
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 01 de Febrero de 2011, 18:14:39
Hola.

Si, mira que al final de cada trama de bytes hay un 0x0D.

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 01 de Febrero de 2011, 18:16:17
Si MLO

Pero no tengo idea como hacerlo :-(
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 02 de Febrero de 2011, 00:42:41
Si MLO

Pero no tengo idea como hacerlo :-(

Bueno ya poco a poco parece que esta saliendo...
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 02 de Febrero de 2011, 12:54:29
:-) :-) :-)
Al fin lo logre luego de lidiar mucho con este asunto y gracias a las sugerencias de MLO logré leer el sms los OK y los RING ahora si puedo segir avanzando en mi proyecto.... :-) :-) :-)

Gracias MLO

Saludos
 
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: MLO__ en 02 de Febrero de 2011, 21:25:11
 :-/ :-/

FELICITACIONES!!! No hay nada mejor que lograr las cosas!!!!

Saludos
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: 1Roland1 en 15 de Febrero de 2011, 12:55:30
HOLA MLO OTRA VEZ POR ESTE MUNDO DE LOS MICROCONTROLADORES Y EL CCS

TENGO UNA CONSULTA.

A MI PROGRAMA QUIERO AÑADIRLE LA LECTURA Y ESCRITURA DE LA EEPROM INTERNA DEL PIC, OSEA QUIERO PODER GRABAR EN LA EEPROM INTERNA MEDIANTE SMS UN NUMERO O UNA CLAVE PARA HACER QUE ESTA ALARMA SEA PROGRAMABLE Y PODER MODIFICAR LOS NUMEROS TELEFONICOS A LOS QUE QUIERO QUE LLAME AL PRODUCIRSE UN EVENTO. SOLICITO TU AYUDA PARA ESTO. TIENES ALGUNA SUGERENCIA DE COMO HACERLO ??

DE ANTEMANO MIL GRACIAS POR TU AYUDA

SALUDOS
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: vdiazg en 07 de Marzo de 2011, 19:53:10
Si MLO

Pero no tengo idea como hacerlo :-(

Bueno ya poco a poco parece que esta saliendo...

Hola, hace algun tiempo implemente un sistema que enviaba y recibia SMS, te puedo dar unas pautas, la recepcion de datos del movil (SIM340) la hacia por interrupcion del Usart, este modulo GSM cuando recibia una llamada enviaba al PIC la palabra RING, seguida de 0x0D 0X0A y luego enviaba la palabra "OK" 0x0d 0x0A, el detalle es que en la interrupcion del usart solo discriminaba la recepcion del caracter 0x0A que me servia para saber que terminaba de recibir una trama, a continuacion de pongo parte de mi codigo.

#INT_RDA
void recepcion_rxd(){
char rcvchar=0x00;      // último caracter recibido

  if(kbhit()){         // Si hay algo pendiente de recibir ...
    rcvchar=getc();      // lo descargo y ...
    add_2_cbuff(rcvchar); // lo añado al buffer y ...

  }
}



// Añade a cbuff -----------------------
void add_2_cbuff(char c){
  switch(c){
    case 0x0A: // Enter -> Habilita Flag para procesar comando
        cnttrama--;
        if(cnttrama==0){
            flagresp=1;}
    break;
    case 0x0D:
    break;
    case 0x3E:      //simbolo ">" que es la habilitacion para escribir SMS
    break;
    default: // Añade caracter recibido al Buffer
        if (xbuff<=78){
            cbuff[xbuff++]=c;}
        else if ((xbuff>=79)&&(xbuff<=101)){
            smsbuff[(xbuff++)-79]=c;}
        else{
            smsbuff[18]=c;}
      CNTRXD++;
  }
}

//Esto de acontinuacion es parte del programa principal, que tu tendras que adaptarlo, pero que facilmente se entiende.
//los caracteres los recibo en cbuff[], cnttrama es "el contador de tramas" que me indica cuantas veces espero recibir el
//caracter 0X0A
//CNTRXD es el contador de Recepcion de caracteres o bytes.

if((cnttrama==2)&&(cbuff[0]!='R')&&(cbuff[1]!='I')&&(cbuff[2]!='N')&&(cbuff[3]!='G')){
   ver_respuesta(10,709);
   if(flagerror){
   //escribo codigo para cuando no envie ring
   }
   else{
   //escribo codigo para RING
   }
}

// esto es algo similar a la funcion de comparar cadenas, solo que preferi usar una propia
// contador es la cantidad de bytes que comparo (desde el byte numero 0)
// suma, me indica la suma de todos esos bytes, si coinciden solo los caracteres esperados.
// flagerror es un bit que indica se hubo error; si esta en 1 es que hubo error, si esta en 0 esta OK
// led_sal es un led que me indicaba que la respuesta esta OK
// led_est es un led que me indicaba que la respuesta es erronea

void ver_respuesta(int contador,int32 suma){
cont0=0;
    chksuma=cbuff[cont0];
    do{
    chksuma=chksuma+cbuff[cont0+1];
    cont0++;
    }while(cont0<contador-1);

    if (chksuma==suma){
        led_sal=1;
        flagerror=0;
      errcnt=0;
        delay_ms(200);
        led_est=0;
        led_sal=0;}
    else{
        flagerror=1;
        led_sal=0;
        led_est=1;
      errcnt++;
      if ((errcnt>=50)&&(flagsenial==1)){
         init_smsbuff();    // Borra buffer al inicio
         rngcnt=0;
         inactivo=0;
         esperar_ring();         //Vuelvo a esperar los ring.
      }
        delay_ms(200);
        led_est=0;}
    CNTRXD=0;
}

//espero te sirva porque yo lo use sin problemas.
//Cualquier consulta me avisas.
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: bacocio en 14 de Marzo de 2011, 00:00:23
hola amigos, hace tiempo que estoy sigueindo este tema y he hecho un programa para recibir y enviar sms, pero quede estancado. El programa funciona, inicia con AT luego lo configua en modo texto, realiza una llamada de prueba y la corta y finalmente envia el comando para que este atento a recibir un mensaje. luego pasa al programa principal que enciende y apaga un led cada 200 ms. esta ahi hasta qe recibe una llamada que envia el comando RING desde el telefono a la pic, ahi deberia encenderse otro led. el problema que en proteus funciona bien pero al momento de implementarlo en la pic no funciona, hace todo pero no llega al parpadeo de los leds.

me podrian ayudar porfavor, les dejo el programa que he hecho. gracias

#include <16f628.h>
#use delay(clock=4000000)
#use rs232 (baud=9600, bits=8, parity=N,xmit=PIN_B2,rcv=PIN_B1)
#include <stdlib.h>
#byte TRISA = 0x85
#byte PORTA = 0x05

#fuses xt,nowdt,nobrownout,nolvp,noprotect // Fusibles

int i;
char dato[3];
char mensaje[6];
char ok[3];

#INT_rda
void rda_isr()//función de interrupción por recepción de datos USART
{
gets(dato);
gets (mensaje);

if(dato[0]=='R'&&dato[1]=='I'&&dato[2]=='N'&&dato[3]=='G') //enciende led
output_high(PIN_A3);
else
output_low(PIN_A3);
return;
}

void main()
{
enable_interrupts(INT_RDA); // Interrupcion RS232
enable_interrupts(INT_EXT); // interrupcion externa
ext_int_edge(H_TO_L); // por flanco de bajada
enable_interrupts(GLOBAL);
disable_interrupts(INT_RDA);
set_tris_a(0x00); // puerto A como salida
OUTPUT_A(0x00); // estabiliza la salida a cero
output_high(PIN_A0);
printf("AT\r\n"); // Le llama la atención al teléfono.
gets(ok);
delay_ms(1000);
printf("AT+CMGF=1\r\n"); // Modo texto
gets(ok);
delay_ms(1000);
printf("ATD87663847;\r\n"); // realiza una llamada telefonica
delay_ms(5000);
delay_ms(5000);
printf("AT+CHUP\r\n"); // corta la llamada.
delay_ms(1000);
printf("AT+CNMI=1,2,0,0,0\r\n"); // espera mensaje
delay_ms(1000);
enable_interrupts(INT_RDA);

while(TRUE)
{
output_high(PIN_A0);
delay_ms(200);
output_low(PIN_A0);
delay_ms(200);
}
}
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: vdiazg en 14 de Marzo de 2011, 10:51:22
Deberias hacer la recepcion de datos byte por byte, en lo personal la funcion gets como que siempre dio problemas, ademas deberias indicar que modulo GSM usas o si es un movil adaptado; en lo personal este proyecto lo hize solo simulandolo con el MPLAB ya que en Proteus el SIM340 que es el que uso, no me permitia simularlo con eficiencia; por ultimo sabias que el MPLAB tambien te permite simular USART y ADC (aunque es un poco abstracto  ;-)).
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: bacocio en 14 de Marzo de 2011, 22:50:31
bueno estoy utilizando el nokia 3220.

La simulacion de mplab si la sabia, de hecho cuando programaba en assembler la ocupe para ver donde estaba fallando.

una consulta como podria tomar los caracteres bit a bit?? o como podria ser la rutina para hacer eso..
gracias :)
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: oman en 10 de Mayo de 2011, 13:13:57
Buenas tardes compañeritos.

Estoy realizando un proyecto que consiste en counicar un pic con un nokia 3220 para por medio de sms controlar dispositivos. La comunicacion entre el pic y el celular lo he realizado sin problema puedo generar llamadas o enviar sms desde el pic por medio de este celular y con eso realizar varias aplicaciones. El problema que se me presenta es a la hora de tratar de leer un sms con el pic, estoy programando con ccs pcwhd por eso recurro a ustedes para ver si me pueden orientar con este asunto. Por ejemplo si yo mando un sms con la palabra "ENCENDER"quiero que el pic lea esta palabra y realice la acción del caso.

Saludos Cordiales.
buen dia, me llamo omar. saludos a todos.

estoy haciendo un proyecto pic-nokia 3220 y lla logre la comunicacion por hiperterminal y tambien pic-nokia. mi problema es para enviar mensajes.

encontre un manualito de como hacerlo:
at
ok
at+cmgf=1
ok
at+csca="+358405202000"
ok
at+cmgs="+358407540027"
>my msg
+cmgs: 64

ok
/////////////////////////////////////////////////
pero a la hora de realizarlo con mi numero no logro mandar un mensaje los siguentes datos son un ejemplo de mi intento fallido:

at+csca=? //si soporta este comando
ok
at+csca?
+csca: "+85290000000",145

at+cmgs? // soporta el comando
ok

entonces procedo:
at
ok
at+cmgf=1
ok
at+csca="+526181138485"
ok
at+cmgs="+526181723465"
>my msg
+cms error: 500  //signigica que no lo soporta

pero en los pasos anteriores si lo soportaba, no lo entiendo.

usted mensiona que si lo logro, en verdad necesito su ayuda si es con un ejemplo mucho mejor pero las ayudas en manuales siempre son bienvenidas tambien.

espero que me pueda ayudar.


saludos.












Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: xlJaGuArlx en 13 de Abril de 2012, 20:52:45
hola, estoy haciendo un proyecto parecido (comandos at, sms, recibir, enviar, etc), solamente que tengo problemas por que al momento de poner c = getc; el programa ya no hace nada, pero si le quito esa sentencia, hace la siguiente instruccion. A el pic es 16f877a

c = getc;--> recibe caracter
output_toggle(pin_b7); -->solo me indica si recibio algo (solo trato de saber si recibo por lo menos un caracter por eso el tiempo no importa)
delay_ms(500);--> Este tiempo solo para q se vea el destello

Segun estaba viendo arreglaron el problema al poner el pin de rx como entrada, pero si utilizo la sentencia:

#use RS232 (baud = 9600, bits = 8,  parity = N , xmit = pin_c6, rcv = pin_c7), no se supone que ya lo pone??
mi codigo es el siguiente:

#include "C:\Users\JaGaM\Documents\ITTG\SMS_AT\CODIGO\main.h"
#use delay (clock = 4M)
#use RS232 (baud = 9600, bits = 8,  parity = N , xmit = pin_c6, rcv = pin_c7)


char c;
int aceptacion1 = 0;


#int_RDA
void  RDA_isr(void)
{
   disable_interrupts(INT_RDA);
   if(kbhit())
   {
      aceptacion1 = 1;
   }
   
   
}


void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   //INTERRUPCIONES
   
   //lcd_init();
   
   // TODO: USER CODE!!
     
   output_high(pin_b7);
   delay_ms(1000); //espero 1 segundo
   printf("ATE0\r\n");  //DESACTIVO EL ECO
   delay_ms(3000);
   output_low(pin_b7);
   output_high(pin_b6);
   delay_ms(1000); //espero 3 segundos
   printf("AT+CMGF=1\r\n");
   delay_ms(3000);
   output_low(pin_b6);
   
   aceptacion1 = 0;
   
   fgg:
   
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   printf("AT\r\n");
   
   while(aceptacion1 == 0){
   }
      c = getc();
      output_high(pin_b6);
      delay_ms(500);
      output_low(pin_b6);
      delay_ms(500);
   
   
   
   if(c == 'O' || c == 'o')
   {
      output_high(pin_b6);
      delay_ms(1000);
      output_low(pin_b6);
      delay_ms(1000);
   }
   if(c == 'k' || c == 'K')
   {
      output_high(pin_b6);
      delay_ms(3000);
      output_low(pin_b6);
      delay_ms(3000);
   }
   
   aceptacion1 = 0;     
   goto fgg;
     
}

alguna ayuda...?
Título: Re: Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: luc_eluani88 en 17 de Diciembre de 2012, 20:15:06
Yo tengo un programa que todavia no puedo probar para el SIM900, que tiene lista negra y palabra habilitada.

Código: C
  1. #include <v03.h>
  2. #define PIN_ON  output_high
  3. #define PIN_OFF output_low
  4.  
  5. //Variables Globales utilizadas
  6. const int8 lista[177][10]={{'x','x','x','x','x','x','x','x','x','x'},{'x','x','x','x','x','x','x','x','x','x'},{'x','x','x','x','x','x','x','x','x','x'},{'x','x','x','x','x','x','x','x','x','x'},{'x','x','x','x','x','x','x','x','x','x'},{'x','x','x','x','x','x','x','x','x','x'},{'x','x','x','x','x','x','x','x','x','x'},{'x','x','x','x','x','x','x','x','x','x'},{'x','x','x','x','x','x','x','x','x','x'},{'x','x','x','x','x','x','x','x','x','x'}};
  7. int d,numok=0,i,j,numcorr,iniciorecpnum;
  8. int const lenbuff=6;  // Tamaño del buffer de recepción
  9. int8 cbuff[lenbuff];   // Buffer de recepcion de datos serie
  10. int const num=10;
  11. int8 numrec[num];
  12. void apertura_y_cierre_porton();
  13. #int_RDA //Interrupcion recepcion caracter
  14. void  RDA_isr(void)
  15. {
  16. d=0;
  17.       d=getchar(SERIAL_SIM900);
  18.       if (d=='"')                //Pregunto si entro un " del modulo gsm caso afirmativo incrementa un contador
  19.          {iniciorecpnum=iniciorecpnum+1;
  20.          }
  21.       if (iniciorecpnum>0 && iniciorecpnum<2) // como el numero llega precedido por comillas "xxxxxxxxxx", pregunto por las comillas despues de que la detecta por 2da vez y acumulo en un vector
  22.          {   numrec[0]=numrec[1];
  23.              numrec[1]=numrec[2];
  24.              numrec[2]=numrec[3];
  25.              numrec[3]=numrec[4];
  26.              numrec[4]=numrec[5];
  27.              numrec[5]=numrec[6];
  28.              numrec[6]=numrec[7];
  29.              numrec[7]=numrec[8];
  30.              numrec[8]=numrec[9];
  31.              numrec[9]=d;
  32.          }
  33.       cbuff[0]=cbuff[1];
  34.       cbuff[1]=cbuff[2];
  35.       cbuff[2]=cbuff[3];
  36.       cbuff[3]=cbuff[4];
  37.       cbuff[4]=cbuff[5];
  38.       cbuff[5]=d;
  39. }
  40.  
  41. #int_RAB
  42. void  RAB_isr(void)
  43. {
  44. if (IR==true)
  45.    {
  46.    apertura_y_cierre_porton();
  47.    }
  48. }
  49.  
  50. void inicializacionSIM900(void)
  51. {
  52.    int cont;
  53.    delay_ms(1000);
  54.    puts("A",SERIAL_SIM900); //para sincronizar el baudrate del SIM 900
  55.    delay_ms(300);
  56.    putchar(0x0d,SERIAL_SIM900);
  57.    delay_ms(1000);
  58.    for(cont=0;cont<5;cont++)              // mando varios AT para el autobauding
  59.          {
  60.          puts("AT",SERIAL_SIM900);
  61.          delay_ms(200);
  62.          putchar(0x0d,SERIAL_SIM900);
  63.          delay_ms(200);
  64.          PIN_ON(LED1);
  65.          delay_ms(200);
  66.          PIN_OFF(LED1);
  67.          }
  68. //-----------------------------------seteos de configuracion del SIM900------------------------        
  69.    puts("AT+CMGF=1\r",SERIAL_SIM900);                  // configuro para que trabaje en modo texto y no PDU
  70.    delay_ms(200);
  71.    putchar(0x0d,SERIAL_SIM900);
  72.    delay_ms(200);
  73.    puts("AT+CNMI=2,2,0,0,0\r",SERIAL_SIM900);                  // configuro para que en cuanto llegue un mensaje lo envie el modulo gsm por el puerto serie
  74.    delay_ms(200);
  75.    putchar(0x0d,SERIAL_SIM900);
  76.    delay_ms(200);
  77.    puts("ATS0=0\r",SERIAL_SIM900);                  // configuro para no atienda el llamado
  78.    delay_ms(200);
  79.    putchar(0x0d,SERIAL_SIM900);
  80.    delay_ms(200);
  81.    
  82. }  
  83.  
  84.  
  85. void main()
  86. {int caractrec=0;
  87.    setup_timer_3(T3_DISABLED | T3_DIV_BY_1);
  88.  
  89.    setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
  90.    enable_interrupts(INT_RDA);
  91.    enable_interrupts(INT_RAB);
  92.    enable_interrupts(GLOBAL);
  93.  
  94.   PIN_OFF(POWERKEYGSM);    //Enciendo modulo GSM
  95.    delay_ms(1200);
  96.    PIN_ON(POWERKEYGSM);
  97. inicializacionSIM900();
  98.    if (caractrec==44)
  99.    {disable_interrupts(INT_RDA);
  100.    delay_ms (1000);
  101.      for (i=0;i<178;i++)                     //Recorro la matriz preguntando si alguno de los numeros cargados se corresponde con el que envio el sms
  102.       {if(numok==10)                         //Si tengo las 10 coincidencias el numero es correcto, caso contrario tendria valor 0. Si alguno de los numeros es correcto habilito la marca para avisar que el numero esta habilitado
  103.             {
  104.             numcorr=1;
  105.             i=178;
  106.             }
  107.                for (j=0;j<10;j++)
  108.                     {  
  109.                      if (lista[i][j]==numrec[j])  //Comparo caracter a caracter los vectores
  110.                          numok=numok+1;
  111.                       else
  112.                          numok=0;
  113.                     }
  114.       }
  115.       if(i==178)
  116.        {
  117.        iniciorecpnum=0;//Una vez que ya compare todos los valores habilito una nueva recepcion
  118.        caractrec=0;
  119.        enable_interrupts(INT_RDA);
  120.        }
  121.   }
  122.     if((cbuff[0]=='p'||cbuff[0]=='P')&&(cbuff[1]=='o'||cbuff[1]=='O') && (cbuff[2]=='r'||cbuff[2]=='R')&& (cbuff[3]=='t'||cbuff[3]=='T')&& (cbuff[4]=='o'||cbuff[4]=='O') (&&cbuff[5]=='n'||cbuff[5]=='N')&& (numcorr==1)) //Pregunto por la palabra habilitada y si el numero se encuentra en la lista habilitada
  123.       {
  124.        cbuff[0]=0;              //Salidas del sistema
  125.        apertura_y_cierre_porton();
  126.        numcorr=0;
  127.        numrec[0]=0;
  128.        }
  129.    else
  130.       {
  131.       numcorr=0;
  132.       numrec[0]=0;
  133.       cbuff[0]=0;
  134.       }
  135.  
  136. }
  137.  
  138. void apertura_y_cierre_porton()
  139. {PIN_ON (PORTAPMAE);
  140. delay_ms (5000);
  141. PIN_ON (PORTAPESC);
  142. delay_ms(25000);
  143. PIN_OFF (PORTAPMAE);
  144. PIN_OFF (PORTAPESC);
  145. delay_ms (40000);
  146. PIN_ON (PORTCIMAE);
  147. delay_ms (5000);
  148. PIN_ON (PORTCIESC);
  149. delay_ms(40000);
  150. PIN_OFF (PORTCIMAE);
  151. PIN_OFF (PORTCIESC);
  152. }
Título: Re:Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: Abner_emanuel en 25 de Abril de 2016, 17:11:50
Alguien echo a andar el code de luc_eluani88?.

Lo que me interesa saber es si funciono esta lista de números.

const int8 lista[177][10]={{'x','x','x','x','x','x','x','x','x','x'},{'x','x','x','x','x','x','x','x','x','x'},{'x','x','x','x','x','x','x','x','x','x'},{'x','x','x','x','x','x','x','x','x','x'},{'x','x','x','x','x','x','x','x','x','x'},{'x','x','x','x','x','x','x','x','x','x'},{'x','x','x','x','x','x','x','x','x','x'},{'x','x','x','x','x','x','x','x','x','x'},{'x','x','x','x','x','x','x','x','x','x'},{'x','x','x','x','x','x','x','x','x','x'}};
i
Título: Re:Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: KILLERJC en 25 de Abril de 2016, 17:24:35
Lo unico que hace es comparar esa lista con el numero de quien envio el SMS.

Asi que el "exito" de ese codigo, va a depender de:

- Que se aisle bien y guarde correctamente en el array numrec, el numero de quien recibe el mensaje.
- Luego que la comparacion sea correcta.

Aunque no me gusta la forma de comparar, esta muy rebuscada.

Ahora [177][10] es MUCHOO 1770 bytes, mas que una lista negra, deberia haber una lista blanca..
Título: Re:Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: Abner_emanuel en 25 de Abril de 2016, 17:39:15
Gracias killerJc. A mi me llamó mucho la atención esa lista por dos razones.

Una por que yo envío sms a un numero de 10 digitos xxxxxxxxxx pero, no se si se puede, enviar el sms a múltiples destinatarios ( números diferentes) con un algoritmo similar a lista en forma de array. Esto para no estar escribiendo el comando de envío de sms a cada destinatario, es decir con un solo comando enviar sms a 10 números telefónicos.

Y lo segundo por que con esa lista se filtran sólo una lista de números aceptados por el módem para realizar el control.

Yo en alguna ocasión intente este code tal cual.con el módem wavecom y no me filtraba el número. Me desespere en intentos fallidos y modificaciones no satisfactorias al code que termine por olvidarme de el. Ahora  intento nuevamente y es por eso que pregunte si alguien le había funcionado ese filtrado de lista o cual seria la mejor manera de realizarlo.

Alguna pista!!.


Título: Re:Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: KILLERJC en 25 de Abril de 2016, 18:22:55
No puedo extenderme demasiado por que no se exactamente como son las librerias que tenes, ni que es lo que te envia el modem cuando recibis un mensaje. Ni tampoco tengo experiencia con estos como para decirte, pero en lo que respecta a la programacion ( sabiendo que se manejan con comandos AT, y es recepcion/transmision UART ) puedo decirte algo.

Pero lo mas dificil a realizar es: Discriminar el numero de quien te envia el mensaje.

Por ejemplo. Para enviar lo que yo veo por internet es que tenes que enviar por UART:

Código: [Seleccionar]
at+cmgs=”NUMEROTELEFONO”
Esperar el >, y escribir el mensaje. Digamos que el numero es 1234567890 y el mensaje es Hello World!, entonces quedaria asi:

Código: [Seleccionar]
Envio: at+cmgs="1234567890"
Espero: >
Envio: Hello World! + caracter de fin de mensaje

Esto lo podes repetir con un simple for para cada numero de telefono. Suponete que creamos una funcion que envie el SMS

Código: C
  1. EnviarSMS("1234567890","Hello World!");

Esta funcion hace lo de arriba. No es muy complejo, veamos un poco mas detallado la funcion ( por si las dudas, igual esta "resumido" ):

Código: C
  1. void EnviarSMS(char *Number, char *Text)
  2. {
  3.      EnviarStringPorUART(" at+cmgs=");
  4.      EnviarStringPorUART(Number);
  5.      while(RecibirPorUART != ">");
  6.      EnviarStringPorUART(Text);
  7.      EnviarStringPorUART("\r\n");
  8. }

Pero ahora si tengo un array con numeros:

Código: C
  1. ArrayConNumeros[3][11] = { "1234567890", "0987654321", "1654568790" };

Podria tranquilamente ponerlo en un for para que se lo envie a los 3 numeros:

Código: C
  1. for ( x = 0; x < 3; x++ )
  2. {
  3.      EnviarSMS(ArrayConNumeros[x],"Hello World!");
  4. }

Ahora la parte de recepcion... Voy a suponer que siempre hay 1 solo mensaje, por lo cual lees 1 y luego lo borras.

Segun en internet debo Enviar: at+cmgr=1  asi me devuelve el mensaje numero 1 ( esto para leerlo, cuando se recibe uno envia otra cosa). Esto devuelve algo asi:

Citar
+CMGR: "REC READ","1234567890",,"12/07/30,00:12:05+32"
Mensaje_aca creo

OK

El labro mas grande que tenes es... tratar de recuperar el numero de telefono, lo que podes hacer es recibir todo eso, ponerlo en un buffer, buscar la primera coma que luego el sigue un ", y tomar esos 10 caracteres. Es decir el numero de telefono 1234567890

Ojo que veo que si usas:

Código: [Seleccionar]
AT+CMGL="ALL"
AT+CMGL="REC UNREAD"

El formato de respuesta cambia a algo asi:

Código: [Seleccionar]
+CMGL: 1,"REC READ","+85291234567",,"07/02/18,00:05:10+32"
Reading text messages is easy.
+CMGL: 2,"REC READ","+85291234567",,"07/02/18,00:07:22+32"
A simple demo of SMS text messaging.
+CMGL: 3,"REC READ","+85291234567",,"07/02/18,00:12:05+32"
Hello, welcome to our SMS tutorial.

OK

Y lo de la primer coma ya no es valido, por eso decia de tomar el primer mensaje y borrarlo, asi siempre hay uno. Pero eso ya pasa mas por recepcion/transmision y no lo que queremos hacer.

Una ves que ubique ese numero solo debo copiarlo a un array de 10 u 11 ( si incluye el caracter nulo) posiciones, y compararlo con cada uno de los numeros que tengo guardado, podes hacer uso de memcpm(); o de strcmp() en caso que uses el caracter nulo.

Si de todos hay una coincidencia entonces actuaras en consecuencia. Como veras lo unico complicado aca es obtener el numero del SMS enviado. Lo demas es cargar los numeros y luego compararlos, o si queren enviar multiples mensajes es un simple for. Por supuesto que la funcion de envio de SMS espera que se envie el otro mensaje antes de proceder a enviar uno nuevo, y tambien deberia tener en cuenta si existe un error en el envio del mismo.

PD: Los comandos los saque de internet, ni siquiera se que modem tenes, yo puse modem wavecom y el primero que salio use.
Título: Re:Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: Abner_emanuel en 25 de Abril de 2016, 18:41:01
Me agrada la forma en que programas, esto se ve muy bien

ArrayConNumeros[3][11] = { "1234567890", "0987654321", "1654568790" };

for ( x = 0; x < 3; x++ )
{
     EnviarSMS(ArrayConNumeros
}

Hoy probaré lo que se pueda simular en proteus con hyperterminal y te comento.
Título: Re:Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: Abner_emanuel en 25 de Abril de 2016, 22:06:20
Gracias KILLERJC por fin quedo!!!!

Muestro el code:
 
Código: CSS
  1. #include <18f4550.h>
  2.          #fuses XT,NOPROTECT,MCLR,NOFCMEN,PUT,NOBROWNOUT,NOVREGEN,NOWDT,NOLVP,NODEBUG,NOCPD,NOWRT
  3.          #use delay(clock=4000000)
  4.          #use rs232(baud=9600, xmit=PIN_c6,rcv=PIN_c7,stream=MODEM)
  5.          
  6.          char ArrayConNumeros[5][11] = {"1111111111","2222222222","3333333333","4444444444","5555555555"};
  7.          int x;
  8.          
  9.          void main(void)
  10.          {
  11.          fputs("AT\r\n",modem); delay_ms(150);
  12.          fprintf(modem,"AT+cmgf=1\r\n"); delay_ms(200);
  13.          
  14.          while(true)
  15.          {                
  16.          if (input(pin_a1)==0)                                             //Si el pin A1 se activa manda sms
  17.          {
  18.          for (x=0;x<5;x++)
  19.          {        
  20.          fprintf(modem,"\r\nat+cmgs="); delay_ms(100);
  21.          fprintf(modem,ArrayConNumeros[x]); delay_ms(100);
  22.          fprintf(modem,"\r\nHello World!\r\n"); delay_ms(100);
  23.          }
  24.          }
  25.          }
  26.          }

Aunque no de esta forma void EnviarSMS(char *Number, char *Text) pero funciona.  :mrgreen:
         
Título: Re:Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: KILLERJC en 25 de Abril de 2016, 22:18:43
Pero podes hacerlo facilmente, ya que es llevar las cosas a una funcion :P

Código: C
  1. #include <18f4550.h>
  2. #fuses XT,NOPROTECT,MCLR,NOFCMEN,PUT,NOBROWNOUT,NOVREGEN,NOWDT,NOLVP,NODEBUG,NOCPD,NOWRT
  3. #use delay(clock=4000000)
  4. #use rs232(baud=9600, xmit=PIN_c6,rcv=PIN_c7,stream=MODEM)
  5.          
  6. char ArrayConNumeros[5][11] = {"1111111111","2222222222","3333333333","4444444444","5555555555"};
  7. int x;
  8.          
  9. void main(void)
  10. {
  11.          fputs("AT\r\n",modem); delay_ms(150);
  12.          fprintf(modem,"AT+cmgf=1\r\n"); delay_ms(200);
  13.          
  14.         while(true)
  15.         {                
  16.                 if (input(pin_a1)==0)                                             //Si el pin A1 se activa manda sms
  17.                 {
  18.                         for (x=0;x<5;x++)
  19.                         {        
  20.                                 EnviarSMS(ArrayConNumeros[x],"\r\nHello World!\r\n");
  21.                         }
  22.                 }
  23.         }
  24. }
  25.  
  26. void EnviarSMS( char *Number, char *Text )
  27. {
  28.          fprintf(modem,"\r\nat+cmgs="); delay_ms(100);
  29.          fprintf(modem,Number); delay_ms(100);
  30.          fprintf(modem,Text); delay_ms(100);
  31. }

Eso era todo lo que habia que hacer... ahora eso es para enviar, si queres hacer una lista de recepcion, para que unicamente reciba de algunos numeros vas a tener que encargarte de tratar de sacar el numero de quien lo envio.

Pero no se si eso es lo que querias hacer, o solo lo de enviar a varios numeros nomas.

PD: No se si el codigo funciona, me refiero si meti mal una letra o algo por el estilo.
Título: Re:Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: Abner_emanuel en 26 de Abril de 2016, 02:15:37
KILLERJC asi como lo escribes me saca un error, es el siguiente: Attempt to create a pointer to a constant de echo era otro error primero pero lo quite con void EnviarSMS( char *Number, char *Text ); al inicio del programa.

Ahora solo queda el que se ve en la imagen. Y si, la meta es filtrar también una serie de números para que solo esos sean aceptados por el módem. Solo que lo primero es lo primero.
Título: Re:Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: KILLERJC en 26 de Abril de 2016, 06:51:41
Si, el mayor problema es que la string:

"\r\nHello World!\r\n"

Es una constante ( grabado en la Flash y no en la RAM). Por lo va a dar problemas, Podrias intentar asi:

Código: C
  1. void EnviarSMS(const char *Number,const char *Text )
(Esto en ambos, en el prototipo al comienzo y en la declaracion de la funcion)

Para decir que son constantes, y tal ves moleste con el tema de Number que no es constante. Pero para que no ocupe espacio en la RAM ( innecesario ) los numeros de telefono, deberias hacer:

Código: C
  1. const char ArrayConNumeros[5][11] = {"1111111111","2222222222","3333333333","4444444444","5555555555"};

Asi los pone en la Flash y no en la RAM.
Título: Re:Recibir un SMS desde un ceular con un pic para controlar dispositivos
Publicado por: Abner_emanuel en 30 de Abril de 2016, 09:47:14
Jejejeje  :mrgreen:

Hola KILLERJC. Ya de regreso. Podes haber pensado que quedaría esto así. Pero después de tantos intentos, creo que esta parte así quedara funcionando. Al menos en proteus funciona bien.

Código: CSS
  1. char ArrayConNumeros[5][11] = {"1111111111","2222222222","3333333333","4444444444","5555555555"};
  2.          int x;
  3.          
  4.          void main(void)
  5.          {
  6.          fputs("AT\r\n",modem); delay_ms(150);
  7.          fprintf(modem,"AT+cmgf=1\r\n"); delay_ms(200);
  8.          
  9.          while(true)
  10.          {                
  11.          if (input(pin_a1)==0)                                             //Si el pin A1 se activa manda sms
  12.          {
  13.          for (x=0;x<5;x++)
  14.          { EnviarSMS(ArrayConNumeros[x],0);}
  15.          }
  16.          }
  17.          }
  18.  
  19.          void EnviarSMS( char *Number, int n )
  20.          {
  21.          fprintf(modem,"\r\nat+cmgs="); delay_ms(100);
  22.          fprintf(modem,Number); delay_ms(100);
  23.          
  24.          switch (n)
  25.          {
  26.          case 0:
  27.          {
  28.          printf("\r\nHello World!\r\n");
  29.          break;
  30.          }
  31.          default :
  32.          break;
  33.          }
  34.          delay_ms(200);
  35.          putc(26);                                                         //  ctrl + Z
  36.          delay_ms(300);
  37.          return;
  38.          }

Creo que estiempo deiniciarcon el comando

+CMGR: "REC READ","1234567890",,"12/07/30,00:12:05+32" para extraer el numero de la llamada entrante. Claro con la ayuda de KILLERJC :lol: