TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: dragondgold en 13 de Abril de 2011, 21:46:45
-
Hola estoy haciendo un programa en donde me comunico con un Xbee, estoy recibiendo el dato que manda el Xbee que es un OK (caracter O y K) pero al parecer el programa no detecta esto:
#INT_RDA
VOID isr_uart (VOID){
IF(kbhit(xbee)){ //si hay un dato para recibir del XBEE
dato = fgetc(xbee); //lo coloco en la variable dato (stream = XBEE)
#ifdef RS232_DEBUG
fprintf(debug,"Int{ ");
fprintf(debug,"Dato: %c }\n\r",dato);
#endif
}
}
En la interrupción recibe el dato y lo muestro via RS232 y veo tanto en el simulador como en la PC al probarlo en la placa que el dato que el Xbee envía es una O seguida de una K, en el programa principal tengo esto:
delay_ms(1200); //se debe esperar 1 segundo sin hacer nada
fprintf(xbee,"+++"); //envío de comando
#ifdef RS232_DEBUG
fprintf(debug,"+++ enviado\n\r");
#endif
WHILE((DATO!='O') || (DATO!='K'));
DATO = 0;
fprintf(xbee,"ATMY32\r\n"); //direccion de origen 50 -> 0x32
WHILE((DATO!='O') || (DATO!='K'));
DATO = 0;
Supuestamente cuando salta la interrupcion y el dato es 'O' o 'K' debería salir del bucle while porque dato es diferente de 'O' o 'K', pero no sale, la variable dato que es un INT permanece con el valor K ya que es el último recibido y ahi se queda, por que?? No tiene sentido alguno, es un bug del CCS?
Saludos y espero puedan ayudarme!!
-
Tal vez nunca esta regresando de la interrupcion. No recuerdo bien como funciona fgetc, pero le tenes q pasar como parametro un puntero a un archivo.
Seguro q sólo estas enviando una 'O' y una 'K'?? porq tal vez estas enviando un "OK", lo q equivale a q el ultimo caracter sea un 0, y por eso no sale del while.
saludos!!
-
Te recomiendo usar fgetc() sin ninguna condición previa.
-
WHILE((DATO!='O') || (DATO!='K'));
Si no estoy lelo, de ese bucle no se sale nunca porque la condición siempre se cumple. Cualquier valor que tenga DATO hará que no sea 'O' o no sea 'K' por lo que es un bucle infinito.
-
WHILE((DATO!='O') || (DATO!='K'));
Si no estoy lelo, de ese bucle no se sale nunca porque la condición siempre se cumple. Cualquier valor que tenga DATO hará que no sea 'O' o no sea 'K' por lo que es un bucle infinito.
A mi también me da esa sensación. Porque si se recibe 'O' el dato es distinto de 'K', por lo tanto sigue satisfaciendo la evaluación y si se recibe 'K' pasaría lo mismo....
-
:D Enseguida es culpa de CCS! :D Es &&
-
A mi parecer lo mejor es esto:
Te recomiendo usar fgetc() sin ninguna condición previa.
y tiene razon nocturno:
WHILE((DATO!='O') || (DATO!='K'));
Si no estoy lelo, de ese bucle no se sale nunca porque la condición siempre se cumple. Cualquier valor que tenga DATO hará que no sea 'O' o no sea 'K' por lo que es un bucle infinito.
A mi también me da esa sensación. Porque si se recibe 'O' el dato es distinto de 'K', por lo tanto sigue satisfaciendo la evaluación y si se recibe 'K' pasaría lo mismo....
pero no puede poner WHILE((DATO!='O') && (DATO!='K')); por que de este modo saldria cuando envia la "O" ignorando la K y el caracter de fin de linea (0x0d)
-
Claro, lo q quiso poner es: mientras el dato no sea una O ó una K
while( !(DATO=='O' || DATO=='K') );
Que por ley de De Morgan se convierte en: mientras el dato no sea O ni K
while((DATO!='O') && (DATO!='K'));
Lo q tendria q hacer para asegurarse q sea un OK, es guardar los caracteres en un buffer, y fijarse q haya una O seguida de una K.
-
Lo que dice gera es cierto tiene que recibir primero la letra 'O' y después la 'K' si no es la 'K' se repite todo otra vez con 'O' y después 'K'.
Una interrucion RX solo capta una letra, en 2 interrupciones seria "OK".
-
Muchas gracias fue un error muy tonto mio. Hice que recibiera el dato y lo fuera almacenando en un buffer y comprobar si el buffer contiene el OK. Una pregunta algo fuera del tema pero alguno trabajó con Xbee?? Porque funciona todo correctamente excepto cuando tengo que configurar la dirección de origen (es decir del mismo Xbee) en ves de responder OK responde ERR que supongo que será un ERROR alguna idea??
Saludos!!
-
Hola, el ATMY solo se puede con los XBEE PRO, si tu tienes los xbee S2 no se puede hacer eso, debes de leer el ATSH y el ATSL, esa es su direccion, y al otro xbee deveras configurarle esas direcciones en ATDL y ATDH respectivamente.
Saludos
-
Precisamente estoy usando Xbee PRO Serie 2 por eso me extraña.
Edito: no dije nada xD