Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

25/07/2013 #601


royer17486 dijo: Ver Mensaje
Este es el código.
Código:
#include ".....\SMS\sms.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LED  PIN_C0
 
char NUMERO[]="123456789";
int buffer[80];
char ok[]="OK";
char clave[]="ON";
 
#int_rda
void rda_isr(void){
if(kbhit()!=0)
{
//buffer[i++]=getc();
gets(buffer);
DatoRx=1;
}
}
 
 
void leer()
{
printf("AT+CMGL=");
putchar(0x22);
printf("REC UNREAD");
putchar(0x22);
putchar(0X0D);
 
 
if(DatoRx==1){
   if(strstr(buffer,clave)!=null&&strstr(buffer,NUMERO)!=NULL)
   { 
   lcd_putc("\fALARMA ON");
    output_high(STATUS_LED);
    init_buffer();
    delay_ms(500);
      DatoRx=0;
    flac=0;
    activado=1;
    }
}
 
 
void main()
{ 
   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);
   enable_interrupts(Global);
   enable_interrupts(INT_RDA);
printf("AT+CMGF=1");
putchar(0X0D);
delay_ms(500);
printf("AT+CNMI=1,2,0,0,0");
putchar(0X0D);
 
  while (TRUE) 
    {       
         leer_sms();
      if(activado==1)
       {
         output_high(LED);
       }
 
   }
 
}
Lo que necesito es recabar la información de los mensajes recibidos pero no leídos.
Buenas amigo. Esta semana empecé un proyecto igual que el tuyo para activar y desactivar una alarma.

Puedo enviar mensajes desde el pic sin problemas. Pero al momento de recibir un mensaje en el pic y querer darle una función al pic se me pega sin respuesta.

Por favor si solucionaste me puedes decir como lo hiciste. Seria de gran ayuda.

EStoy usando el pic16f877a, un modulo gsm SIM900 y programo con CCS Compiler.

un ejemplo de una función al leer el mensaje.

