Autor Tema: Recibir SMS con PIC16f877A y SIM800L  (Leído 24157 veces)

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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #45 en: 06 de Septiembre de 2018, 14:04:45 »
No me refiero a que el modulo entregue caracteres extraños, sino que vos tenes que asegurarte de que SI o SI únicamente reconozca "Dato" todo seguido ,  y no que reconozca un caracter 'D' y luego si llega una 'a' luego de pasado otros caracteres lo tome como correcto y continuacion de "Dato".

El continue no se que efecto tendria, siempre lo use sobre un loop ( for/while ) pero asumiendo cualquiera de las 2 opciones que puede haber que serian:
- Que salga de la interrupcion,
- Que no tenga efecto y siga al otro if

Ambas posibilidades harian que tu codigo no funcione como debe ser.

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #46 en: 06 de Septiembre de 2018, 16:12:12 »
No se si el "continue" u otra cosa, pero algo mal hay seguro.. no hay forma de que me reconozca bien el sms o que guarde la palabra dato.. O también  puede que tenga algo mal en el while(true) 

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #47 en: 07 de Septiembre de 2018, 17:02:23 »
No hay forma de recibir nada.. ninguno de los programas que intento hacer me funcionan.  :5] :5] :5] :5] :5] :5] :5]
trato de imprimir el buffer en un display lcd para ver que me llega y no me imprime nada.

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #48 en: 07 de Septiembre de 2018, 17:21:07 »
Subo nuevamente el código por si alguno encuentra alguno problema o me puede ayudar de alguna otra forma.

Código: C++
  1. //LCD module connections
  2. #define LCD_RS_PIN PIN_B0
  3. #define LCD_RW_PIN PIN_B1
  4. #define LCD_ENABLE_PIN PIN_B2
  5. #define LCD_DATA4 PIN_B3
  6. #define LCD_DATA5 PIN_B4
  7. #define LCD_DATA6 PIN_B5
  8. #define LCD_DATA7 PIN_B6
  9. //End LCD module connections
  10.  
  11. #include <16F877.h>
  12. #include <stdio.h>
  13. #include <string.h>
  14. #FUSES XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP    
  15. #use delay(clock=4M)
  16. #use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)
  17.                          
  18. #include <lcd.c>
  19.  
  20. #USE standard_io(b)
  21.  
  22.  
  23. char sms_in [80];
  24. char dato []="Dato";
  25. int a=0;
  26. int b=0;
  27. int i=0;
  28. char c=0;
  29.  
  30.  
  31.  
  32. #int_RDA
  33.  
  34. void serial_isr (void)
  35.    {
  36.     if (kbhit())
  37.       {
  38.        c=getc();
  39.        sms_in[i++]=c;
  40.       }
  41.    }
  42.    
  43. void borrar_array()
  44.    {
  45.      for(a=0;a<80;a++)
  46.       {
  47.       sms_in[a]=0;
  48.       delay_ms(100);
  49.       }
  50.    a=0;
  51.    b=0;
  52.    c=0;
  53.    }
  54.  
  55. void main()
  56.    {
  57.    lcd_init();
  58.    
  59.    set_tris_a (0x00) ;
  60.    
  61.    output_high(pin_a3);     // Tiempo hasta que toma señal el modulo
  62.       delay_ms(3000);      
  63.    output_low(pin_a3);      
  64.       delay_ms(3000);      
  65.    output_high(pin_a3);
  66.       delay_ms(3000);  
  67.    output_low(pin_a3);
  68.       delay_ms(3000);
  69.    output_high(pin_a3);
  70.       delay_ms(3000);  
  71.    output_low(pin_a3);
  72.       delay_ms(3000);
  73.    
  74.    
  75.    enable_interrupts(int_rda);
  76.    enable_interrupts(global);
  77.    
  78.    printf("AT+CMGF=1\n\r");
  79.    printf("AT+CNMI=2,2,0,0,0\n\r");
  80.    printf("AT+CMGD=1,4\n\r"); //BORRAMOS SMS
  81.      
  82.      delay_ms(3000);
  83.    
  84.    printf(LCD_PUTC, "\fEsperando SMS \n");
  85.    delay_ms(3000);
  86.    borrar_array();
  87.    
  88.    
  89.    while(true)
  90.     {
  91.      
  92.      if(0!=strstr(sms_in,dato))
  93.      {
  94.       printf(LCD_PUTC, "\f%s",sms_in);
  95.       output_high(pin_a3);
  96.       delay_ms(3000);delay_ms(3000);delay_ms(3000);  
  97.       output_low(pin_a3);
  98.       printf("AT+CMGD=1,4\n\r"); //BORRAMOS SMS
  99.       borrar_array();
  100.       i=0;
  101.      }
  102.      
  103.     }  
  104.    }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #49 en: 09 de Septiembre de 2018, 22:48:52 »
