Buenas, soy nuevo en este tema, y en el foro. Me gustaria obtener ayuda de los que saben bastante, tengo un proyecto que hacer, como se lo suficiente de C, me pidieron programar un PIC. Es un PIC 18F8520, conectado con un modem simcom 300c (ese modelo me tira cuando le mando el comando ATI por 232).
Utilizo C para programarlo, con PCWHD (CSS C Compiler), microElektronika para flashear el pic, y Hercules para el monitoreo 232...
En fin, atraves de serial 232, puedo mandar comandos AT al modem, y este responde. Por ejemplo, le envio AT, y me responde OK, yo (en mi caso) no con este comando sino con otros, necesito guardar en una variable X, esa respuesta OK (o la que sea), y hasta ahora no puedo, y me estoy volviendo loco.
El proyecto antes me lo habian pasado con una forma, pero no funcionaba, por ejemplo (les saque el pedacito de codigo nomas, mas abajo pego otras partes importantes)
Segui investigando el tema de las interrupciones, y descubri que tenia una interrupcion ya de antes, la siguiente:
y en el void main tengo : (resumido)
Asi es como lo tengo actualmente, y no logro hacerlo funcionar.
Buscando informacion, le agregue una interrupcion (INT_RDA) sacada de por ahi, al cual lo llamo por include en un modulo MODEM.c (que abarca todas las funciones del modem), el codigo es el siguiente:
y por ejemplo en pruebatest() (que lo llamo desde el main) tengo...
Lo que esta comentado es porque he ido probando distintas formas y no hubo caso de hacerlo funcionar, por ejemplo en ese caso, yo le mando el comando "AT" al modem y este me responde "OK" y quiero guardar ese "OK" en una variable, pero no me saleeeee... En el codigo de arriba se mostrara por el serial, pero solo lo hice para ver si me obtenia alguna respuesta del modem, una vez que funcionara, descomentaba la linea de arriba, donde guarda en una variable... Esto es simplemente un ejemplo pero no me ha funcionado, por favor si alguno tiene idea que me de una mano, porque no se en que me estoy equivocando, o si se me esta pasando algo por alto. También probe las siguientes formas :
kbhit(); (Si bien tengo entendido kbhit, no se refiere a interrupciones del teclado? -Que no es lo que busco-, corrijanme si me equivoco)
!kbhit();
fgetc();
fgetc(modem);
kbhit(modem);
!kbhit(modem);
Por cierto, si necesitan que les pase algun dato mas, preguntenmé. Y una duda: "La respuesta del modem ¿Lo tomo como una interrupcion?"
Desde ya si alguno me da una mano, muchisimas gracias.
GRACIAS ENSERIO!
Utilizo C para programarlo, con PCWHD (CSS C Compiler), microElektronika para flashear el pic, y Hercules para el monitoreo 232...
En fin, atraves de serial 232, puedo mandar comandos AT al modem, y este responde. Por ejemplo, le envio AT, y me responde OK, yo (en mi caso) no con este comando sino con otros, necesito guardar en una variable X, esa respuesta OK (o la que sea), y hasta ahora no puedo, y me estoy volviendo loco.
El proyecto antes me lo habian pasado con una forma, pero no funcionaba, por ejemplo (les saque el pedacito de codigo nomas, mas abajo pego otras partes importantes)
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=rs,errors)
#use rs232(baud=9600,parity=N,xmit=PIN_G1,rcv=PIN_G2,bits=8,stream=modem,errors)
void getip(){
char IP[16]="000.000.000.000"; // Valor inicial
fprintf(modem,"AT+CSTT=\"internet.gprs.unifon.com.ar\",\"wap\",\"wap\"\r\n");
delay_ms(5000);
fprintf(modem,"AT+CIICR\r\n"); //Activar GPRS
delay_ms(20000);
fprintf(modem,"AT+CIFSR\r\n"); //Devuelve IP
delay_ms(1500);
ip<-fgetc(modem);
delay_ms(1500);
fprintf(rs,"ip=> %s",ip);
delay_ms(1500);
}
Segui investigando el tema de las interrupciones, y descubri que tenia una interrupcion ya de antes, la siguiente:
#INT_RDA2
void RDA2_isr(){
fputc(fgetc(modem),rs);
}
y en el void main tengo : (resumido)
void main() {
//OTRAS FUNCIONES DE ENCENDIDO DE ELEMENTOS, ETC
ENABLE_INTERRUPTS(GLOBAL);
ENABLE_INTERRUPTS(INT_RDA2);
//MAS FUNCIONES DE ENCENDIDO DE MODEM, OBTENCION DE IP, ETC
do{
fputc(fgetc(rs),modem);
}while(1);
}
Asi es como lo tengo actualmente, y no logro hacerlo funcionar.
Buscando informacion, le agregue una interrupcion (INT_RDA) sacada de por ahi, al cual lo llamo por include en un modulo MODEM.c (que abarca todas las funciones del modem), el codigo es el siguiente:
#define maxbuffer 5
volatile char buffer[maxbuffer];
static int8 nextchr;
void addbuffer(char c){
buffer[nextchr++]=c;
if(nextchr==maxbuffer){
nextchr=0;
}
}
#INT_RDA
void serial_isr() {
char nextchr;
nextchr='\0';
if(kbhit()){
nextchr=fgetc();
addbuffer(nextchr);
}
}
y por ejemplo en pruebatest() (que lo llamo desde el main) tengo...
void pruebatest(){
//char rta;
fprintf(modem,"AT\n\r");
delay_ms(500);
ENABLE_INTERRUPTS(INT_RDA);
if(kbhit(modem)){
//rta=fgetc(modem);
fprintf(rs,"RTA:%c\n\r",fgetc(modem));
}
DISABLE_INTERRUPTS(INT_RDA);
}
Lo que esta comentado es porque he ido probando distintas formas y no hubo caso de hacerlo funcionar, por ejemplo en ese caso, yo le mando el comando "AT" al modem y este me responde "OK" y quiero guardar ese "OK" en una variable, pero no me saleeeee... En el codigo de arriba se mostrara por el serial, pero solo lo hice para ver si me obtenia alguna respuesta del modem, una vez que funcionara, descomentaba la linea de arriba, donde guarda en una variable... Esto es simplemente un ejemplo pero no me ha funcionado, por favor si alguno tiene idea que me de una mano, porque no se en que me estoy equivocando, o si se me esta pasando algo por alto. También probe las siguientes formas :
kbhit(); (Si bien tengo entendido kbhit, no se refiere a interrupciones del teclado? -Que no es lo que busco-, corrijanme si me equivoco)
!kbhit();
fgetc();
fgetc(modem);
kbhit(modem);
!kbhit(modem);
Por cierto, si necesitan que les pase algun dato mas, preguntenmé. Y una duda: "La respuesta del modem ¿Lo tomo como una interrupcion?"
Desde ya si alguno me da una mano, muchisimas gracias.
GRACIAS ENSERIO!