Autor Tema: Error al comparar dos strings con strcmp  (Leído 42609 veces)

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

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #150 en: 20 de Enero de 2011, 23:06:12 »
  Encontré esto en el datasheet del PIC18F4550 "The Enhanced USART module supports the automatic detection and calibration of baud rate. This feature is active only in Asynchronous mode and while the WUE bit is clear."
  Y casualmente el bit WUE permanece en 0 después de PowerOnReset.

  Posiblemente pase que tu PIC se quede esperando un caracter en particular (que es 0x55) que se usa para el autocalibrado de la velocidad, al no recibir dicho caracter no logra establecer bien la velocidad y se cuelga todo.

  Supongo que a mi no me pasa lo mismo con los 16F628 porque no tiene el autocalibrado.

  Fijate en tu función de inicialización de UART de dejar en 1 el bit WUE, como para que no intente hacer la detección automática de la velocidad.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #151 en: 21 de Enero de 2011, 05:08:40 »
Esto de la cabecera 0x55 no es con el bit abden?

WUE: Wake-up Enable bit
Asynchronous mode:
1 = EUSART will continue to sample the RX pin – interrupt generated on falling edge; bit cleared in
hardware on following rising edge
0 = RX pin not monitored or rising edge detected
Synchronous mode:
Unused in this mode.


ABDEN: Auto-Baud Detect Enable bit
Asynchronous mode:
1 = Enable baud rate measurement on the next character. Requires reception of a Sync field (55h);
cleared in hardware upon completion.
0 = Baud rate measurement disabled or completed
Synchronous mode:
Unused in this mode.

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #152 en: 21 de Enero de 2011, 05:46:59 »
He probado de activar los dos bits y nada.. sigue sin funcionar..

He repasado que el setup de la funcion y creo que esta bien:
Código: [Seleccionar]
To set up an Asynchronous Reception:
1. Initialize the SPBRGH:SPBRG registers for the
appropriate baud rate. Set or clear the BRGH
and BRG16 bits, as required, to achieve the
desired baud rate.
2. Enable the asynchronous serial port by clearing
bit, SYNC, and setting bit, SPEN.
3. If the signal at the RX pin is to be inverted, set
the RXDTP bit.
4. If interrupts are desired, set enable bit, RCIE.
5. If 9-bit reception is desired, set bit, RX9.
6. Enable the reception by setting bit, CREN.
7. Flag bit, RCIF, will be set when reception is
complete and an interrupt will be generated if
enable bit, RCIE, was set.
8. Read the RCSTA register to get the 9th bit (if
enabled) and determine if any error occurred
during reception.
9. Read the 8-bit received data by reading the
RCREG register.
10. If any error occurred, clear the error by clearing
enable bit, CREN.
11. If using interrupts, ensure that the GIE and PEIE
bits in the INTCON register (INTCON<7:6>) are
set.

He mirado tambien el registro que controla la velocidad SPBRG y SPBRGH. El primero tiene un valor de "00000000" mientras que el segundo "00011111"
« Última modificación: 21 de Enero de 2011, 06:56:59 por edu1989 »

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #153 en: 21 de Enero de 2011, 07:11:48 »
He pensado en hacer la siguiente prueba. Que el ordenador haga del modulo y enviarle al PIC los \r\nOK\r\n de esta forma. Que te parece? eso tu tambien podrias probarlo no? se puede debugar con todo esto y ver que pasa.

1.Cuando envio un OK desde el terminal hacia el PIC el registro RCREG sigue a 0.. no recibe este caracter..

2. Me he fijado en el terminal.. cuando envio \n como string equivale a 5c 6e en cambio cuando envio 0d como hex el string es \n. ( con el punto).
Puede ser una pista esto?
« Última modificación: 21 de Enero de 2011, 07:32:41 por edu1989 »

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #154 en: 21 de Enero de 2011, 08:01:28 »
He visto que del registro BAUDCON  cambia el bit 6 de 1 a 0 ( cuando debugo y envio datos). Si no envio datos se queda a 1.

RCIDL: Receive Operation Idle Status bit
1 = Receive operation is Idle
0 = Receive operation is active