Agregale una proteccion para el indice:

Código: C
  1. void serial_isr (void)
  2.    {
  3.     if (kbhit())
  4.       {
  5.        c=getc();
  6.        sms_in[i++]=c;
  7.        if (i >= sizeof sms_in) i=0;
  8.       }
  9.    }

Imprimir 80 caracteres:

Código: C
  1. printf(LCD_PUTC, "\f%s",sms_in);

En un LCD de 16 lugares no creo que veas mucho, y que deberias asegurarte de tener un caracter nulo al final de recibir todo, o de ultima al menos en el index 79.
« Última modificación: 09 de Septiembre de 2018, 23:25:25 por KILLERJC »

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #50 en: 10 de Septiembre de 2018, 17:02:17 »
si sii... en el Display no va a entrar toda la cadena, pero tendría que mostrar lo que entre, o no???

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #51 en: 18 de Septiembre de 2018, 09:19:30 »
Como puedo hacer para ver si me entra a la interrupción, para ver si esta guardando algo en el buffer. Porque no hay forma de que me hago algo el programa. Hice algo asi para ver si esta entrando a la interrupcion. Esta bien?? o como lo podria hacer.

Código: C++
  1. #int_RDA
  2.  
  3. void serial_isr (void)
  4.    {
  5.     if (kbhit())
  6.       {
  7.        c=getc();
  8.        sms_in[i]=c;
  9.        i++;
  10.        sms_in[79]="\0";
  11.        sms_in[78]="A";
  12.       }
  13.    }
  14.    
  15. void main()
  16.    {
  17.    lcd_init();
  18.    
  19.    set_tris_a (0x00) ;
  20.    
  21.    enable_interrupts(int_rda);
  22.    enable_interrupts(global);
  23.    
  24.    printf("AT+CMGF=1\n\r");
  25.    printf("AT+CNMI=2,2,0,0,0\n\r");
  26.    printf("AT+CMGD=1,4\n\r"); //BORRAMOS SMS
  27.      
  28.    delay_ms(9000);
  29.    
  30.    printf(LCD_PUTC, "\fEsperando SMS \n");
  31.  
  32.    while(true)
  33.     {
  34.     if(sms_in[78]=="A")
  35.      {
  36.       printf(LCD_PUTC, "\f%s",sms_in);
  37.       output_high(pin_a3);
  38.       delay_ms(3000);delay_ms(3000);delay_ms(3000);  
  39.       output_low(pin_a3);
  40.      }
  41.     }  
  42.    }

Desconectado vdiazg

  • PIC12
  • **
  • Mensajes: 68
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #52 en: 26 de Septiembre de 2018, 04:25:56 »
Hace años publique como solucionar tu problema

http://www.todopic.com.ar/foros/index.php?topic=40019.msg333244#msg333244

Como puedo hacer para ver si me entra a la interrupción, para ver si esta guardando algo en el buffer. Porque no hay forma de que me hago algo el programa. Hice algo asi para ver si esta entrando a la interrupcion. Esta bien?? o como lo podria hacer.

Código: C++
  1. #int_RDA
  2.  
  3. void serial_isr (void)
  4.    {
  5.     if (kbhit())
  6.       {
  7.        c=getc();
  8.        sms_in[i]=c;
  9.        i++;
  10.        sms_in[79]="\0";
  11.        sms_in[78]="A";
  12.       }
  13.    }
  14.    
  15. void main()
  16.    {
  17.    lcd_init();
  18.    
  19.    set_tris_a (0x00) ;
  20.    
  21.    enable_interrupts(int_rda);
  22.    enable_interrupts(global);
  23.    
  24.    printf("AT+CMGF=1\n\r");
  25.    printf("AT+CNMI=2,2,0,0,0\n\r");
  26.    printf("AT+CMGD=1,4\n\r"); //BORRAMOS SMS
  27.      
  28.    delay_ms(9000);
  29.    
  30.    printf(LCD_PUTC, "\fEsperando SMS \n");
  31.  
  32.    while(true)
  33.     {
  34.     if(sms_in[78]=="A")
  35.      {
  36.       printf(LCD_PUTC, "\f%s",sms_in);
  37.       output_high(pin_a3);
  38.       delay_ms(3000);delay_ms(3000);delay_ms(3000);  
  39.       output_low(pin_a3);
  40.      }
  41.     }  
  42.    }
