TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: bitclock001 en 03 de Noviembre de 2014, 21:33:17
-
Saludos
Tengo problemas para convertir una variable tipo float a string, para transmitir al PC por puerto serial, creo que tengo el código bien, pero me saca un error en la línea donde realizo la conversión a string (no identificado). Tengo el CS compiler versión 4.093, pienso que falta una librería, inserto el código completo:
#INCLUDE <16F887.H>
#DEVICE ADC=10 //Define que el conversor trabaja a 10 bits
#USE DELAY(CLOCK=4000000)
#USE RS232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#BYTE PORTA=5
#DEFINE USE_PORTB_LCD TRUE
#INCLUDE <LCD.C>
#INCLUDE <STDIO.H>
FLOAT VOLTAJE,VOLT,VOLTA;//Definir la variable VOLTAJE comouna variable tipo LONG
MAIN()
{
SET_TRIS_A(0B11111111);
SETUP_ADC_PORTS(ALL_ANALOG);
SETUP_ADC(ADC_CLOCK_DIV_8);
LCD_INIT();
LCD_PUTC("\f");
LCD_GOTOXY(1,1);
LCD_PUTC(" CONVERSOR A/D");
WHILE(1)
{
SET_ADC_CHANNEL(0);
DELAY_MS(1);
VOLTAJE=READ_ADC();
VOLT=(5*VOLTAJE)/1023;
LCD_GOTOXY(1,2);
PRINTF(LCD_PUTC," VOLTAJE= %01.3fV",VOLT);//Muestra el valor numérico de la conversión.
DELAY_MS(200);
sprintf(string,"\f%1.3f",VOLT);//Paso a string el valor float
PUTC(VOLT);
delay_ms(150);
}
-
int main ()
{
char buffer [50];
int n, a=5, b=3;
n=sprintf (buffer, "%d plus %d is %d", a, b, a+b);
printf ("[%s] is a string %d chars long\n",buffer,n);
return 0;
}
Salida:
[5 plus 3 is 8] is a string 13 chars long
Un ejemplo que encontre donde muestra el sprintf
Te saca el error por que en donde tenes escrito string va una variable que no tenes definida, mira el ejemplo asi te das cuenta.
-
Cuál variable?
El error es que me colorea la instrucción string y me saca el mensaje Undefined Identifier string
Este es la porción de código que me saca el error
SET_ADC_CHANNEL(0);
DELAY_MS(1);
VOLTAJE=READ_ADC();
VOLT=(5*VOLTAJE)/1023;
LCD_GOTOXY(1,2);
PRINTF(LCD_PUTC," VOLTAJE= %01.3fV",VOLT);//Muestra el valor numérico de la conversión.
DELAY_MS(200);
sprintf(string,"\%1.3fv",VOLT);//Paso a string el valor float
PUTC(VOLT);
delay_ms(150);
-
Es que no tenes definido una variable, eso quise hacerte entender con el codigo que puse.
Tu codigo:
sprintf(string,"\%1.3fv",VOLT);
El que te pase (un poquito modificado):
char buffer[50];
sprintf (buffer, "%.3f", VOLT);
-
Yo lo hago así, esta función la idee yo pero la puedes modificar a tu gusto, de todas maneras sigo trabajando en ella para hacerla más automática.
Tuve que hacerlo así porque en c18 no admite variables en punto flotante la función sprintf.
/************************************************************************
Función:
void *FloatCadena(signed float valor, char wLeng, char ComaPosicion, unsigned char *array);
Sumario:
Convierte un caracter o un dato en punto flotante (float) a un array
Descripción:
Precondición:
Ninguna
Parámetros:
valor = se le introduce el dato en formato float
wLeng = Longitud del array
ComaPosicion = Posición del punto ósea la coma que queremos poner en el array
array_float = Puntero hacia un array donde se guardará el float coinvertido en ASCII
Retorno:
un array con el dato float pasado a ASCII, ejemplo: "23.90"
Ejemplo:
FloatCadena(23.90, 5, 2, array_float);
*****************************************************************************/
//Conversión de un float en un array
void *FloatCadena(signed float valor, char wLeng, char ComaPosicion, char *array_float){
char i = 0;
char a = 0;
signed int entero = 0;
char ArrayFuncion[7];
entero = valor *1000; //Convertimos el decimal en un valor entero
itoa(entero, ArrayFuncion); //Convierte el entero en una cadena
for(i=0;i<wLeng;i++){
array_float[i] = ArrayFuncion[a++];
if(i==ComaPosicion){
array_float[ComaPosicion] = '.'; //Punto para el valor en decimal //se pone a 0 el contador
a = a-1;
}
}
if(i == wLeng){
array_float[wLeng] = '\0';
}
}
no sé si será lo que estas buscando, siento las faltas de ortografía :oops:
aaa me olvidaba decir que admite valores negativos
-
YO creo que es lo mejor Thulsa ya que no incluis toooooda la libreria y solo la funcion :)
-
es que solo esta función es suficiente, la añades a tu código fuente y le añades los datos que pide y te funcionará, estudiala.
no sé si ccs tiene restringida la función sprintf como en c18
-
OK. Muchas gracias
-
hay una cosa que no funciona bien del todo en la función, si le pones un decimal que empiece por 0, el código te anula el 0, ósea si le pones un decimal como -1.0, o 2.34, funcionará bien, pero si le pones un decimal como 0,5 o -0.5, en esa situación falla, se come el 0 , con lo cual el valor 0.5 te lo convierte en 5, sigo trabajando para ver si lo soluciona.
siento que la función no trabaje todo lo bien de debiera
-
Aqui tienen un ejemplo que funcina en el proteus 100%
#include <18f252.h>
#Fuses xt,nowdt,put
#use delay (crystal=4000000)
#use rs232(baud=9600, xmit= pin_b0, rcv= pin_b1)
void main()
{
int16 dato;
float valor;
char st1[10];
dato= 561;
valor= dato*5.0/1023;
sprintf(st1,"%.4f",valor);
printf("%s",st1);
sleep();
}
:mrgreen:
Saluds