Autor Tema: Librería SHT11 de J1M. Problema con declaración de cadenas. "Esquivado ;)"  (Leído 11017 veces)

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

Desconectado huichoman

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 186
    • Pequeñas piezas para grandes proyectos.
Hola. No encuentro el porqué no me deja utlizar itoa teniendo  esta parte del código en el programa.
si tengo un entero ent=123 y lo convierto a string con itoa, el resultado es erroneo me sale string= 00

Código: [Seleccionar]
#int_rda
void serial_isr() {                    // Interrupción recepción serie USART

   rcvchar=0x00;                       // Inicializo caracter recibido                   
   if(kbhit()){                        // Si hay algo pendiente de recibir ...
      rcvchar=getc();                  // lo descargo y ...
      addcbuff(rcvchar);               // lo añado al buffer y ...
      echos(rcvchar);                  // hago eco (si procede).
   }
}

Si la quito, no tengo problemas en utilizarla ya que el resultado es correcto string= 123


Este es el código completo del ejemplo de redpic con una pequeñamodificacion utilizando itoa.

Código: [Seleccionar]
// _232_buffered.c

#include <18F4525.h>                          // Definiciones del PIC 16F876A
#include <stdlib.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT  // Los Fuses de siempre
#use delay(clock=4000000)                     // Oscilador a 4 Mhz
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)// RS232 Estándar

// CONSTANTES /////////////////////////////////////////////////////////////////

int const lenbuff=32;                  // Longitud de buffer, Ajustar
                                       // a lo que desees (o te sea posible)

// VARIABLES EN RAM ///////////////////////////////////////////////////////////

int  xbuff=0x00;                       // Índice: siguiente char en cbuff
char cbuff[lenbuff];                   // Buffer
char rcvchar=0x00;                     // último caracter recibido
int1 flagcommand=0;                    // Flag para indicar comando disponible

// Declaración de Funciones ///////////////////////////////////////////////////

void inicbuff(void);                   // Borra buffer
int  addcbuff(char c);                 // añade caracter recibido al buffer
void echos(char c);                    // Eco selectivo sobre RS232
void procesa_comando(void);            // Procesa comando

// INTERRUPCIONES /////////////////////////////////////////////////////////////


#int_rda
void serial_isr() {                    // Interrupción recepción serie USART

   rcvchar=0x00;                       // Inicializo caracter recibido                   
   if(kbhit()){                        // Si hay algo pendiente de recibir ...
      rcvchar=getc();                  // lo descargo y ...
      addcbuff(rcvchar);               // lo añado al buffer y ...
      echos(rcvchar);                  // hago eco (si procede).
   }
}

// Desarrollo de Funciones ////////////////////////////////////////////////////

void echos(char c){                    // Echo selectivo ----------------------

      switch(c){
         case 0x0D: printf(" [Ent] "); // Si he pulsado la tecla [Intro]
                    break;
         case 0x08: printf(" [Del] "); // Si he pulsado la tecla [Retroceso]
                    break;
         case 0x1B: printf(" [Esc] "); // Si he pulsado la tecla [Escape]
                    break;
         default:   putc(rcvchar);     // Echo de cualquier otro caracter
      }
}

void inicbuff(void){                   // Inicia a \0 cbuff -------------------
   int i;

   for(i=0;i<lenbuff;i++){             // Bucle que pone a 0 todos los
      cbuff[i]=0x00;                   // caracteres en el buffer
   }
   xbuff=0x00;                         // Inicializo el indice de siguiente
                                       // caracter
}

int addcbuff(char c){                  // Añade a cbuff -----------------------

      switch(c){
         case 0x0D:                    // Enter -> Habilita Flag para procesar
            flagcommand=1;             // Comando en Main
            break;
         case 0x08:                    // Del   -> Borra último caracter del Buffer
            if(xbuff>0) cbuff[--xbuff]=0x00;
            break;
         case 0x01B:                   // Esc   -> Borra el Buffer completamente
            inicbuff();
            break;
         default:
            cbuff[xbuff++]=c;          // Añade caracter recibido al Buffer
      }
}


// Programa Principal /////////////////////////////////////////////////////////

void main() {
   char cad[5];
   int num=123;
   inicbuff();                                   // Borra buffer al inicio
 
   printf("\r\n\** RS232 Buffered **\r\n\r\n");  // Presenta menú
   printf("[Enter] Procesa comando\r\n");
   printf("[Escape] Borra todo el buffer\r\n");
   printf("[Delete] Borra último carácter del buffer\r\n");
   printf("[\\w] Comando Escribe\r\n");
   printf("[\\r] Comando Lee\r\n");
   printf("\r\n");
   
   output_high(PIN_C5);
   itoa(num,10,cad);
   printf("%s",cad);
   

   enable_interrupts(int_rda);                   // Habilita Interrupción RDA
   enable_interrupts(global);                    // Habilita interrupciones

   do {
   
      if(flagcommand) procesa_comando();         // Si hay comando pendiente
                                                 // de procesar ... lo procesa.

   } while (TRUE);

}

// Procesador de Comandos /////////////////////////////////////////////////////

void procesa_comando(void){

   int i;
   char arg[lenbuff];                   // Argumento de comando (si lo tiene)

   flagcommand=0;                       // Desactivo flag de comando pendiente.
   printf("\r\nProcesando ... ");       // Monitorizo procesando ...

   for(i=0;i<lenbuff;i++){             // Bucle que pone a 0 todos los
      arg[i]=0x00;                     // caracteres en el argumento
   }

   if(cbuff[0]=='\\'&&cbuff[1]=='r'){   // Comparo inicio del buffer con comando "\r"
   
      printf("Leyendo ... ");           // Aqui lo que deseemos hacer con comando "\r"
     
   }

   if(cbuff[0]=='\\'&&cbuff[1]=='w'){   // Comparo inicio del buffer con comando "\w"
      i=2;
      do{                               // Extraemos argumento del buffer
         arg[i-2]=cbuff[i];             // a partir del 3er byte y hasta \0.
      }while(cbuff[++i]!=0x00);
     
      printf("Escribiendo %s ... ",arg);// Aqui lo que deseemos hacer con comando "\w"
                                        // Monitorizamos el argunmento.
   }

   inicbuff();                          // Borro buffer.

   printf("Procesado.\r\n\r\n");        // Monitorizo procesado.
}



Ya le busqué pero no hallo a que se deba. Gracia por la ayuda que puedan brindar, saludos.
« Última modificación: 08 de Marzo de 2008, 15:39:03 por huichoman »

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #1 en: 20 de Septiembre de 2007, 03:04:22 »
 :shock:

Voy a hacer la prueba y te cuento. Dime qué versión de CCS usas para compilar.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado huichoman

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 186
    • Pequeñas piezas para grandes proyectos.
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #2 en: 20 de Septiembre de 2007, 07:47:27 »
Hola RedPic, te agradezco muchísimo la ayuda. Estaba utilizando la version 4.038, la desinstalé y ahora tengo la 4.049 con el mismo problema. No se si sea por el compilador, pero ya me rompí la cabeza los últimos días tratando de encontrar el fallo. Es para un proyecto de la escuela para el control de un invernadero y  es para entregar este viernes (así estoy de tanto café :z) ). He estado trabajando con este proyecto desde el cuatrimestre pasado, pero tenía todo por partes aun no había juntado todas las piezas. Voy a utilizar un sht71 para sensor humedad y temperatura, esté será controlado por un pic18f2525 que enviará los datos por rs485 al control principal donde utilizo un pic18f4525, además de una computadora con un programa de visual basic como estación de monitoreo. Ya hice la prueba enviando cadenas de texto, todo bien, pero ahora que quiero enviar los datos del sensor, los debo convertir de float a string, pero no me deja utilizar las funciones de stdlib.h como itoa, tampoco la sprintf para pasar directo de float a string. Estoy desesperado pues nunca pensé que este tipo de error me estuviera deteniendo para avanzar y terminar el proyecto. La única forma que funcione es quitando el código que menciono de la interrupcion #int_rda.  Ya leí el manual del compilador, ya busqué y rebusqué en todo todopic, ya chequé en el foro de ccs, y nada que pueda hacerme ver la luz. Te estaré eternamente agradecido por toda la ayuda que puedas brindarme. Saludos y gracias de nuevo por todo.
« Última modificación: 20 de Septiembre de 2007, 07:59:52 por huichoman »

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #3 en: 20 de Septiembre de 2007, 08:13:36 »
El código del ejemplo de RedPic tampoco funciona?

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado huichoman

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 186
    • Pequeñas piezas para grandes proyectos.
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #4 en: 20 de Septiembre de 2007, 08:20:28 »
Si funciona, pero al utilizar itoa o sprintf no me genera los resultados correctos, a menos que quite la interrupcion #int_rda. Saludos. Tengo la version 4.038 y probé con la 4.049. Voy a desinstalar todo y probar con la 3.249 que creo que es la más estable. Saludos
« Última modificación: 20 de Septiembre de 2007, 08:23:48 por huichoman »

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #5 en: 20 de Septiembre de 2007, 09:14:39 »
Te juro que no lo entiendo ....  :shock: :shock: :shock:

En cuanto llegue a casa lo rehago a ver si soy capaz de que me haga lo mismo.  :? :( :x
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado huichoman

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 186
    • Pequeñas piezas para grandes proyectos.
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #6 en: 20 de Septiembre de 2007, 09:59:45 »
Gracias Redpic por tomarte la molestia de brindarme parte de tu tiempo, como te dije antes estaré eternamente agradecido por toda la ayuda que puedas brindarme. Continuaré todo el día de hoy hasta amanecer mañana que entrego el proyecto, me acaban de  llegar los coponentes para armar la parte física, voy a probar el lcd 40x4 con la modificación que le hice a la libreria de flexlcd204. Gracias de nuevo.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #7 en: 21 de Septiembre de 2007, 13:38:39 »
Hola.

El programa de RedPic funciona perfectamente, yo lo simulé hace ya bastantes lunas y ¡OK! Por si alguién no entiende lo que hace os lo explico:

- El programa almacena en un buffer todos los caracteres que le van llegando via RS232.

- El buffer es cbuff [32]    (la longitud del buffer se puede cambiar a más de 32 si se desea)

- Los caracteres recibidos también se pueden borrar "a distancia" de dos formas, por ejemplo: Francisco [Del] [Enter] borraría el último caracter recibido en el buffer ó bien Francisco [Esc] [Enter] borraría todo el buffer.

- También es un procesador de comandos escritos antes de la cadena de caracteres a enviar, por ejemplo:

\w Francisco [Enter] Guarda toda la cadena en el buffer y luego reenvía la cadena (en pantalla sale exactamente: Procesando ... Escribiendo Francisco 0 ... Procesado)

\w Francisco [Del] [Enter] Guarda toda la cadena en el buffer y luego reenvía la cadena sin el último caracter (en pantalla sale exactamente: Procesando ... Escribiendo Francisc 0 ... Procesado)

\r Este comando no tiene adjudicada ninguna accción en el programa, le podemos poner la que queramos, así como añadir otros comandos con otras acciones.

Volviendo al tema creo que sería conveniente Huichoman que mandaras un trozo de código pequeño donde intervenga la interrupción y las funciones que no te "funcionan".

Un saludo


Desconectado huichoman

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 186
    • Pequeñas piezas para grandes proyectos.
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #8 en: 22 de Septiembre de 2007, 02:30:13 »
Hola Pocher. El programa de RedPic funciona perfectamente. Pero hay un conflicto al utilizar itoa o sprintf.

Citar
Volviendo al tema creo que sería conveniente Huichoman que mandaras un trozo de código pequeño donde intervenga la interrupción y las funciones que no te "funcionan".

arriba puse el código de RedPic, con un pequeño código añadido utilizando itoa y añadiendo la stdlib.h.

Código: [Seleccionar]
   printf("[\\r] Comando Lee\r\n");
   printf("\r\n");
   
   output_high(PIN_C5);
   itoa(num,10,cad);
   printf("%s",cad);


en este caso declaro

   char cad[5];
   int num=123;


si no quito el trozo de codigo de de la interrupcion #INR_RDA el resultado que envia es 0, si lo quito el resultado es 123, el correcto.
Saludos.








Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #9 en: 22 de Septiembre de 2007, 16:12:20 »
Perdona, se me pasó.

Puñetas pués es verdad, te lo he estado simulando y es como dices ... cosa más rara.

¿será el compilador?

Voy a probar con el programa que yo uso con interrupción RDA y Buffer para ver si la función itoa también dá "pol saco".

Por cierto ¿ probaste ya físicamente la LCD para ver si el error en líneas 2 y 4 era del PROTEUS ?(que va a ser que sí)

Un saludo
« Última modificación: 22 de Septiembre de 2007, 16:17:38 por pocher »

Desconectado huichoman

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 186
    • Pequeñas piezas para grandes proyectos.
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #10 en: 22 de Septiembre de 2007, 19:27:28 »
Hola, la verda no se, pero ya probé con la version 4.049 la 4.038 y hasta me regresé a la 3.249 y me sucede lo mismo. Ya tengo el lcd de 40x4, en estos días lo pruebo para ver que tal funciona, en cuanto lo haga publico los resultados y las fotos. Saludos y hay que buscar cual es el fallo, jeje. Porque no entiendo que pueda ser, simplemente no jala. Lo que mas desespera, es que algo que aparentemente debiera funcionar sin ningun problema, pues no quiere, no quiere y no quiere. Supongo que es algun conflicto con el código pero a mas bajo nivel, pero lamentablemente no tengo los conocimientos necesarios para identificar cual sea el detalle que hace que no funcione.´Así que... Help.. Help y mas Help.  :mrgreen:

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #11 en: 22 de Septiembre de 2007, 19:35:30 »
Parece ser que las variables utilizadas por el CCS entran en conflicto entre si. Puedes realizar varias pruebas, por ejemplo declara la variable cad a nivel global haber que es lo que pasa. Por cierto tienes unas simulación en Proteus para poder probar el programa? si lo tienes postealo y así poder realizar las pruebas. Cambia esta línea para verificar que num tiene lo correcto:

printf("%s - %u",cad,num);


Un saludo
« Última modificación: 22 de Septiembre de 2007, 19:39:30 por jfh900 »
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #12 en: 23 de Septiembre de 2007, 03:03:58 »
He estado realizando algunas pruebas,

Con un 876 el programa junto con la itoa funciona bien, sin embargo al cambiar el PIC por un 18 ya va mal.

También he estado probando con otro programa que tengo para la recepción de datos por interrupción y también va mal con el PIC18.

Algo habrá que añadir o cambiar en la programación para que funcione con los PICs18 ... a eso no llego todavía pero me lo voy a mirar.

Un saludo

Desconectado huichoman

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 186
    • Pequeñas piezas para grandes proyectos.
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #13 en: 23 de Septiembre de 2007, 15:23:26 »
Hola amigos, gracias por la ayuda. Esta semana es de exámenes en mi universidad, voy a tener poco tiempo para hacer pruebas, pero el fin de semana seguiré en lo mismo. Saludos y gracias de nuevo por la ayuda.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Ayuda #INT_RDA de _RS232_buffered.c no permite usar itoa.
« Respuesta #14 en: 24 de Septiembre de 2007, 13:30:27 »
Joer con la cantidad de tiempo que no tocaba los PICs y encontrarme con este defecto. Bueno después de multiples pruebas con PROTEUS he conseguido detectar porqué no funcionaba el programa _232_Buffered.c original de RedPic con el 18F4525 (con el 16F876 sí que va bien).

El funcionamiento anómalo está en la línea: int const lenbuff=32;

Si en lugar de 32 lo bajamos y ponemos por ejemplo 25 ya va bien. ¿Porqué sucede eso?  ¡ni pajolera idea!