quiero construir un "Condensador de flujos"

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #53 en: 02 de Octubre de 2018, 17:03:53 »
Hola vdiazg, me podrías pasar esa porte del programa ?

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #54 en: 04 de Octubre de 2018, 18:13:20 »
Sigo sin lograr recibir el SMS   :5] :5] :5] :5] :x :x :x
no me doy cuenta en que le estaré errando.

Desconectado vdiazg

  • PIC12
  • **
  • Mensajes: 68
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #55 en: 14 de Octubre de 2018, 23:44:23 »
vamos por partes:
1. Usas algún simulador para probar tu programa?
    Siempre es bueno probar cada parte de tu programa con el IDE de microchip o en todo caso con un simulador (Proteus por ejemplo)
2. Haz probado las funciones basicas del Modulo GSM con una PC (mediante un terminal)
    Como esperas saber que recibir o si lo que recibes es correcto sin antes chequearlo con una PC, aveces el datasheet del sim se ve confuso. Prueba todas las funciones y escribe todas las respuestas del sim, diseña incluso un cuadro de cada byte recibido
3. Para este tipo de proyectos lo optimo es usar interrupcion (por USART) si dominas el manejo de esa interrupcion, ya tendras casi todo resuelto.
4. Dentro de la interrupcion por usart tiene que haber la menor cantidad de codigo posible.
5. El analisis de las respuestas obtenidas del sim se logra con las funciones del CCS, pero hacerlas tu mismo resulta mas gratificante y en algunos casos hasta te tome menos memoria
6. El sim por defecto tiene un comando para indicarte que llego un SMS y no lanzarte el contenido sin previo aviso (AT+CNMI=2,2,0,0,0)
7. Revisa el post que te puse; cualquier consulta al whatsapp (inbox).
quiero construir un "Condensador de flujos"

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #56 en: 16 de Octubre de 2018, 21:08:48 »
Hola, en este momento estoy haciendo una aplicación con el SIM800L, enviar y recibir mensajes, para recibir los mensajes estoy utilizando esta rutina en una interrupción, en el cuerpo del mensaje envío un caracter que inicia la cadena (*) y otro que la finaliza (#), los caracteres van llegando y se van cargando en un array, pero cuando llega el caracter inicial se reinicia un contador y esta es la referencia para contar los caracteres que llegan, cuando llega el caracter final invoco una rutina que decodifica los caracteres que está en el array

Además tuve el siguiente inconveniente, no sé si te esté pasando algo igual, el SIM800L en el pin TX envía niveles de 2.8V, el PIC no me estaba tomando esto como un nivel alto, le enviaba datos pero el PIC no los reconocía, tuve que elevar el voltaje con unos transistores y por la velocidad de estos tuve que bajarme a 4800 bps.

Código: CSS
  1. #int_rda                                //Vector de interrupcion de la recepcion de datos
  2. void interrupcion_rx()  //por el usart
  3. {
  4.         int respaldo;
  5.         respaldo = getc();
  6.        
  7.         if(respaldo == '*')
  8.                 {con_recepcion = 0; modo_recepcion = 0;}
  9.                                
  10.         dato_recibido[con_recepcion] = respaldo;
  11.                                
  12.         if(respaldo == '#')
  13.                 {decodificar();}
  14. }

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #57 en: 16 de Octubre de 2018, 21:16:06 »
Hola, en este momento estoy haciendo una aplicación con el SIM800L, enviar y recibir mensajes, para recibir los mensajes estoy utilizando esta rutina en una interrupción, en el cuerpo del mensaje envío un caracter que inicia la cadena (*) y otro que la finaliza (#), los caracteres van llegando y se van cargando en un array, pero cuando llega el caracter inicial se reinicia un contador y esta es la referencia para contar los caracteres que llegan, cuando llega el caracter final invoco una rutina que decodifica los caracteres que está en el array

Además tuve el siguiente inconveniente, no sé si te esté pasando algo igual, el SIM800L en el pin TX envía niveles de 2.8V, el PIC no me estaba tomando esto como un nivel alto, le enviaba datos pero el PIC no los reconocía, tuve que elevar el voltaje con unos transistores y por la velocidad de estos tuve que bajarme a 4800 bps.

Código: CSS
  1. #int_rda                                //Vector de interrupcion de la recepcion de datos
  2. void interrupcion_rx()  //por el usart
  3. {
  4.         int respaldo;
  5.         respaldo = getc();
  6.        
  7.         if(respaldo == '*')
  8.                 {con_recepcion = 0; modo_recepcion = 0;}
  9.                                
  10.         dato_recibido[con_recepcion] = respaldo;
  11.                                
  12.         if(respaldo == '#')
  13.                 {decodificar();}
  14. }

Probé de capturar la cadena de un millón de formas.. alomejor puede ser por el problema que me estas diciendo de los niveles lógicos.. 

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #58 en: 18 de Octubre de 2018, 11:00:04 »
Hola, en este momento estoy haciendo una aplicación con el SIM800L, enviar y recibir mensajes, para recibir los mensajes estoy utilizando esta rutina en una interrupción, en el cuerpo del mensaje envío un caracter que inicia la cadena (*) y otro que la finaliza (#), los caracteres van llegando y se van cargando en un array, pero cuando llega el caracter inicial se reinicia un contador y esta es la referencia para contar los caracteres que llegan, cuando llega el caracter final invoco una rutina que decodifica los caracteres que está en el array

Además tuve el siguiente inconveniente, no sé si te esté pasando algo igual, el SIM800L en el pin TX envía niveles de 2.8V, el PIC no me estaba tomando esto como un nivel alto, le enviaba datos pero el PIC no los reconocía, tuve que elevar el voltaje con unos transistores y por la velocidad de estos tuve que bajarme a 4800 bps.

Código: CSS
  1. #int_rda                                //Vector de interrupcion de la recepcion de datos
  2. void interrupcion_rx()  //por el usart
  3. {
  4.         int respaldo;
  5.         respaldo = getc();
  6.        
  7.         if(respaldo == '*')
  8.                 {con_recepcion = 0; modo_recepcion = 0;}
  9.                                
  10.         dato_recibido[con_recepcion] = respaldo;
  11.                                
  12.         if(respaldo == '#')
  13.                 {decodificar();}
  14. }

En que consiste esta decodificacion ?
 con esa "decodificacion" también la usas para salir de la interrupción?

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #59 en: 18 de Octubre de 2018, 15:55:55 »
Es muy sencillo, el PIC por el rx puede recibir muchos caractares provenientes del SIM800L, necesitaría una ram muy extendida para almacenarlos todos, yo lo que hice fue configurar un array con 20 variables que se llama dato_recibido, cada que entra un caracter un contador se va incrementando y el dato recibido es llevado a este array en la posición correspondiente al contador, siempre se compara el caracter que llega con el ASCII '*', si son iguales se reinicia el contador, cuando llega el ASCII '#' se finaliza la recepción y se llama la rutina decodificar, donde se compara los datos del array con mis palabras claves y si son iguales realiza la función.

Debes ir verificando el valor del contador, ya que si se pasa de 20 se desborda el array

Yo hice mis pruebas llevando primero los datos del SIM a mi PC y verificando que llegue el dato enviado, luego desde el PC le envié datos al PIC, por último conecté el SIM800L con el PIC, como no me funcionó fue entonces que descubrí que era un tema de niveles lógicos, yo lo resolví con transistores para pasar los niveles de 2.8V a 5V.

No sé si alguien más haya tenido este inconveniente y como lo solucionaron



Código: CSS
  1. #int_rda                                //Vector de interrupcion de la recepcion de datos
  2. void interrupcion_rx()  //por el usart
  3. {
  4.         int respaldo;
  5.         respaldo = getc();
  6.        
  7.         if(respaldo == '*')
  8.                 {con_recepcion = 0; modo_recepcion = 0;}
  9.                                
  10.         dato_recibido[con_recepcion] = respaldo;
  11.                                
  12.         if(respaldo == '#')
  13.                 {decodificar();}                               
  14.        
  15.         con_recepcion++;
  16.         if(con_recepcion == 19)
  17.                 {con_recepcion = 0;}
  18. }
  19. ///////////////////////////////////////////////////////////////////////////////
  20. void decodificar()
  21. {
  22.         if(dato_recibido[1] == 'S' && dato_recibido[2] == 'I')
  23.        
  24.                 {
  25.                         output_high(buzzer);                   
  26.                 }
  27.        
  28.         if(dato_recibido[1] == 'N' && dato_recibido[2] == 'O')
  29.        
  30.                 {
  31.                         output_low(buzzer);                    
  32.                 }
  33. }
« Última modificación: 18 de Octubre de 2018, 16:01:35 por Diego E. »