Autor Tema: Bucle While en CCS, bug?  (Leído 4368 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado dragondgold

  • PIC16
  • ***
  • Mensajes: 103
    • Tmax & Gwolf Microcontrollers
Bucle While en CCS, bug?
« 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!!
La conclusión final es que sabemos muy poco y sin embargo, es asombroso lo mucho que conocemos. Y más asombroso todavía es que un conocimiento tan pequeño nos pueda dar tanto poder

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Bucle While en CCS, bug?
« Respuesta #1 en: 13 de Abril de 2011, 21:57:49 »
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!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Bucle While en CCS, bug?
« Respuesta #2 en: 14 de Abril de 2011, 02:21:00 »
Te recomiendo usar fgetc() sin ninguna condición previa.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Bucle While en CCS, bug?
« Respuesta #3 en: 14 de Abril de 2011, 02:30:59 »
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.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Bucle While en CCS, bug?
« Respuesta #4 en: 14 de Abril de 2011, 10:36:21 »
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....
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Bucle While en CCS, bug?
« Respuesta #5 en: 14 de Abril de 2011, 10:45:42 »
 :D Enseguida es culpa de CCS!  :D Es &&
No contesto mensajes privados, las consultas en el foro

Desconectado dolphin_96

  • PIC12
  • **
  • Mensajes: 73
    • Ezkybel Electronics
Re: Bucle While en CCS, bug?
« Respuesta #6 en: 14 de Abril de 2011, 11:17:18 »
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)
Visiten: www.xbot.es/ezkybel tengo tutoriales para pics con visual basic...:)

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Bucle While en CCS, bug?
« Respuesta #7 en: 14 de Abril de 2011, 12:40:09 »
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.

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado cristian_elect

  • PIC18
  • ****
  • Mensajes: 453
Re: Bucle While en CCS, bug?
« Respuesta #8 en: 14 de Abril de 2011, 13:38:10 »
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".

Desconectado dragondgold

  • PIC16
  • ***
  • Mensajes: 103
    • Tmax & Gwolf Microcontrollers
Re: Bucle While en CCS, bug?
« Respuesta #9 en: 14 de Abril de 2011, 20:15:37 »
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!!
La conclusión final es que sabemos muy poco y sin embargo, es asombroso lo mucho que conocemos. Y más asombroso todavía es que un conocimiento tan pequeño nos pueda dar tanto poder

Desconectado dolphin_96

  • PIC12
  • **
  • Mensajes: 73
    • Ezkybel Electronics
Re: Bucle While en CCS, bug?
« Respuesta #10 en: 14 de Abril de 2011, 21:33:54 »
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
Visiten: www.xbot.es/ezkybel tengo tutoriales para pics con visual basic...:)

Desconectado dragondgold

  • PIC16
  • ***
  • Mensajes: 103
    • Tmax & Gwolf Microcontrollers
Re: Bucle While en CCS, bug?
« Respuesta #11 en: 14 de Abril de 2011, 21:35:47 »
Precisamente estoy usando Xbee PRO Serie 2 por eso me extraña.

Edito: no dije nada xD
« Última modificación: 15 de Abril de 2011, 11:32:41 por dragondgold »
La conclusión final es que sabemos muy poco y sin embargo, es asombroso lo mucho que conocemos. Y más asombroso todavía es que un conocimiento tan pequeño nos pueda dar tanto poder


 

anything