hola a todos...
estoy trabajando con un pic 18f26j50, y un modulo sim900d...
pero tengo un problema en una parte del codigo...
Lo que quiero hacer es lo siguiente:
Con un pulsador enciendo el modulo sim900d, y realizo la rutina de inicializacion, hasta este punto anda bien,
pero ademas de eso necesito que cuando llegue un msj, o una llamada, el sim900d muestra en el monitor serial una cadena de caracteres, por ende estaria enviando datos por el puerto serial, y yo necesito activar la interrupcion por puerto serial (RDA2).
Estoy usando 2 puertos seriales, uno para enviar comandos AT desde el pic al sim900, y otro para monitorear lo que hace el pic...
hasta ahora no en logrado que se active la interrupcion por puerto serie...
Espero puedan ayudarme, y decirme que puedo estar haciendo mal...
gracias de antemano..
les dejo el codigo...
#include <18F26J50.h>
#device adc=10
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES HSPLL //High Speed Crystal/Resonator with PLL enabled
#FUSES NODSBOR //BOR disabled in Deep Sleep
#FUSES NODSWDT //Deep Sleep Watchdog Timer disabled
#FUSES STVREN //Stack full/underflow will cause reset
#use delay(clock=20000000)
#pin_select U2TX=PIN_A1
#pin_select U2RX=PIN_A0
#use rs232 (UART2, BAUD=9600, PARITY=N, BITS=8, stream=SIM900D)
#use rs232(baud=9600,parity=N,xmit=PIN_A3,rcv=PIN_A5,bits=8,stream=SERIALE)
#use FIXED_IO( A_outputs=PIN_A3,PIN_A1 )
#use FIXED_IO( B_outputs=PIN_B7,PIN_B1 )
//--------------------------------------------------------------------------------------------------
// Variables Globales
//--------------------------------------------------------------------------------------------------
#define POWERKEYGSM PIN_B1
#define BUFFER_SIZE 20 // Buffer size you can adjust this size
#define PIN_ON output_high
#define PIN_OFF output_low
#define LED PIN_B7
#define ENTRADA PIN_B2
char buffer[BUFFER_SIZE]; // buffer
char b=0x00; // Last characters recived
int xbuff=0x00;
int bandera=0;
void encendergsm(void);
void inicializacionSIM900(void);
void inicbuff(void);
#INT_RDA2
//void RDA2_isr(void)
RDA2_isr()
{
if(kbhit(SIM900D))
{
b=0;
b=fgetc();
buffer[xbuff++]=b;
}
return 0;
clear_interrupt(int_rda2);
bandera=1;
}
void encendergsm(void)
{
fprintf(SERIALE,"encendiendo modulo...... \r");
PIN_ON(LED);
PIN_ON(POWERKEYGSM); //Enciendo modulo GSM
delay_ms(1200);
PIN_OFF(POWERKEYGSM);
PIN_OFF(LED);
}
void inicializacionSIM900(void)
{
int cont;
delay_ms(1000);
puts("A",SIM900D); //para sincronizar el baudrate del SIM 900
delay_ms(300);
putchar(0x0d,SIM900D);
delay_ms(1000);
for(cont=0;cont<5;cont++) // mando varios AT para el autobauding
{
puts("AT",SIM900D);
delay_ms(200);
putchar(0x0d,SIM900D);
delay_ms(200);
PIN_ON(LED);
delay_ms(200);
PIN_OFF(LED);
}
//-----------------------------------seteos de configuracion del SIM900------------------------
puts("AT+CMGF=1\r",SIM900D); // configuro para que trabaje en modo texto y no PDU
delay_ms(100);
putchar(0x0d,SIM900D);
delay_ms(200);
puts("AT+CNMI=2,2,0,0,0\r",SIM900D); // configuro para que en cuanto llegue un mensaje lo envie el modulo gsm por el puerto serie
delay_ms(200);
putchar(0x0d,SIM900D);
delay_ms(100);
return;
}
void inicbuff(void)
{
int i;
for(i=0;i<buffer_size;i++)
{
buffer=0x00;
//restart_wdt();
}
xbuff=0x00;
return;
}
void main(void)
{
PIN_OFF(POWERKEYGSM);
PIN_OFF(LED);
setup_timer_3(T3_DISABLED | T3_DIV_BY_1);
setup_timer_4(T4_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
enable_interrupts(INT_RDA2);
enable_interrupts(GLOBAL);
fprintf(SERIALE,"PIC CONECTADO");
inicbuff();
while(true)
{
if(input(ENTRADA)==1)
{
encendergsm();
delay_ms(300);
inicializacionSIM900();
delay_ms(300);
inicbuff();
}
if(bandera==1)
{
fprintf(SERIALE,"INTERRUPCION RDA2 ACTIVADA");
bandera=0;
}
}
}