Uso de un celular GSM con PIC o PC

gracias por los comentarios, me sirvieron bastante. logre hacer encender un led con un ring, pero ahora tengo otro problema. Al colocar la interrupcion por usart, la pic queda en blanco. Hace todo lo que esta en void main(), hasta el while(true), ahi deberia mostrar la conversion A/D de dos potenciometros conectados a los pines A0 y A1. pero el display LCD queda en blanco. alguien me podria ayudar por favor.

gracias

#include "16f877a.h" // Pic a utilizar
#device adc=10 // Usa resolución de 10 bits
#use delay(clock=20000000) // Cristal 20 MHz
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include <string.h>
#include <stdlib.h>

#fuses hs,nowdt,nobrownout,nolvp,noprotect // Fusibles
#define use_portb_lcd TRUE
#include "lcd420.c"
#byte TRISD = 0x88
#byte PORTD = 0x08


#INT_RDA
void serial_isr(void)
{
}

long int temperatura;
long int humedad;
long int esc_humedad;
long int esc_temperatura;
long int extremo=500;
long int extremo_2=45;
char dato_mensaje[];
char mensaje[60]={0};
int est=2;
int est_t=2;
int i=0;

void serial(void){
disable_interrupts(INT_RDA);

if(kbhit()){
mensaje = getc();
while(mensaje != '\r')
{
i++;
mensaje=getc();
}
}
lcd_putc('\f');
for(i=0;i<15;i++)
{
printf(lcd_putc,"%c",mensaje);
}
enable_interrupts(INT_RDA);


void main ()
{
lcd_init();
set_tris_d(0x00); // puerto D como salida
lcd_putc("Inicializando");
PORTD=0x00;
output_high(PIN_D2);
printf("ATQ0\r\n");
lcd_putc('\f');
lcd_putc("ATQ0");
delay_ms(1000);
printf("AT+CMGF=1\r\n"); // Modo texto
lcd_putc('\f');
lcd_putc("AT+CMGF=1");
delay_ms(1000);
printf("ATD87663847;\r\n"); // realiza una llamada telefonica
lcd_putc('\f');
lcd_putc("ATD87663847;");
delay_ms(5000);
delay_ms(5000);
printf("AT+CHUP\r\n"); // corta la llamada.
lcd_putc('\f');
lcd_putc("AT+CHUP");
delay_ms(1000);
printf("AT+CNMI=1,2,0,0,0\r\n"); // espera mensaje
lcd_putc('\f');
lcd_putc("AT+CNMI=1,2,0,0,0");
delay_ms(1000);
lcd_putc('\f');
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);

while (true)
{
setup_adc (adc_clock_internal);
setup_adc_ports(RA0_RA1_analog_RA3_REF);

set_adc_channel (0); // Elige canal analogico a medir
delay_us (20); //espera 20 microseg
temperatura=read_adc (); // Hace conversión A/D
lcd_gotoxy(1,1); // Acomoda cursor LCD
printf(lcd_putc,"Temp= %lu ",temperatura);

set_adc_channel (1); // Elige canal analogico a medir
delay_us (20); //espera 20 microseg
humedad=read_adc (); // Hace conversión A/D
esc_humedad=(humedad*60)/1023;
lcd_gotoxy(1,2);
printf(lcd_putc,"Humed= %lu ",esc_humedad);

if (temperatura>extremo)
{
for(est_t;est_t>1;est_t--)
{
output_high(PIN_D1);
printf("AT+CSCA=\"+5698890005\"\r\n");
delay_ms(500);
printf("AT+CMGS=\"xxxxxxxx\"\r\n");
delay_ms(500);
printf("ALERTA 2\r\n");
putc(26);
printf("\r\n");
//output_high(PIN_D1);
//delay_ms(300);
}
}
else
{
output_low(PIN_D1);
est_t=2;
}

if (esc_humedad>extremo_2)
{
for(est;est>1;est--)
{
output_high(PIN_D0);
printf("AT+CSCA=\"+5698890005\"\r\n");
delay_ms(500);
printf("AT+CMGS=\"xxxxxxxx\"\r\n");
delay_ms(500);
printf("ALERTA\r\n");
putc(26);
printf("\r\n");
//output_high(PIN_D0);
//delay_ms(300);
}
}
else
{
output_low(PIN_D0);
est=2;
}
//delay_ms (300);
}
}
 