Por lo tanto esta detectando que estamos recibiendo algo o almenos se activa..


Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #155 en: 21 de Enero de 2011, 08:08:15 »
Como veis voy comentado las cosas que voy haciendo para que sepais en el punto exacto en el que estoy. De esta forma creo que resulta mas facil todo.
Ahora mismo estoy mirando registros y he visto esto:

SPEN: Serial Port Enable bit
1 = Serial port enabled (configures RX/DT and TX/CK pins as serial port pins)
0 = Serial port disabled (held in Reset)

RX y TX si que lo configuramos pero DT Y CK no... Puede ser esto? Cuando abro el terminal y tengo conectado el modulo sale una configuracion distinta  que cuando lo abro con el PIC conectado.

Con el modulo Bluetooth:

RTS,CTS,DTR,DSR,RING EN VERDE ( ACTIVOS) y el resto en rojo(inactivos)--> que son DCD y Break


Con el PIC:
RTS,CTS,DTR EN VERDE(ACTIVOS) y el resto inactivos
« Última modificación: 21 de Enero de 2011, 08:11:38 por edu1989 »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #156 en: 21 de Enero de 2011, 09:57:09 »

SPEN: Serial Port Enable bit
1 = Serial port enabled (configures RX/DT and TX/CK pins as serial port pins)
0 = Serial port disabled (held in Reset)

RX y TX si que lo configuramos pero DT Y CK no... Puede ser esto? Cuando abro el terminal y tengo conectado el modulo sale una configuracion distinta  que cuando lo abro con el PIC conectado.



  DT y CK son los mismos pines que RX y TX respectivamente. Sólo que en modo asincrónico se los denomina RX y TX (Receiver y Transmiter) y en modo sincrónico son DT y CK (Data y Clock)
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #157 en: 21 de Enero de 2011, 10:02:07 »
Ok, mirate los otros post.. a ver si sacamos algo claro de que puede pasar por favor

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #158 en: 21 de Enero de 2011, 11:02:08 »
Hola Angel, he mirado de utilitzar una funcion que habia en un programa de muestra en la web de microchipc
Es este:

unsigned char UsartReadChar_nonstop(void)
{
  if (!RCIF)    // TRMT1 is set when TSR is empty //
    return 0;  
  return RCREG;
}

El problema es que solo lee dos caracteres. Estoy habilitando el echo para que devuelva lo que envio (el comando AT, en este caso he puesto "hola") y lee bien ho pero despues ya no. Puede ser que almacene los datos de forma que solo cabe eso? me explico, nosotros estamos guardando 6 espacios suponiendo que cada caracter es un espacio pero a lo mejor no lo guarda de este modo.

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #159 en: 21 de Enero de 2011, 11:16:13 »
No sera que puedo leer solo dos datos porque vienen los datos en hexadecimal y como tengo 1byte solo puedo guardar dos datos?

Tengo problemas tambien con la funcion putch. Solo envia los dos primeros caracteres... luego tambien se queda en el bucle:

void putch(unsigned char c)
{
  while (!TXIF)
  {
    clear_usart_errors_inline;
    CLRWDT();
  }
  TXREG = c;
}

El bit txif es el mismo bit que rcif pero para la transmision... algo pasa y esta por ahi...

El CLRWDT si no lo tengo en los fuses no tendria que quitarlo?
Ayudame por favor
« Última modificación: 21 de Enero de 2011, 11:20:39 por edu1989 »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #160 en: 21 de Enero de 2011, 12:31:02 »
  Después de unos pequeños problemas con el compilador, pude hacerlo funcionar nuevamente.
  Programe un PIC18F4550, simulando tu micro y un 16F628 simulando el módulo bluetooth (como lo había hecho antes con los 2 628).

  Puse este código en el 4550..

