Autor Tema: Int_rda  (Leído 8084 veces)

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

Desconectado calopsia

  • PIC12
  • **
  • Mensajes: 50
Int_rda
« 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!!!!
« Última modificación: 05 de Enero de 2011, 18:24:17 por un Moderador »

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Int_rda
« Respuesta #1 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... ;-) ;-)
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Int_rda
« Respuesta #2 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
El papel lo aguanta todo

Desconectado calopsia

  • PIC12
  • **
  • Mensajes: 50
Re: Int_rda
« Respuesta #3 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..

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Int_rda
« Respuesta #4 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.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado calopsia

  • PIC12
  • **
  • Mensajes: 50
Re: Int_rda
« Respuesta #5 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?

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Int_rda
« Respuesta #6 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:

Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado calopsia

  • PIC12
  • **
  • Mensajes: 50
Re: Int_rda
« Respuesta #7 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

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Int_rda
« Respuesta #8 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...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado calopsia

  • PIC12
  • **
  • Mensajes: 50
Re: Int_rda
« Respuesta #9 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..



Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Int_rda
« Respuesta #10 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??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Int_rda
« Respuesta #11 en: 06 de Enero de 2011, 19:21:36 »
Aquí una búsqueda de temas parecidos...

« Última modificación: 06 de Enero de 2011, 19:26:44 por MGLSOFT »
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado calopsia

  • PIC12
  • **
  • Mensajes: 50
Re: Int_rda
« Respuesta #12 en: 06 de Enero de 2011, 19:38:58 »
los habia leido a la mayoria.. pero ninguno busca lo que busco yo..gracias igual

Desconectado calopsia

  • PIC12
  • **
  • Mensajes: 50
Re: Int_rda
« Respuesta #13 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

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Int_rda
« Respuesta #14 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.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.


 

anything