Hola bacocio, como va, y el lcd ya te muestra algo antes?

te hago una pregunta de tu codigo, vos pudiste leer un mensaje?
el siguiente comando: AT+CNMI=1,2,0,0,0 que aparentemente usas para esperar un mensaje es un comando standart? donde se guarda el mensaje?
te pregunto esto por que yo en mi proyecto que esta en paginas anteriores no hubo caso no pude leer un mensaje de ninguna manera, igual nose si ese comando estara en el celu que use yo el se t290.

saludos
 
hola sdel, si , si me muestra los comandos que estoy enviando, el ATQ0, ATDXXXXXXX; , pero lo que no puedo es recepcionar mensajes. al momento de poner la interrupcion, el display queda en blando. o sea muestra los mensajes que te dije anteriormente, pero al momento de medir el analogo digital queda en blando.
yo creo que la interrupcion por usart esta mal puesta
 
estimados señores.....
quisiera por favor que me puedan colaborar con un circutio que me esta quitando el sueño, y es precisamente el de conectar un microcontrolador a un celular sony erickson k750i tengo entendido que tiene puerto serial para manejar su modem busuqe los pinout y no tengo ni idea de como conectarlo ni donde .
aclaro que spude manejar su modem del celular mediante la computadora mediante comandos AT, ahora lo que quiero es manejarlo para que el microcontrolador mande un sms por medio del modem del celular necesito saber si alguien ya probo esto con el modelo del celular.

porfavor ayudaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........
 


moyano gracias por la direccion tome en cuenta tu sugerencia y muchas gracias pero lamentablemente hize la conexion con indica:

tx del microcontrolador al pin de rx del celular (pin 11 del cel k750i)
puse tierra comun a la alimentacion del microcontrolador y del celular, regule voltage con un
680 ohm
zener tx micro ------/\/\/\/\-----|-------------------------rx del microcontrolador
---
/\ diodo zener 3.3
----
|
tierra

es asi como o arme y estoy seguro que los comados at que mando son los correctos por que ya lo trabaje desde la compu con el driver de conversion usb a serial propio de sony ericsson

les pido que me puedan ayudar porfa si debo darles mas datos no hay problema
gracias de ante mano
 
gracias ericklarva tu respuesta no s tan clara sin embargo viendo la pagina que me sugieres y segun los pin out de este celular no hay conexion rs 232 eseso lo que quieres decir???????

con lo del ingles no voy tan bien pero con lo poco que revise no hay nada que tenga que ver con modem rs232 de este modelo en la pagina que me sugieres.

gracias de todas maneras estare mas atento y sperando pronta ayuda graciassssssss
 
Que tal hermano pues yo he podido enviar comndos at pero no recibir, me podrias yudar con un ejemplo bsico para la recepción de comandos AT. Ya he leido la informacion de este block y todo esta interesante pero me gustaria una simulcion del transmisor y del receptor, gracias..
 
Hola estube colgado con el proyecto pero volvi jej.
sigo haciendo las pruebas con el celular y el hiperterminal.
el celular es sony ericsson t290, hasta hora pude leer un mensaje nuevo y realizar llamadas desde el terminal, lo que no logro es enviar un mensaje, nose por que me dice error, pego una imagen de mi prueba en el hiperterminal.

alguien sabe por que puede pasar esto?

ya tengo el codigo para el pic, hoy voy a tratar de armarlo en el proto aver si con el pic si envia.

en un momento pude escribir el mensaje y al presionar control + z como que intentaba enviar pero no enviaba y daba error, pero despues ni siquiera podia escribir.
si alguien le paso lo mismo?

buen dia, a mi me paso igual a ti. el prolema era que at+csca estaba mal configurado.
creo, depende del lugar donde te encuentres, en mexico yo puse at+csca= +5294100001410 de telcel. luego los demas comandos y funciono a la perfeccion.

tienes que investigar tu correspondiente at+csca. espero y te sirva.

saludos.
 
