Buenos días.
Antes de nada quiero agradecer la función de este foro, me esta ayudando mucho para llevar adelante mi proyecto.
Este es mi primer post,necesito que me echen una mano, he leído muchísimo y no soy capaz de encontrar la solución.
Estoy tratando de recibir datos de un modem GSM(de audiotel) a través del RS232. El pic es el 18f4550.
La idea es que cuando reciba un SMS el pic genere una interrupción(rda) y que guarde el SMS en una cadena de caracteres, para luego posteriormente trabajar con ella.
El problema está en que el SMS llega al modem, y este al pic(lo veo por que conecte unos diodos led entre MAX 222 y el pic, para que parpadeen cuando llega un dato, tanto de entrada como de salida) pero la interrupción se queda colgada, supongo que sea por el gets, pero probando con el getc o el kbhit parece como que no se activara.
Os muestro parte del código. Descarto que sea el hardware, por que si que envía comandos al modem, y este los lee sin problemas, como por ejemplo mandar un sms.
#include <18f4550.h>
#device adc=10
#fuses HS,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,CPUDIV1,NOVREGEN,NOPBADEN,NOPUT
#use delay (clock=20000000)
#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7,parity=N,bits=8)
#define use_portd_lcd TRUE
#define use_portb_kbd TRUE
#include <string.h>
#include <lcd.c>
#use standard_io(A)
#use fast_io(D)
// variables
char cadena[40];
int flag=0x00,i;
long int ntotal=2232;
#INT_RDA
void serial_isr(void){
gets(cadena);
flag=1; // lo utilizo para que el en main entre en la funcion procesaSMS
}
void iniciar_modem (void){
output_high(PIN_C2); //enceder modem GSM
delay_ms(25000); //espera a que se inicie
printf("AT+IRP=9600\r\n"); // velocidad
delay_ms(2000);
printf("ATE0\r\n");
delay_ms(2000);
printf("AT+CMGF=1\r\n"); // modo texto
delay_ms(2000);
printf("AT+IFC=0,0\r\n"); //control de flujo off
delay_ms(2000);
printf("AT+CPIN=%Ld\r\n",ntotal); // cogido pin
delay_ms(10000);
printf("AT+CNMI=2,2,0,0\r\n"); // configuro para que en cuanto llegue un mensaje lo envie el modulo gsm por el puerto serie
delay_ms(2000);
}
void procesaSMS(void){ // muestra la cadena recibida en la LCD
printf(lcd_putc,"%s",cadena);
delay_ms(2000);
for (i=0;i<40;i++){ // lee la cadena, si algún dato es T , el sms es valido
if (cadena=='T'){
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("valido");
delay_ms(2000);
flag=0;
break;
}
}
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("no valido");
delay_ms(2000);
flag=0;
}
void main (void){
lcd_init();
iniciar_modem();
lcd_gotoxy(1,2);
lcd_putc("modem listo");
delay_ms(2000);
lcd_putc("\f");
enable_interrupts(int_rda);
enable_interrupts(GLOBAL);
while (true){
lcd_gotoxy(1,2);
lcd_putc("esperando SMS");
if (flag==1){
procesaSMS();
flag=0;
}
}
}
Inicia bien el modem, se conecta a la red, cuando entra en el while, y aunque el flag=0, se activa la interrupción, pero no tiene por que , ya que el modem no envía ningún dato.
Como ha entrado en la interrupcion, se queda ahí colgado, supongo que por el gets....
En definitiva, que la interrupción no se activa cuando debiere, y ademas, esta se queda colgada
Alguna idea??
Gracias