while (true){
IF (kbhit () ){ //Detecto si hay un carácter en la entrada
gets(dato); //Leer Mensaje de llegada después del enter que envía el SIM900
}

if(dato[1]== 'R' &&dato[2]== 'I' &&dato[3]=='N' &&dato[4]=='G'){ //Detecta si
//el mensaje dice RING
delay_ms(100);
puts("ATH"); //Tranco la llamada
delay_ms(300);
putchar(0x0d); //Envió un enter por acaso
printf("ATZ\r"); //Restauro el SIM900
delay_ms(2000);
output_high(pin_E2); //Pongo en alto el pin E2 para activar la alarma
lcd_init();
}


Saludos
31/10/2013 #602


buenas si alguien me puede ayudar estuve todo el dia con esto, tengo un pic18f4550 y un cel nokia 3220. la comunicacion con el nokia y la pc atraves de virtual terminal no tengo problemas pero no logro comunicar el nokia con el pic. programo en c18 estos son los comandos que utilizo para enviar:

Código:
putsUSART(dato1);         //dato1="AT\r\n";

    Delay10KTCYx(256);    
    Delay10KTCYx(256);
    Delay10KTCYx(256);    
    Delay10KTCYx(256);

    putsUSART(dato2);                 //dato2=AT+CMGF=1\r\n"
    Delay10KTCYx(256);
    Delay10KTCYx(256);
    Delay10KTCYx(256);    
    Delay10KTCYx(256);

    putsUSART(dato3);                  //dato3="AT+CMGS=\"2995510765\"\r\n";
    Delay10KTCYx(256);
    Delay10KTCYx(256);
    Delay10KTCYx(256);    
    Delay10KTCYx(256);
    Delay10KTCYx(256);
    Delay10KTCYx(256);
    Delay10KTCYx(256);    
    Delay10KTCYx(256);

    putsUSART(dato4);                 //dato4="Esto es una prueba";
    Delay10KTCYx(256);
    Delay10KTCYx(256);    
    Delay10KTCYx(256);

    putcUSART(0x1A);              //ese comando es ctl +z
       putsUSART(dato5);          //"\r\n"
    Delay10KTCYx(256);
    Delay10KTCYx(256);    
    Delay10KTCYx(256);           
    Delay10KTCYx(256);

    CloseUSART();            //cierra el puerto
por favor diganme cual es el error
26/11/2013 #603


bueno me contesto yo solo jaj, me faltaba el comando del enter. y todabia no lo probe pero mando los comandos letra por letra no como string, me resultaba mas facil verlos en el osciloscopio. ademas ahi me di cuenta que tenia mal identificado los cables, eso fue porque pense que el conector al cel empezaba en una rendija cuando en realidad empezaba en la siguiente jaj. ahora estoy viendo como mandar un string del micro (c18) al visual basic (c#) por medio de un textbox
26/02/2014 #604


---------- Actualizado después de 4 minutos ----------

Este programa lo que hace es detectar un RING cuando llamas por celular y después de ello inicia un contador descendente de 30 segundos a 0. De los 29 a los 27 segundos enciende un led y después de ello lo apaga (este led es para activar una carga por 2 segundos). El problema es que si lo hace pero solo una vez y después de hacer todo el ciclo ya no lo vuelve ah realizar, es decir marco al numero y ya no lo hace otra vez. alguien me puede orientar o dar su opinión.

Código:
#include <18F4550.h>
         #fuses PLL1,CPUDIV1,USBDIV,XTPLL,NOFCMEN,NOIESO,PUT,NOBROWNOUT,VREGEN,NOWDT,NOPBADEN,MCLR,NOSTVREN,NOLVP,NODEBUG,PROTECT,NOSTVREN,NOCPB,NOWRT      
         #use delay(clock=48000000) 
         //#include <lcd4x20.c>
         #use rs232(baud=9600, xmit=PIN_c6, rcv=PIN_c7, parity=N, bits=8)
         #byte porta = 0xF80 #byte portb = 0xF81 #byte portc = 0xf82 #byte portd = 0xf83 #byte porte = 0xf84
         #priority rda       
         
         #define BUFFER_SIZE 60 //Buffer size you can adjust this size
         char buffer[BUFFER_SIZE];            // buffer
         char b=0x00;                     // Last characters recived
         int  xbuff=0x00;
         int i; 
          
         int segundos=30,start=0;
         int1 desbordamiento=0;
         
         #INT_TIMER0
         void retardo_trm0 (void)
         {
         set_timer0(18660); desbordamiento=1;
         }        
         
         #int_RDA  
         RDA_isr() { if(kbhit()){b=getc();buffer[xbuff++]=b;}return 0;}
           
         void inicbuff(void)
         {for(i=0;i<buffer_size;i++){ buffer[i]=0x00; restart_wdt(); } xbuff=0x00; }
            
         void main()
         { 
         //lcd_init();
         inicbuff(); 
         enable_interrupts(int_rda); 
         enable_interrupts(INT_TIMER0);
         setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
         set_timer0(18660);
         enable_interrupts(global);
         
         
         while (true)
         {//lcd_gotoxy(2,1); printf(lcd_putc,"%02u",segundos);
         if(buffer[2]=='R' && buffer[3]=='I' && buffer[4]=='N' && buffer[5]=='G') { delay_ms(100); start=1;}  
         if (start==1 && desbordamiento==1) { desbordamiento=0; segundos--; }       
         if (segundos<=29 && segundos>=27){ output_high(pin_a0);}                                                               
         if (segundos<=26 && segundos>=1){ output_low(pin_a0); 
         if (segundos==0){ segundos=30; start=0; inicbuff(); }}                                                                         
         }         
         }
---------- Actualizado después de 7 minutos ----------

El PDF adjunto les indica como recibir sms. Bien explicado espero les sea de gran ayuda.
Archivos Adjuntos
Tipo de Archivo: pdf 135868878-Control-Gsm.pdf (785,8 KB (Kilobytes), 114 visitas)
27/02/2014 #605

Avatar de papirrin

ya viste si se tiene que reiniciar alguna bandera en la interrupcion RDA.

estuve viendo y podria ser esta:
bit 3 SSPIF: Master Synchronous Serial Port Interrupt Flag bit
1 = The transmission/reception is complete (must be cleared in software)
0 = Waiting to transmit/receive
27/02/2014 #606


Que tal amigo, gracias por responder. Lo que yo había hecho hera desabilitar la interrupción rda después del if que detectaba el RING y la volvía a habilitar cuando segundos= 0. Pero un flag como bandera no lo hice. Donde podría ir?
27/02/2014 #607

Avatar de papirrin

aqui:

#int_RDA
RDA_isr() { if(kbhit()){b=getc();buffer[xbuff++]=b;}return 0;pir1.3=0;}

el registro es el pir1 y el bit es el 3, no se que compilador utilizas por eso pongo pir1.3 pero podria ser otra manera de llamarlo.
27/02/2014 #608

Avatar de papirrin

me quede pensando, si es CCS me parece que es asi:
#int_RDA
RDA_isr() { if(kbhit()){b=getc();buffer[xbuff++]=b;}return 0;clear_interrupt(int_rda);}
27/02/2014 #609


Ok, lo voy aplicar y posteó el código cuando este haciendo lo requerido. Gracias por tu cooperar
En el foro todopic no me contestó nadie.

De cualquier manera cualquier ayuda es bienvenida. Gracias amigos del foro.
21/03/2014 #610


Resuelto!!!
Bien, pues ya logré encender un led con una llamada a celular.
Después de detectar un RING enciende un led durante 2 segundos y lo apaga.

Aquí se los dejo. Dios les bendiga hnos.

[code]#include <18F4550.h>
#fuses PLL1,CPUDIV1,USBDIV,XTPLL,NOFCMEN,NOIESO,PUT,NOBRO WNOUT,VREGEN,NOWDT,NOPBADEN,MCLR,NOSTVREN,NOLVP,NO DEBUG,PROTECT,NOSTVREN,NOCPB,NOWRT
#use delay(clock=48000000,RESTART_WDT)
//#include <lcd4x20.c>
#use rs232(baud=9600, xmit=PIN_c6, rcv=PIN_c7, parity=N, bits=8,restart_wdt)
#byte porta = 0xF80 #byte portb = 0xF81 #byte portc = 0xf82 #byte portd = 0xf83 #byte porte = 0xf84
#priority rda

#define BUFFER_SIZE 60
char buffer[BUFFER_SIZE];
char b=0x00;
int xbuff=0x00;
unsigned int16 seg=0;
int1 desborde=0,star=0;

#INT_RTCC
void clock_isr()
{ set_timer0(19531); desborde=1; }

#int_RDA
RDA_isr() { if(kbhit()){ b=getc(); buffer[xbuff++]=b; } return 0; clear_interrupt(int_rda); }

void inicbuff(void)
{ int i; for(i=0;i<buffer_size;i++){ buffer[i]=0x00; restart_wdt(); } xbuff=0x00; }

void main()
{
//lcd_init();
inicbuff();
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256 );
set_timer0(19531);
enable_interrupts(INT_RTCC);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
star=0; desborde=0;

while (true)
{
//lcd_gotoxy(2,1); printf(lcd_putc,"%02lu",seg);
if (buffer[2]=='R' && buffer[3]=='I' && buffer[4]=='N' && buffer[5]=='G') { printf("AT+CHUP");delay_ms(100); inicbuff(); star=1;}
if (star==1 && desborde==1) {desborde=0; seg++;}
if (seg>=1 && seg <=3) {output_high(pin_a0);}
if (seg>=4 && seg<=15) {output_low(pin_a0);}
29/06/2014 #611

Avatar de kapotik

hola necesito enviar un mensaje a multiples destinatarios, alguien sabe como seria en comandos at?
saludos
30/06/2014 #612
Moderador

Avatar de Chico3001

Creo que no puedes.. forzosamente necesitas usar variasveces el mismo comando AT
23/02/2016 #613


Hola. ¿Qué tal?
Tengo un shield GSM/GPRS SIM900 y un Arduino Mega 2560.
Lo único que logré hacer hasta ahora, es que la placa envíe mensajes de texto y también llame a un celular.

Lo que no me funciona es recibir mensajes o llamadas desde un celular.
Adjunto el código para recibir SMS desde el celular porque la verdad no sé por qué no me funciona.

El programa debería de encender un LED conectado al pin 13 de la Mega 25560 cada vez que se manda un SMS desde un celular hacia la placa GSM.

Código PHP:
#include <SoftwareSerial.h>
SoftwareSerial SIM900(78);

char incoming_char=0;

void setup()
{
  
Serial.begin(19200); // for serial monitor
  
SIM900.begin(19200); // for GSM shield
  
SIM900power();  // turn on shield
  
delay(20000);  // give time to log on to network.

  
SIM900.print("AT+CMGF=1\r");  // set SMS mode to text
  
delay(100);
  
SIM900.print("AT+CNMI=2,2,0,0,0\r"); 
  
// blurt out contents of new SMS upon receipt to the GSM shield's serial out
  
delay(100);
}

void SIM900power()
// software equivalent of pressing the GSM shield "power" button
{
  
digitalWrite(9HIGH);
  
delay(1000);
  
digitalWrite(9LOW);
  
delay(7000);
}

void loop()
{
  
// Now we simply display any text that the GSM shield sends out on the serial monitor
  
if(SIM900.available() >0)
  {
    
incoming_char=SIM900.read(); //Get the character from the cellular serial port.
    
Serial.print(incoming_char); //Print the incoming character to the terminal.
    
analogWrite(13,255);
    
delay(2000);
    
analogWrite(13,0);
    
delay(2000);
  }

05/07/2016 #614


Hola compañeros tengo una duda con los comandos AT
Cuando estoy configurando la preferencia de almacenado
AT+CPMS=\"SM\",\"SM\"\r" . Yo mando el comando al módem y el módem me
responde OK MS:5,30,5,30.
Entiendo que el módem comprendio lo enviado por que me devuelve el OK
pero eso números (5,30,5,30.) que significan.
El módem es un SIM900
05/07/2016 #615


nelsonr dijo: Ver Mensaje
Hola compañeros tengo una duda con los comandos AT
Cuando estoy configurando la preferencia de almacenado
AT+CPMS=\"SM\",\"SM\"\r" . Yo mando el comando al módem y el módem me
responde OK MS:5,30,5,30.
Entiendo que el módem comprendio lo enviado por que me devuelve el OK
pero eso números (5,30,5,30.) que significan.
El módem es un SIM900
Hola...En la actualidad tenes 5 mensajes almacenados de 30 posibles de capacidad.
Puedes consultar aquí o en la pagina del fabricante tiene unos lindos archivos PDF con toda la información y comandos.
Saludos.

Ric.
Imágenes Adjuntas
Tipo de Archivo: jpg sim.jpg (12,6 KB (Kilobytes), 61 visitas)
05/07/2016 #616


Hola nelsonr:
El modem devuelve el estado de los almacenamientos preferidos seleccionados....

Del numero total de mensajes que puede almacenar la tarjeta SIM (esa en concreto 30) :
5 del total de 30 están utilizados como leídos, para leer o para borrar.
5 del total de 30 están utilizados como mensajes para enviar o enviados.

Salu2.

nelsonr dijo: Ver Mensaje
Hola compañeros tengo una duda con los comandos AT
Cuando estoy configurando la preferencia de almacenado
AT+CPMS=\"SM\",\"SM\"\r" . Yo mando el comando al módem y el módem me
responde OK MS:5,30,5,30.
Entiendo que el módem comprendio lo enviado por que me devuelve el OK
pero eso números (5,30,5,30.) que significan.
El módem es un SIM900
05/07/2016 #617


Muchas gracias compañero por su ayuda. Y discúlpeme pero ahí intrusiones que por mas que lea el manual me quedan dudas.
24/08/2016 #618


Hola. ¿Qué tal? Encontré este modem entre mis cosas del trabajo.
¿Alguien que me diga qué aplicación le puedo dar, o si ya están descontinuados?
Gracias.
Imágenes Adjuntas
Tipo de Archivo: jpg 20160824_105420.jpg (48,0 KB (Kilobytes), 7 visitas)
24/08/2016 #619


Hola compañeros tengo una consulta yo estoy usando el kbhit() para atrapar cadenas que lleguen a mi Pic por el #use rs232.
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, stream=COM1)
Este puerto lo tengo conectado a un módem GSM sim900 con el fin es de recibir mensajes SMS y enviar la cadena al Pic y poderlos procesar. Si la cadena que llega del módem producto del sms llega al pic con el símbolo !, Me debe tomar el resto de la cadena ignorando el simbolo de !.
De esta manera se hace para distintas cadenas que lleguen con caracteres específicos al PIC por medio del kbhit().
Cada cadena que llegue al PIC con esta característica debe hacer algo en particular en el programa .
Pero mi problema esta en que hay veces que funciona todo bien sin problemas pero hay veces que no responde cuando le mando un sms al módem sim900

Mi pregunta es, en ISIS de Proteus hay alguna forma que yo pueda mandarle datos al Pic para emullar una cadena enviada por el moden esto con el fin de saber si es que estoy dejando alguna variable que no cumpla con lo necesario al momento de que entre al el dato al kbhit().
O la intermitencia que tengo es producto de que necesito algo mas para poder acoplar correctamente el pic con mi modem sim900.
Cuando estoy emulando mi proyecto en proteus 7 no encuentro donde puedo ver los valores que están tomando las variables en ejecución.
Les agradezco los comentario de ante mano.
Nota estoy usando un pic16f877a , pic ccs compiler y proteus 7
06/09/2016 #620


hola a todos una pregunta, yo quiero tomar un sms que tengo guardado en la sim y enviarlo a un numero x via sms, pero no estoy claro de como seria el método apropiado si primero tengo que cargar el mensaje en el buffer o hay alguna forma de enviarlo sin cargarlo.
Les agradezco el tiempo dedicado.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.