TODOPIC
Lenguajes de programación para PC => C, C#, C++ => Mensaje iniciado por: mtsgrc en 13 de Octubre de 2011, 22:08:08
-
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)
#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-)
- fgetc()
Desde ya si alguno me da una mano, muchisimas gracias.
GRACIAS ENSERIO!
-
Por cierto, si necesitan que les pase algun dato mas, preguntenmé. Y una duda: "La respuesta del modem ¿Lo tomo como una interrupcion?"
-
Por cierto, si necesitan que les pase algun dato mas, preguntenmé. Y una duda: "La respuesta del modem ¿Lo tomo como una interrupcion?"
Hola, te recomiendo algo antes de empezar... Primero realiza programas para interactuar entre el PC y tu programa del pic 18f... Cuando tengas la experiencia suficiente empieza a interactuar con el modem...
Las interrupciones son eventos que disparan un método en tu programa... Cada pic tiene su abanico de interrupciones... Entre las interrupciones del pic que utilizas encontramos que el rs232 presenta este tipo de interrupción...
Tienes dos opciones esperar las respuestas por interrupción, o sencillamente esperar manualmente preguntando por el buffer entrada...
Veo que te falta mucho por estudiar, por tal motivo te invito a estudiar... En el foro encuentras muchos tutoriales...
-
mmm...
Antes con el fgetc() me complicaba mucho porque tomaba datos, y caracteres mal, no se andaba mal eso, no como queria, podia obtener caracteres pero no todos, algunos, y no me gustaba... y probe con fgets y finalmente pude meter el string en una variable la respuesta del modem... Pero se me cuelga... El codigo es el siguiente:
#INT_RDA2
void RDA2_isr(){
//disable_interrupts(int_rda2);
fgets(mdm,modem);
fprintf(rs,"[%s]",mdm);
//enable_interrupts(int_rda2);
}
Simplemente guarda en el [char *mdm;] la interrupcion, y lo muestro en el 232 entre corchetes, para diferenciar bien los datos, es solo un ejemplo despues lo perfeccionare con un switch con comparacion de strnig, y ahi hacer funciones en base a la respuesta del modem... En fin pero tengo un problema, hasta ahi anda, pero miren... En el void main tengo esto...
void main() {
initmain();
//buzzer(); //Sonido del inicio
welcome_screen(); //Pantalla de BIENVENIDO!!
delay_ms(2000); //delay
loading_screen(); //Pantalla de LOADING...
modempor232(); //Iniciamos el modulo 232 para escuchar el modem
modemON(); //Iniciamos el modem
checkMODEM(); //Chequeamos el encendido correcto del modem
int_on(); //Habilitar interrupciones (GLOBAL y INT_RDA2)
delay_ms(10000); //Dar unos segundos para terminar de cargar SIM y el Call Ready
strcpy(AT2send,"AT"); //Guarda en una variable, el comando a enviarse al modem
send2modem(AT2send); //Se envia al modem la variable con el comando
fprintf(rs,"***All loaded***\n\r"); //Indica que se cargo todo
do{
fputc(fgetc(rs),modem); //Permite ingresar comandos en el modem por 232
}while(1);
}
al escribir este codigo, el modem me da el siguiente resultado en el 232...
********** Starting **********
····· 232 Loaded ·····
·Modem Shutting down·
·Modem Starting·
#El modem se inicio correctamente
[]
[Call Ready]
ahi podemos ver que hay dos interrupciones, y la variable mdm en el prmier caso no tiene nada (len: 0) y en la segunda, capta lo que es el Call Ready, pero ahi se queda colgado, despues debería mostrar AT OK, y no lo muestra :(
Alguien tiene idea que puede ser? Alguien que ya haya pasado por esto?
GRACIAS DE ONDA, de paso para ayudar a futuras personas que vayan a tratar este tema... EXITOS!