Autor Tema: Es CCS o soy yo el problema?  (Leído 3328 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Es CCS o soy yo el problema?
« en: 24 de Septiembre de 2008, 17:37:32 »
Sucede que estoy trabajando con CCS, intento recibir un float por RS232, cuyos dígitos están separados en cada byte que me manda. Es decir, me llegan 21 btes, de esos 21 9 corresponden al numero float.

Me explico mejor:

llegan: 1,2,3,4,5,6,7,8,9 que uniéndolos me deben quedar 123456,789.

Entonces, yo lo que hago es esto:

Código: [Seleccionar]
        Valor_Recarga=Valor_Recarga+(float)(Buffer_in[6]*100000);
Valor_Recarga=Valor_Recarga+(float)(Buffer_in[7]*10000);
Valor_Recarga=Valor_Recarga+(float)(Buffer_in[8]*1000);
Valor_Recarga=Valor_Recarga+(float)(Buffer_in[9]*100);
Valor_Recarga=Valor_Recarga+(float)(Buffer_in[10]*10);
Valor_Recarga=Valor_Recarga+(float)(Buffer_in[11]*1);
Valor_Recarga=Valor_Recarga+(float)(Buffer_in[12]/10);
Valor_Recarga=Valor_Recarga+(float)(Buffer_in[13]/100);
Valor_Recarga=Valor_Recarga+(float)(Buffer_in[14]/1000);

Si se puede hacer esto? No me esta funcionando... :?

Si yo hago previo a lo anterior esto:
                       
Código: [Seleccionar]
For(i=6;i<15;i++)Buffer_in[i]=1;//<-------------- DEBUG BORRAR
Pues me esperaria 111111,111.

Y me aparece 143.000 en la LCD.  :? :? :?

Ya estoy loco con esto. Me pueden indicar si yo estoy haciendo mal las cosas por favor.  :mrgreen: Gracias!!


Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Es CCS o soy yo el problema?
« Respuesta #1 en: 24 de Septiembre de 2008, 17:44:32 »
Hola.

Que tipo de variable es valor_recarga? me imagino que float.

Porque no usar mejor una de las funciones para pasar de string a float directamente?

saludos
El papel lo aguanta todo

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Es CCS o soy yo el problema?
« Respuesta #2 en: 24 de Septiembre de 2008, 18:31:55 »
MLO, efectivamente Valor_Recarga es Float.

Y cuales son esas funciones??

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Es CCS o soy yo el problema?
« Respuesta #3 en: 24 de Septiembre de 2008, 19:37:47 »
Esto es lo que intento hacer:


Primer paso.
Lleno el buffer de 1 decimal.

Segundo paso:
Tomo los valores en el buffer y los meto en la variable Valor_Recarga.

Tercer paso:
Guardo Valor_Recarga en la EEprom interna y tambien lo guardo en otrass posiciones como Backup por si se borra (Que no es raro en los PICs). Y luego leo lo que acabo de escribir, para corroborar que quedo bien escrito.



Si fijan agregue unos Printf despues de haber calculado y otro despues de guardar y leer nuevamente lo guardado. pues eso me dio la LUZ.

El calculo lo hace bien, pero al guardar en la eeprom y leer nuevamente, es donde sale el dato mal. Entonces, el problema esta es en la rutina de guardar y leer en la eeprom.

Ahora, esa es la que uso siempre, y ahora me viene a dar problemas...  :?



Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Es CCS o soy yo el problema?
« Respuesta #4 en: 24 de Septiembre de 2008, 19:54:22 »
Hola Ernesto.

Me da la impresión que estas haciendo el moldeado de los caracteres mal. Tu haces:

(float)(Buffer_in[7]*10000)

Con lo que estas multiplicando por 10.000 el valor del caracter ascii (en el caso de contener un "1" seria, 31*10.000), con lo cual primero debes de convertir a número y despues multiplicar.

Suponiendo que funcione en este caso el moldeado de la variable, tendriamos:

((float)(Buffer_in[7]))*10000

Con lo cual convertimos primero a número y después multiplicamos.

Para convertir una cadena a numero se utiliza:

strtol(nptr,& endptr, base)

Con lo que podrías convertir directamente buffer_in en su número.

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 LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Es CCS o soy yo el problema?
« Respuesta #5 en: 24 de Septiembre de 2008, 19:58:52 »
Mas claro, no puede estar.

Instale el CCS 3.249.. y SORPRESA!!!


La Escritura y lectura de la EEPROM funciona perfecto...PERO!! Ahora el calculo para sacar el Valor_Recarga no sirve, siempre da 0.000. Entonces  en el programa después del intento de calcular, le doy un valor fijo a Valor_Recarga y efectivamente se graba y se lee bien de la eeprom. (Lo marque en el código para que vean donde es que coloque el valor fijo en la variable).



Entonces??

CCS 4.074 Funciona los calculos pero no almacenar en la EEPROM

CCS 3.249 Funciona almacenar en la EEPROM pero no los calculos.

Que hago?  Creo que seria mejor cambiar la forma de hacer el calculo que la de almacenar en la EEPROM ¿No les parece?

Me pueden dar alguna guia por favor?

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Es CCS o soy yo el problema?
« Respuesta #6 en: 24 de Septiembre de 2008, 19:59:49 »
No amigo Jesus, en el Buffer no me llegan ascii, me llegan directamente enteros.


Bueno, cambie como me lo pediste Jesus, pero me sigue dando el resultado del calculo 0.000

quedo asi:
Código: [Seleccionar]
Valor_Recarga=Valor_Recarga+((float)(Buffer_in[6]))*100000;
Valor_Recarga=Valor_Recarga+((float)(Buffer_in[7]))*10000;
Valor_Recarga=Valor_Recarga+((float)(Buffer_in[8]))*1000;
Valor_Recarga=Valor_Recarga+((float)(Buffer_in[9]))*100;
Valor_Recarga=Valor_Recarga+((float)(Buffer_in[7]))*10;
Valor_Recarga=Valor_Recarga+(float)(Buffer_in[11]);
Valor_Recarga=Valor_Recarga+((float)(Buffer_in[7]))/10;
Valor_Recarga=Valor_Recarga+((float)(Buffer_in[7]))/100;
Valor_Recarga=Valor_Recarga+((float)(Buffer_in[7]))/1000;



Tambien intente con atof de la libreria stdlib.h y nada, me sigue dando 0.000
« Última modificación: 24 de Septiembre de 2008, 20:12:09 por PICmouse »

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Es CCS o soy yo el problema?
« Respuesta #7 en: 24 de Septiembre de 2008, 20:09:57 »
Prueba a usar la función que te pase.

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 LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Es CCS o soy yo el problema?
« Respuesta #8 en: 24 de Septiembre de 2008, 20:20:42 »
Pero esa convierte a long, y Valor_Recarga es Float, por eso use atof, pero no se si la uso mal, yo hago esto:

Valor_Recarga=atof(Valor);

donde Valor es otra cadena pero llena de 1 decimal, esperaría al menos 11111 y nada, me entrega un 0.00

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Es CCS o soy yo el problema?
« Respuesta #9 en: 24 de Septiembre de 2008, 20:30:35 »
Otra cuestión.

Si quieres representar el número: 123456,789 mediante el printf, tendrás que poner:

printf("%10.3", Valor_Recarga);

Hay que indicarle el número total de caracteres a sacar (incluido el punto decimal) y seguido de un punto el número de decimales.

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 MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Es CCS o soy yo el problema?
« Respuesta #10 en: 24 de Septiembre de 2008, 21:01:49 »
Hola.

La funcion que pasa de string a float es la funcion atof();

Saludos
El papel lo aguanta todo

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Es CCS o soy yo el problema?
« Respuesta #11 en: 24 de Septiembre de 2008, 21:07:28 »
Hola

No vi bien el ultimo pedazo de tu post en el que decias que no te funciono la funcion atof. A mi me funciona bien, tengo la version 4.057. Una cosa: el tamaño del vector que guarda al string que va a ser float debe finalizar en '\0' (o null) para que la funcion te retorne un valor, de modo contrario siempre sera 0.

Saludos
El papel lo aguanta todo

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Es CCS o soy yo el problema?
« Respuesta #12 en: 24 de Septiembre de 2008, 21:22:23 »
Hola!!

Ya me funciono!!!!  :-/

Con la atof pude lograr que trabajara. El problema es que atof espera son ascii y yo le entregaba los enteros tal cual como me llegaban, ademas debe existir el "." para separar la parte entera de la decimal, y debe terminar la cadena de texto en 0.

Así me quedo el programa:


Resalte como hago para pasar los enteros a ascii, colocarle el "." y ademas terminar la cadena en 0x00.



Hola MLO, contestaste mientras yo escribia. Si efectivamente el atof lo estaba usando mal yo. De resto va muy bien.

Quiero agradeceles a  MLOy a Jesus,  por darme el apunte de usar las funciones para pasar de string a float directamente.

GRACIAS!!!

PD: De todas maneras el CCS tiene un BUG mas. Con el PIC18F4550, la eeprom no graba bien los datos que se le dicen en las versiones 4.xxx y en las 3.xxx no realiza las operaciones con float bien.


« Última modificación: 24 de Septiembre de 2008, 21:26:58 por PICmouse »

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Es CCS o soy yo el problema?
« Respuesta #13 en: 24 de Septiembre de 2008, 22:23:59 »
 :-/ :-/ :-/ :-/

Ok!!! un gusto para mi poder ayudarte

Saludos
El papel lo aguanta todo