Código: C
  1. #include <htc.h>
  2. #include <string.h>
  3.  
  4. __CONFIG (1, HS & CPUDIV4 & USBPLL & PLLDIV5 & FCMDIS & IESODIS);
  5. __CONFIG (2, BORDIS & WDTDIS & PWRTDIS);
  6. __CONFIG (3, MCLRDIS);
  7. __CONFIG (4, LVPDIS);
  8.  
  9. #define BAUD 9600
  10. #define PIC_CLK 5000000
  11.  
  12.  
  13. char dummy;
  14.  
  15.  
  16. void retardo(void)
  17. {
  18.   int veces;
  19.  
  20.   for (veces = 10000; veces > 0; veces--)
  21.   {
  22.     NOP();
  23.     NOP();
  24.     NOP();
  25.   }
  26. }
  27.  
  28.  
  29.  
  30. void serial_setup(void)
  31. {
  32.   #define SPBRG_VALUE ((PIC_CLK/(16UL*BAUD)) -1)
  33.   BRGH = 1;
  34.   BRG16 = 0;
  35.   SPBRG = SPBRG_VALUE;
  36.   SPEN = 1; // Enable serial port
  37.   SYNC = 0; // Asincrono
  38.   TXIE = 0; // Desactivar interrupciones en tx
  39.   TXEN = 1; // Enable the transmitter
  40.   TX9 = 0; // 8 bits transmission
  41.   RCIE = 1; // Activar interrupciones en rx
  42.   RX9 = 0; // 8 bits reception
  43.   CREN = 1; //Enable reception
  44.   #define clear_usart_errors_inline     if (OERR)\
  45.                                     {\
  46.                                       TXEN = 0;\
  47.                                       TXEN = 1;\
  48.                                       CREN = 0;\
  49.                                       CREN = 1;\
  50.                                     }\
  51.                                     if (FERR)\
  52.                                     {\
  53.                                       dummy = RCREG;\
  54.                                       TXEN = 0;\
  55.                                       TXEN = 1;\
  56.                                     }
  57. }
  58.  
  59. void putch(unsigned char c)
  60. {
  61.   while (!TXIF)
  62.   {
  63.     clear_usart_errors_inline;
  64.     CLRWDT();
  65.   }
  66.   TXREG = c;
  67. }
  68.  
  69. void putst(register const char *str)
  70. {
  71.   while ((*str) != 0)
  72.   {
  73.     putch (*str);
  74.     str++;
  75.   }
  76. }
  77.  
  78. unsigned char getch(void)
  79. {
  80.   while (RCIF != 1)
  81.   {                             //1 = The EUSART receive buffer, RCREG, is full
  82.     CLRWDT();
  83.     clear_usart_errors_inline;
  84.   }
  85.   return RCREG;
  86. }
  87.  
  88. /*
  89.  
  90. void LeerRespuesta(char * mensaje)
  91. {
  92.   char CaracterLeido;
  93.  
  94.   getch();
  95.   getch();
  96.   do
  97.   {
  98.     CaracterLeido = getch();
  99.     if ((CaracterLeido != '\r') && (CaracterLeido != '\n'))
  100.     {
  101.       *mensaje = CaracterLeido;
  102.       mensaje++;
  103.     }
  104.     *mensaje = '\0';
  105.   }
  106.   while (CaracterLeido != '\n');
  107.  
  108. }
  109.  
  110. */
  111.  
  112.  
  113. void init_system (void)
  114. {
  115.   TRISA = 255;
  116.   //CS = 1;
  117.   TRISB = 1; // SDI. El bit 0 a 1.Configurado en master mode (bit 1 cleared, en mode slave bit 1 set)
  118.   TRISC = 192; // SDO. Tots els bits a 1 menys la sortida 7
  119. }
  120.  
  121.  
  122. void main (void)
  123. {
  124.   char * RespuestaRecibida;
  125.   char Respuesta[10];
  126.  
  127.   init_system();
  128.   serial_setup();
  129.  
  130.   putst ("AT");
  131.   putch ('\r');
  132.  
  133.  
  134.   Respuesta[0] = getch();
  135.   Respuesta[1] = getch();
  136.   Respuesta[2] = getch();
  137.   Respuesta[3] = getch();
  138.   Respuesta[4] = getch();
  139.   Respuesta[5] = getch();
  140.  
  141.   while (1);
  142. }

  Fijate que todavía no hago uso de la función "LeerRespuesta", sino que hice sucesivos getch(). Así como está me funcionó bien (te adjunto una captura del valor que toma la variable respuesta)

  Tal parece que el problema está en como estaba declarada dicha variable, ya que antes lo había hecho con dicha variable declarada globalmente y no funcionaba, y ahora que la declaré dentro del main sí me funciona.

De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #161 en: 21 de Enero de 2011, 12:57:24 »
bieen!! muchisimas gracias!
Ya parece que empieza a tomar forma..
Estoy recibiendo
0x0d
0x0a
0x4f
0x4b
0x0d
0x0a

