TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: calopsia en 05 de Enero de 2011, 18:21:33

Título: Int_rda
Publicado por: calopsia en 05 de Enero de 2011, 18:21:33
Buenas.. gente.. una consulta.. resulta que he conectado un pic 16f628 a un modem que soporta comandos AT, mi duda y mi problema es lo siguiente

lo que quiero lograr es saber cuando le ha llegado un mensaje al modem para poder interpretarlo con el pic.. es muy sencillo ya que una vez conectado el modem.. si le llega un sms

el modem le enviaria esto al micro:


+CMT: "+54XXX4119660",,"11/01/05,12:27:10-12"
Apagar

+CMT: "+54XXX4119660",,"11/01/05,12:29:09-12"
Apapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap
apapapapapapapapapapapapapapapapaparkpapjgapjpagjpagjpagjpagjpagjpagjpagj

+CMT: "+54XXX4119660",,"11/01/05,12:29:12-12"
pagjpagjpagkpagjpagjpagjpagjpagjpagjpagjpagjpagjpagjpagjpagjpagjpagjpagjpagjpagj
pagjap



ahora bien.. en la interrupcion del pic16f628

#int_rda

como deberia hacer para almacenar los datos en una variable y preguntar si por ejemplo coincide el telefono o la palabra clave..

aunque parezca tonta la pregunta.. me cuesta mucho .. porque otra cosa a tener en cuanta es que un sms puede tener hasta 160 caracteres.. y si yo.. dentro de la interrupcion pongo fgets()
para obtener la cadena entrante.. si el mensaje es muy largo  el pic se tilda.. no recibe mas..


pero cuando recibo de caracter a caracter.. fgetc() puedo obtener todo completo.. pero no se como o porque no puedo comparar lo que recibo contra otra variable.. he probado con strcmp() pero la verdad es que no me sale.. la parte logica de la cuestion.. hay algo q no estoy viendo..

estoy usando CSS, el que me pueda dar una idea.. se lo voy a agradecer..


saludos!!!!
Título: Re: Int_rda
Publicado por: MGLSOFT en 05 de Enero de 2011, 18:33:17
Hay un ejemplo del CCS que es para usar la interrupción y capturar y comparar strings.
Se llama EX_SISR.C
Creo que se ajusta bastante a lo que necesitas hacer... ;-) ;-)
Título: Re: Int_rda
Publicado por: MLO__ en 05 de Enero de 2011, 18:45:09
Hola.

Ten en cuenta que la función strcmp() compara toooodos los bytes, asi que debes deshacerte de lo que no te sirve en el bufer que tiene los datos de lo que te envía el módem para comparar solo el comando.

Saludos
Título: Re: Int_rda
Publicado por: calopsia en 05 de Enero de 2011, 22:07:18
EX_SISR.C, lo estoy tratando de entender.. pero sigo sin comprende lo que me hace falta en realidad.. como como como como?

hago esto;

ejemplo;

//interrupcion
c=getc();


como copio cada caracter.. a un string digamos sin que se pase de 50 caracteres proque sino una no da la memoria del pic y la otra es q el pic se tilda..
por ejemplo a un string de 10

y voy comparando palabras claves con las q estoy llenando en ese buffer de 10 ? :S:S ahi esta la duda..
Título: Re: Int_rda
Publicado por: MGLSOFT en 06 de Enero de 2011, 08:25:24
Si le dedicas todo el tiempo a la interrupción, seguramente veras que se traba el PIC.
Cuando recibes una trama, debes hacer que cada byte recibido sea descargado lo antes posible del buffer de recepción, por eso es que en el código del ejemplo tienes toda la transferencia hacia posiciones de un buffer que en realidad se transforma en un string, ya que ordenas lo que viene según como llegan:

Código: C++
  1. #int_rda
  2. void serial_isr() {
  3.    int t;
  4.  
  5.    buffer[next_in]=getc();
  6.    t=next_in;
  7.    next_in=(next_in+1) % BUFFER_SIZE;
  8.    if(next_in==next_out)
  9.      next_in=t;           // Buffer full !!
  10. }

La sentencia buffer[next_in]=getc(); hace que se limpie el buffer de recepción y permita la llegada del siguiente carácter...
El resto de las instrucciones prepara el puntero del buffer para recibir nuevos caracteres que van llegando.
El tamaño del buffer de recepción lo fijas tu, con por lo menos 10 caracteres de reserva.

Una vez capturado el byte de fin de trama (tiene que haber uno seguramente), consideras terminada la recepción y allí comparas contra dos o tres strings predefinidos y allí ya sabes cual es la trama recibida.
Si no hay coincidencia, declaras nulo el proceso.
Título: Re: Int_rda
Publicado por: calopsia en 06 de Enero de 2011, 14:28:36
muchas gracias... eso si lo entendia perfectamente.. yo use eso.. no pude comparar ... comparaba y no encontraba coincidencias..

ademas ese ejemplo usa BYTE no char y como comparo un BYTE con un char?
Título: Re: Int_rda
Publicado por: MGLSOFT en 06 de Enero de 2011, 16:46:29
Un Char en CCS es lo mismo que un Unsigned Int o es lo mismo decir un Byte.
No veo razón para que no te funcione la comparación , salvo que tengas distintos tamaños del string.

De la ayuda de CCS:

(http://img835.imageshack.us/img835/7660/ccsbyteychar.jpg)
Título: Re: Int_rda
Publicado por: calopsia en 06 de Enero de 2011, 17:06:50
gracias por la data.. pero viendo el grafico me marea un poco.. es entendible.. pero..volviendo al tema.. alguien me puede facilitar o explicarme como puedo hacer para interpretar lo que me dice el modem? 

los mensajes llegan asi

+CMT: "+54xxx4119660",,"11/01/05,12:27:10-12"
apagar

+CMT: "+54xxx4119660",,"11/01/05,12:27:10-12"
encender


como capturo las palabras? ;O y como discrimino un mensaje q se mas largo q eso.. ya que sino el pic se tilda..



saludos y gracias una vez mas
Título: Re: Int_rda
Publicado por: MGLSOFT en 06 de Enero de 2011, 18:34:04
Tendrás el manual del protocolo para subirlo aquí o poner un link donde verlo??
Es para saber identificar que es inicio del string y que es final.
Debe haber un carácter que marca eso...
Título: Re: Int_rda
Publicado por: calopsia en 06 de Enero de 2011, 18:58:58
 MGLSOFT:

en cuanto  a manual del protocolo tengo un pdf con todos los comands soportados por el modem.. es un sim340

yo he manejado este timpo de modems desde visual basic con el control mscomm.ocx y no tengo problemas.. en comparar y manipular la data entrante..

puedes hacer una configuracion.. para que cuando le llegue un sms al modem.. puedas saber cuantos mensajes entrandes hay y si fueron leidos o no..

el tema es que entrar en ese tipo de configuraciones en el pic no me conviene.. porque no me convence para nada q se almacene en el sim.

De la forma en que te dice si hay o no mensajes es asi:

el modem una vez conectado: automaticamente esta en espera de mensajes entrantes.:

ni bien le llega un mensaje:

el modem dice esto: ( probado en hyperterminal)

+cms: "numero de celular",,"fecha y hora"
<mensaje_1>

+cms: "numero de celular",,"fecha y hora"
<mensaje_2>

entre los 2 mensajes hay un ENTER o CHR(13)


el problema principal se me plantea en lo siguiente..

como un sms puede tener hasta 160 caracteres.. si yo pusiera en la interrupcion int_rda

fgets(string,stream)

en la variable string si se almacenan todos los datos y si puedo usar strcmp y strncmp siempre y cuando el mensaje no exeda el tamaño del buffer
en el caso de mi pic16f628 el tamaño maximo q puedo poner en una variable es 80 si le llega un mensaje mas grande se tilda sino anda perfecto.. por eso.. lo que pretendia era capturar hasta 80 caracteres por ejemplo, ahi esta sobrado para que entre la fecha, hora y un mensaje relativamente corto y poder comparar por ejemplo

es el telefono ? si
el mensaje coincide ? si

enciendo un led

sino no hago nada.




espero haber sido claro.. y gracias otra vez mas..


Título: Re: Int_rda
Publicado por: MGLSOFT en 06 de Enero de 2011, 19:17:38
Me pareció ver un hilo con el SIM340 en el foro, has buscado bien??
Lo que no creo que te de es ese PIC.

A que velocidad comunicas y que cristal estas utilizando??
Título: Re: Int_rda
Publicado por: MGLSOFT en 06 de Enero de 2011, 19:21:36
Aquí una búsqueda de temas parecidos...

Título: Re: Int_rda
Publicado por: calopsia en 06 de Enero de 2011, 19:38:58
los habia leido a la mayoria.. pero ninguno busca lo que busco yo..gracias igual
Título: Re: Int_rda
Publicado por: calopsia en 06 de Enero de 2011, 20:05:51
he buscado bien.. sin resultados positivos.. la comunicaciones con el pic todavia no la hago. porque tendria primero me arme un programa q me emula todo.. en proteus.. uso 2 pics en donde uno me manda info de la misma manera que el pic.. y con un pic 16f628 estoy tratando de manipular la data en la int_rda

cuando haga la comunicacion con el modem.. deberia tener algo medianamente funcional a nivel codigo..

y obviamente el pic tendra un cristal de 4mhz y la comunicacion sera a 9600bps que es a la velocidad q he seteado el modem..

lo unico que me queda hacer.. y dejar de rabiar.. seria comprarme un pic18f2550 en donde puedo crear una variable string[200] y estaria sobrado para colectar info..
pero la idea era rebuscarme para dividir la info entrante en paquetes.. para no llegar a ese pic.. una por el precio y la otra.. porque me cuesta conseguirlo..

en fin muchas gracias


si queres te paso la simulacion en proteus con los 2 programas saludos
Título: Re: Int_rda
Publicado por: MGLSOFT en 06 de Enero de 2011, 20:39:44
Si no te molesta enviarlos o colgarlos del hilo, es posible que podamos ayudar mas, de momento estoy buscando la data del SIM340.
Título: Re: Int_rda
Publicado por: MGLSOFT en 06 de Enero de 2011, 20:46:23
Acá hay algo parecido a lo tuyo, y hay precauciones a tomar en cuanto a alimentaciones, por lo que dicen...
http://sistemasembebidos.com.ar/foro/index.php?topic=919.0 (http://sistemasembebidos.com.ar/foro/index.php?topic=919.0)
Título: Re: Int_rda
Publicado por: MGLSOFT en 06 de Enero de 2011, 21:01:58
Aquí el manual de comandos AT, verifica si es el mismo que tienes...

Set de Comandos SIM340 (http://www.4shared.com/document/8Wpai3mR/DS189_SIM340_AT_Command_Set.html)

Y aquí el manual para diseño de hardware...

Manual de diseño de hardware SIM340 (http://www.4shared.com/document/j5SJoULC/DS188_SIM340_Hardware_Design.html)
Título: Re: Int_rda
Publicado por: calopsia en 06 de Enero de 2011, 22:14:34
Holas de nuevo.. tengo toda la data del modem sim 340.. tengo la placa en donde tengo ya normalizado todo a ttl la conexion la hago directa.. 0 problemas con el hardware hasta aqui.. porque no anduve por esos lados..

pero si me hice un max232( transistorizado ) y lo conecte con la pc y funciona perfecto..


http://www.mediafire.com/?gckisp1t8dnaujw (http://www.mediafire.com/?gckisp1t8dnaujw)

ahi adjunto la simulacion con el codigo fuente hasta el momento..

hay un archivo q dice notas.txt que es un pequeño explicativo.. de lo que tengo hecho maso..


saludos y agradezco!
Título: Re: Int_rda
Publicado por: calopsia en 06 de Enero de 2011, 22:17:37
aqui el set de comandos at, pero.. no creo q sea tan importante.. ya q las unica configuracion que le modifique es la de la velocidad .. quedo seteada a 9600..

mientras q la forma de recibir mensajes.. la que esta es la q mas me convence.. para mi uso

http://www.mediafire.com/?f0bg78yyb5513zb (http://www.mediafire.com/?f0bg78yyb5513zb)
Título: Re: Int_rda
Publicado por: calopsia en 07 de Enero de 2011, 02:26:40
No quiero hablar antes de tiempo pero mepa que me salio ajajaja, esta probado y reprobado en proteus.. con respecto al simulador siempre tuve buenos resultados.. osea lo que simule funciono tal cual.. obviamente que para todo hay errores..

en fin aqui adjunto una imagen..

y en cuanto lo pruebe pic-a-modulo les cuento :D


saludos y gracias
Título: Re: Int_rda
Publicado por: MGLSOFT en 07 de Enero de 2011, 08:03:42
Me alegro mucho que comience a funcionar...
Por lo que vi, no estabas muy lejos de lograrlo. :lol: :lol:
Título: Re: Int_rda
Publicado por: calopsia en 07 de Enero de 2011, 13:06:07
esta mañana me levante emocionado a probar el codigo que me salio anoche entre puchos y cerveza.. y espectacular.. como dije antes.. tal cual proteus.. jajaja asi es que agradezco la ayuda de todos.. y el interes q le dieron a mi pregunta.. al que le interese subo lo que hice..

osea me avisan!!!

saludos :D
Título: Re: Int_rda
Publicado por: MGLSOFT en 07 de Enero de 2011, 14:55:21
Eso no se ofrece !!
se hace!! :D :D :D

Me alegro mucho y por supuesto que me interesa ver como lo pudiste resolver... :mrgreen:
Título: Re: Int_rda
Publicado por: calopsia en 07 de Enero de 2011, 16:26:24
aqui subo el codigo.. igual es una prueba.. pero me canse de mandarle mensajes de todo tipo y responde bien.. sin que se tilde ni otras cosas raras.. incluso le quiete la alimentacion al modem y le envie un sms cuando lo volvi a conectar.. leyo el mensaje q le habia mandado mientras estaba apagado y procede..

espero que a alguien le sirva.. y si sirve despues subo como esta conectado el modem sim340 con el pic.. tendria q sacarle alguna foto..

http://www.mediafire.com/?vig3lmoffxo0cf4 (http://www.mediafire.com/?vig3lmoffxo0cf4)

saludos
Título: Re: Int_rda
Publicado por: MGLSOFT en 07 de Enero de 2011, 19:11:20
No puedo bajarlo, después vuelvo a intentarlo...
Título: Re: Int_rda
Publicado por: calopsia en 07 de Enero de 2011, 21:53:55
yo probe el link y funciona.. algun problema de conexion debes tener.. o quizas justo fue el momento.. todo bien!

un saludo loco y gracias x el aguante!

Título: Re: Int_rda
Publicado por: MGLSOFT en 08 de Enero de 2011, 08:10:12
Ahora me dice:
Las replicas del servidor informan que no tienes derechos para descargar este archivo.

Podrás revisarlo??
Título: Re: Int_rda
Publicado por: calopsia en 08 de Enero de 2011, 12:28:39
aqui lo subo al foro.. no sabia q podia.. perdones..