EDITO:
Me voy a responder a mi mismo, buscando y buscando vi que el RS232 del pic tiene un buffer de dos caracteres, por lo tanto, necesito del uso de interrupciones.
El codigo de interrupciones que postee anteriormente, tengo codigo para que me muestre por pantalla lcd a traves de I2C el codigo leido, lo cual supongo crea un retardo muy grande, que era el problema(no le daba tiempo a recoger todos los caracteres).
Solución: creo una variable char buffer[300]; y voy añadiendo al final lo que me llega al saltar la interrupción.

hola k tal ammigo un saludo.
estoy realizando un proyeco similar al tuyo en diferencia que el telefono celular que estoy utlizando es el nokia 3220, ya hago llamadas con el pic, puedo mandar mensajes sin problemas con el pin mi problema al resivir un mensaje en el pic y al momento de mostrar ese mensaje en la lcd salamente se aprecia un AT (algo parecido entendi que te paso a ti). creo que el problema esta en la interrupcion usar de pic, programo en picc ya estado haciendo varios intentos sin fortuna. te agradesco cualquier ayuda para resolver este problema... saludos y que estes bien.
 
La duda es como filtrar el sms luego de leerlo con AT+CMGD=1 en CCS ya que solo nos interesaria el sms como tal y se recibe esto :
+CMT: “+541155554444,”10/9/22,14:12:34”
MENSAJE
Entonces toca filtrar MENSAJE, ya lo he hecho y funciona perfecto en simulacion pero ya en la practica tiene fallas. Si alguien puede postear algo de codigo explicando esto se les agradece,

leyendo en el foro me tope con tu caso que es algo me pasa a mi y ya no hayo realmente que hacer.. bueno para empezar estoy realizando un proyecto el cual al enviar un sms (de cualquier otro cel) me va activar una bomba para llenar deposito de agua. el recibir este mensaje en la terminal del pozo, se activa dicha bomba y me devuelve un mensaje diciendome el valor de unas variables (nivel de agua del deposito y temparatura de agua).

bueno ya tengo muchos avances como:
uso el telefono celular nokia 3220 controlandolo mediante comandos AT y programo en pic CCs y asm
1) pueda hacer llamadas a otros cel con hyperterminal y con el pic no hay problema es eso.
2) puedo manda mensajes mediante hypertermina y con el pic incluso ya puedo mandar las variables en el mensaje.
3) puedo recibir mensajes solamente en hyperterminal..

por lo que para concluir este proyecto me falta recibir mensajes con elpic pero cuando llega el mensaje al cel (al nokia 3220) no puedo guardarlo en la memoria del pic para poderlo decodificar y despues mostrarlo en la lcd...

pienso que el error que posiblemente tengo es la habilitacion de interrupciones (en CCS)al momento de que llega el mensaje, cuando llega el mensaje lo tomo como un string y despues lo muestro el la lcd y nada mas me muestra en la lcd una A enseguida de un T. otra prueba que el hecho es con asm de ir checando caracter por caracater y guardandolo en la memoria de pic y mosrandolo en la lcd, pero sin resultados satisfactorios..

si tienes alguna sugerencia que me puedas dar para solucionar este problema sera bien recibida. espero tu respuesta

k estes bien y saludos..
 
leyendo en el foro me tope con tu caso que es algo me pasa a mi y ya no hayo realmente que hacer.. bueno para empezar estoy realizando un proyecto el cual al enviar un sms (de cualquier otro cel) me va activar una bomba para llenar deposito de agua. el recibir este mensaje en la terminal del pozo, se activa dicha bomba y me devuelve un mensaje diciendome el valor de unas variables (nivel de agua del deposito y temparatura de agua).

bueno ya tengo muchos avances como:
uso el telefono celular nokia 3220 controlandolo mediante comandos AT y programo en pic CCs y asm
1) pueda hacer llamadas a otros cel con hyperterminal y con el pic no hay problema es eso.
2) puedo manda mensajes mediante hypertermina y con el pic incluso ya puedo mandar las variables en el mensaje.
3) puedo recibir mensajes solamente en hyperterminal..

por lo que para concluir este proyecto me falta recibir mensajes con elpic pero cuando llega el mensaje al cel (al nokia 3220) no puedo guardarlo en la memoria del pic para poderlo decodificar y despues mostrarlo en la lcd...

pienso que el error que posiblemente tengo es la habilitacion de interrupciones (en CCS)al momento de que llega el mensaje, cuando llega el mensaje lo tomo como un string y despues lo muestro el la lcd y nada mas me muestra en la lcd una A enseguida de un T. otra prueba que el hecho es con asm de ir checando caracter por caracater y guardandolo en la memoria de pic y mosrandolo en la lcd, pero sin resultados satisfactorios..

si tienes alguna sugerencia que me puedas dar para solucionar este problema sera bien recibida. espero tu respuesta

k estes bien y saludos..
Bueno hace tiempos tuve este problema pero ya lo resolví. Para lograr filtrar solo el sms debes contar los 0D y los 0A que hay al inicio y fin de esa cadena. Es sencillo, luego en proyectos mas avanzados surgió ademas de obtener el sms la necesidad de guardar el numero del cel que envía el sms para luego compararlo igualmente lo hice filtrando las comillas, comas " , es sencillo....

1Roland1 dijo:
Bueno hace tiempos tuve este problema pero ya lo resolví. Para lograr filtrar solo el sms debes contar los 0D y los 0A que hay al inicio y fin de esa cadena. Es sencillo, luego en proyectos mas avanzados surgió ademas de obtener el sms la necesidad de guardar el numero del cel que envía el sms para luego compararlo igualmente lo hice filtrando las comillas, comas " , es sencillo....

Lo que realmente recibe tu pic desde el cel es esto:

0D0A+CMT: "+59395680131",,"11/03/04,12:09:27-20"0D0A
AQUI VA EL TEXTO DEL SMS0D0A

Entonces si te fijas en los 0D y 0A en las "comillas" y las ,,, comas por ahi tienes que jugar con eso y lograras filtrar lo que sea. Espero te sirva

Saludos
 
Última edición:
Amigos de favor puedes ayudarme a transladar este codigo a 20Hhz, el problema es que no he podido configurar el tmr0. A 4Mhz trabaja bien, cambio los fuses para 20Mhz pero el tmr0 no lo se. Pueden ayudarme porfavor...(y)


#include <18F4550.h>
#fuses NOWDT, WDT128, XT, NOPROTECT, BROWNOUT, NOPUT, NOCPD
#fuses NOSTVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOIESO, NOFCMEN, NOPBADEN
#fuses NOWRTC, NOWRTB, NOEBTR, NOEBTRB, NOCPB, NOLPT1OSC, MCLR, NOXINST
#use delay(clock=4000000)
#use i2c(Master, SDA=PIN_A0, SCL=PIN_A1)

#byte pb =0xF81 // Dirección del puerto B para la familia 18Fxx5
#bit t_ok =pb.5
#bit t_mas =pb.6
#bit t_mns =pb.7

#byte intcon =0xFF2
#byte intcon3 =0xFF0
#bit intf =intcon.1
#bit intf1 =intcon3.0
#bit intf2 =intcon3.1

#include <lcd4x20d.c>
#include <ds1307.h>
#include <menu.h>

void actualizar_salidas(void);
void actualizar_pantalla(void);
void lectura_rtc(void);

unsigned int8 hora_actual, mins_actual;
unsigned int8 n;

void main()
{
port_b_pullups(true);
setup_adc_ports(NO_ANALOGS);
lcd_init();

menu_modo();

intf=0; intf1=0; intf2=0;
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64);
set_timer0(49911);

//enable_interrupts(INT_EXT);
//enable_interrupts(INT_EXT1);
//enable_interrupts(INT_EXT2);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);

while(true)
{
actualizar_salidas();
actualizar_pantalla();
}
}


void lectura_rtc(void)
{
leer_ds1307();
}

void actualizar_salidas(void)
{
hora_actual=registros_ds1307[horas];
mins_actual=registros_ds1307[minutos];
}

void actualizar_pantalla(void)
{
lcd_gotoxy(1,1);
printf(lcd_putc,"%02u:%02u:%02u %02u/%02u/%02u",registros_ds1307[horas],registros_ds1307[minutos],registros_ds1307[segundos],registros_ds1307[dias],registros_ds1307[meses],registros_ds1307[anios]);
}


#INT_TIMER0
interrupcion_tmr0()
{
n++;
lectura_rtc();
if(n==30){n=0;;}
set_timer0(49911);
}
 
Bueno hace tiempos tuve este problema pero ya lo resolví. Para lograr filtrar solo el sms debes contar los 0D y los 0A que hay al inicio y fin de esa cadena. Es sencillo, luego en proyectos mas avanzados surgió ademas de obtener el sms la necesidad de guardar el numero del cel que envía el sms para luego compararlo igualmente lo hice filtrando las comillas, comas " , es sencillo....



Lo que realmente recibe tu pic desde el cel es esto:

0D0A+CMT: "+59395680131",,"11/03/04,12:09:27-20"0D0A
AQUI VA EL TEXTO DEL SMS0D0A

Entonces si te fijas en los 0D y 0A en las "comillas" y las ,,, comas por ahi tienes que jugar con eso y lograras filtrar lo que sea. Espero te sirva

Saludos

buen dia a todos.

te saludo con la grata novedad, que en mi proyecto pic-nokia 3220, ya puedo leer los mensajes y desifrarlos para una determinada aplicacion, solo que me aparecio un problema del cual no he podido resolver, bien a hora lo voy a expliacar experando que alguien me pueda orientar.

codigo que funciona bien: este parte de codigo funciona perfectamente para recibir un mensaje.
#include <16f877a.h>
#FUSES nowdt,xt,noprotect
#use delay (clock=4000000)
#use rs232(baud=9600,parity=N,xmit=pin_c6,rcv=pin_c7,bits=8,stop=1)
.
.
#int_rda
void serial_isr() // Interrupcion recepcion serie USART
{
rcvchar=0x00; //inicializo el caracter recibido
rcvchar=getchar(); // lo descargo
addcbuff(rcvchar); //lo añado al buffer
}


solo que haora tengo la necesidad de poner una interrupcion extra, externa que es por rb0. con la funcionalidad que a la hora que se active mandar un mensaje, entoces hago lo abitual y tambien lo habilito correctamente. solo que haora, al poner el codigo relacionado con la interrupcion externa rb0, la simulacion deja de funcionar correctamente, es como si de alguna manera el solo poner el codigo relacionado con la interrupcion rb0, la interupcion #int_rda dejara de hacer su tarea correctamente. si canselo la parte correspondiente a la #int_rda poniendolo como texto de ayuda /*todo la funcion #int_rda*/, la interupcion externa por rb0 funciona correctamente, si haora hago lo contrario poniendo como texto de ayuda /*toda la funcion #int_ext */, la interrupcion #int_rda vuenbe a hacer todo su trabajo correctamente.

en conclusion el poner el codigo de #int_ext, afecta el funcionamiento de la #int_rda.

#include <16f877a.h>
#FUSES nowdt,xt,noprotect
#use delay (clock=4000000)
#use rs232(baud=9600,parity=N,xmit=pin_c6,rcv=pin_c7,bits=8,stop=1)
.
.

#int_ext
void ext_isr(void)//Interrupcion externa que cuando se activa manda un mensaje al
{ //al usuario con los datos de los sensores del sistema.
delay_ms(50);
enviarMSM();
}

#int_rda
void serial_isr() // Interrupcion recepcion serie USART
{
rcvchar=0x00; //inicializo el caracter recibido
rcvchar=getchar(); // lo descargo
addcbuff(rcvchar); //lo añado al buffer
}


espero ser claro, si necesitan mas datos para entenderme mejor solo diganmelo.

sin mas que decir, me despido, saludos.
 
Saludos no se si te interese pero en este blog http://microcon-unp.blogspot.com encotraras aplicaciones GSM y GPS con PIC en usando el compilador PIC Basic Pro compiler.. alli hay aplicaciones como las que te interesa..alli pudes bajar un ebook


gracias por los comentarios, me sirvieron bastante. logre hacer encender un led con un ring, pero ahora tengo otro problema. Al colocar la interrupcion por usart, la pic queda en blanco. Hace todo lo que esta en void main(), hasta el while(true), ahi deberia mostrar la conversion A/D de dos potenciometros conectados a los pines A0 y A1. pero el display LCD queda en blanco. alguien me podria ayudar por favor.

gracias

#include "16f877a.h" // Pic a utilizar
#device adc=10 // Usa resolución de 10 bits
#use delay(clock=20000000) // Cristal 20 MHz
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include <string.h>
#include <stdlib.h>

#fuses hs,nowdt,nobrownout,nolvp,noprotect // Fusibles
#define use_portb_lcd TRUE
#include "lcd420.c"
#byte TRISD = 0x88
#byte PORTD = 0x08


#INT_RDA
void serial_isr(void)
{
}

long int temperatura;
long int humedad;
long int esc_humedad;
long int esc_temperatura;
long int extremo=500;
long int extremo_2=45;
char dato_mensaje[];
char mensaje[60]={0};
int est=2;
int est_t=2;
int i=0;

void serial(void){
disable_interrupts(INT_RDA);

if(kbhit()){
mensaje = getc();
while(mensaje != '\r')
{
i++;
mensaje=getc();
}
}
lcd_putc('\f');
for(i=0;i<15;i++)
{
printf(lcd_putc,"%c",mensaje);
}
enable_interrupts(INT_RDA);


void main ()
{
lcd_init();
set_tris_d(0x00); // puerto D como salida
lcd_putc("Inicializando");
PORTD=0x00;
output_high(PIN_D2);
printf("ATQ0\r\n");
lcd_putc('\f');
lcd_putc("ATQ0");
delay_ms(1000);
printf("AT+CMGF=1\r\n"); // Modo texto
lcd_putc('\f');
lcd_putc("AT+CMGF=1");
delay_ms(1000);
printf("ATD87663847;\r\n"); // realiza una llamada telefonica
lcd_putc('\f');
lcd_putc("ATD87663847;");
delay_ms(5000);
delay_ms(5000);
printf("AT+CHUP\r\n"); // corta la llamada.
lcd_putc('\f');
lcd_putc("AT+CHUP");
delay_ms(1000);
printf("AT+CNMI=1,2,0,0,0\r\n"); // espera mensaje
lcd_putc('\f');
lcd_putc("AT+CNMI=1,2,0,0,0");
delay_ms(1000);
lcd_putc('\f');
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);

while (true)
{
setup_adc (adc_clock_internal);
setup_adc_ports(RA0_RA1_analog_RA3_REF);

set_adc_channel (0); // Elige canal analogico a medir
delay_us (20); //espera 20 microseg
temperatura=read_adc (); // Hace conversión A/D
lcd_gotoxy(1,1); // Acomoda cursor LCD
printf(lcd_putc,"Temp= %lu ",temperatura);

set_adc_channel (1); // Elige canal analogico a medir
delay_us (20); //espera 20 microseg
humedad=read_adc (); // Hace conversión A/D
esc_humedad=(humedad*60)/1023;
lcd_gotoxy(1,2);
printf(lcd_putc,"Humed= %lu ",esc_humedad);

if (temperatura>extremo)
{
for(est_t;est_t>1;est_t--)
{
output_high(PIN_D1);
printf("AT+CSCA=\"+5698890005\"\r\n");
delay_ms(500);
printf("AT+CMGS=\"xxxxxxxx\"\r\n");
delay_ms(500);
printf("ALERTA 2\r\n");
putc(26);
printf("\r\n");
//output_high(PIN_D1);
//delay_ms(300);
}
}
else
{
output_low(PIN_D1);
est_t=2;
}

if (esc_humedad>extremo_2)
{
for(est;est>1;est--)
{
output_high(PIN_D0);
printf("AT+CSCA=\"+5698890005\"\r\n");
delay_ms(500);
printf("AT+CMGS=\"xxxxxxxx\"\r\n");
delay_ms(500);
printf("ALERTA\r\n");
putc(26);
printf("\r\n");
//output_high(PIN_D0);
//delay_ms(300);
}
}
else
{
output_low(PIN_D0);
est=2;
}
//delay_ms (300);
}
}
 
Atrás
Arriba