Hasta aqui lo que tengo que recibir y despues recibo esto hasta llenar el buffer

0xac
0xf8
0x14
0x04

Casi casiii esta!

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #162 en: 21 de Enero de 2011, 13:01:23 »
He declarado Respua[6] en vez de Respuesta[10] para que lo coja bien. Ahora toca hacer la funcion que guarde el OK.
Que te parece asi..

Código: [Seleccionar]
void main ()
{
 
 valor_potenciometro = 0;
 valor_sensor_temperatura = 0;

  LED0 = 0;
  LED1 = 0;
  LED2 = 0;
  LED3 = 0;
 
char * RespuestaRecibida;
char Respuesta[6];
char ok[2];
int i=0;

  init_system();
  setup_sensor();
  setup_adc();
  serial_setup();


 
/* =================================================================================
Establecer connexion con comandos AT
  ================================================================================= */

//Primer comando AT
putst ("ATE0"); // Desconnectar el echo.
putch ('\r');

Respuesta[0] = getch();
Respuesta[1] = getch();
Respuesta[2] = getch();
Respuesta[3] = getch();
Respuesta[4] = getch();
Respuesta[5] = getch();

while(i<6)
{
if(Respuesta[i]=='O')
{
ok[0]=Respuesta[i];
}
if(Respuesta[i]=='K')
{
ok[1]=Respuesta[i];
}
i++;
}

ComandoRecibido=ok;

if (strcmp(ComandoRecibido1,"\r\nOK\r\n") == 0){ // Todo a ido bien
LED0=1;
error_comando=0;
//putst ("respuesta correcta");
//putch ('\r');

}

El codigo no me dicen que tenga que estar super estructurado.. yo no haria una funcion especifica y tal.. lo haria asi. Te parece que esta OK?

Muchas gracias eh..ya veo un poco de luz al final del tunel ahora...
« Última modificación: 21 de Enero de 2011, 13:08:06 por edu1989 »

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #163 en: 21 de Enero de 2011, 13:40:57 »
Hola amigo.
Para no tener que enviar el caracter ATE0 y que desactive el echo ( que en el primer caso cuando envio el ate0 no funciona) he decidico almacenar el echo y el OK de manera que cuando envio AT recibo:

 41(A) 54(T) 0D 0D 0A 4f(O) 4b(K) OD OA.

He probado eso y lo lee bien todo. He hecho codigo para separar el OK y poderlo comparar en el strcmp. Hasta aqui bien pero cuando llega al strcmp no entra al correcto. Dejo el codigo:

Código: [Seleccionar]
void main ()
{
 
 valor_potenciometro = 0;
 valor_sensor_temperatura = 0;

  LED0 = 0;
  LED1 = 0;
  LED2 = 0;
  LED3 = 0;
 
char * RespuestaRecibida;
char Respuesta[9];
char ok[2];
int i=0;

  init_system();
  setup_sensor();
  setup_adc();
  serial_setup();


 
/* =================================================================================
Establecer connexion con comandos AT
  ================================================================================= */

//Primer comando AT
putst ("AT"); // Desconnectar el echo.
putch ('\r');

Respuesta[0] = getch();
Respuesta[1] = getch();
Respuesta[2] = getch();
Respuesta[3] = getch();
Respuesta[4] = getch();
Respuesta[5] = getch();
Respuesta[6] = getch();
Respuesta[7] = getch();
Respuesta[8] = getch();


//while(1);
while(i<9)
{
if(Respuesta[i]=='O')
{
ok[0]=Respuesta[i];
}
if(Respuesta[i]=='K')
{
ok[1]=Respuesta[i];
}
i++;
}
//while(1);

ComandoRecibido1=ok;

if (strcmp(ComandoRecibido1,"OK") == 0){ // Todo a ido bien
while(1);
LED0=1;
error_comando=0;
//putst ("respuesta correcta");
//putch ('\r');

}
else{                                    // No es el comando bueno
while(1);

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #164 en: 21 de Enero de 2011, 13:55:57 »
  Puede ser que te esté pasando algo similar a lo que me pasaba a mí, porque si no me equivoco tenés definido ComandoRecibido1 globalmente, probá definirlo dentro del main
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas