Mostrar número en pantalla LCD mayor que 40000

Hola a todos!!Estoy trabajando en un proyecto en el cuál calculo la frecuencia de una señal.Ä su vez, muestro esta frecuencia en una pantalla LCD.Hasta aquí todo bien, mi problema es que a frecuencias superiores a 35KHz, el microcontrolador me calcula bien la frecuencia pero en el LCD me aparecen números negativos larguísimos.Por ejemplo:

Para 39kHz, el microcontrolador calcula 35714.29 (Comete un % de error que tengo que mejorar) pero en el LCD me aparece: -29822.32767.

Me parece muy extraño porque trabajo con una rutina que me saca solamente dos decimales, y me funciona bien hasta que llego a esas frecuencias.

Aquí os dejo mi código para ver si me podeis decir qué tendría que modificar para que me funcionara bien en cualquier rango de frecuencias.

Inicializa_LCD();
Comando_LCD(CURSOR_ON & BLINK_ON);
s_intpart = frecuencia; // integer part of float, as a signed int
f_fracpart = (frecuencia - s_intpart); // fractional part of float, as a float
u_fracpart = f_fracpart * 1000; // 100 * fractional part, as an unsigned int
sprintf(buf,(const far rom char*) "%d.%02u", s_intpart , u_fracpart );
Datos_LCD(" F= ");//una cadena desde la memoria de programa
Dato_String_LCD(buf);//una cadena desde la memoria de datos
Datos_LCD(" Hz ");//una cadena desde la memoria de programa
//con este comando pasamos a la linea 2 del LCD
Comando_LCD(DDRAM_LINEA_2);

Estas son las asignaciones que he utilizado:

unsigned float frecuencia,f_fracpart;
signed int s_intpart;
unsigned int u_fracpart;
char buf[20];

frecuencia es lo que quiero que me salga por el LCD.

Espero vuestras respuestas!!Muchisimas gracias!!

UN saludo!!;)
 
Una variable tipo signed int nunca superará los 32768. Para valores superiores, generará un desbordamiento, pasando a valores negativos.

La solución es usar un long int.
 
que compilador estas utilizando?¿?¿ de todas formas, la variable s_intpart no puede ser mas alta de 32000 y pico ya que al declararlo como signed int puede tener un total de 65536 valores, eso lo divides entre dos, la mitad positivos y la mitad negativos. . . ponlo unsigned ya que el valor de la frecuencia nunca va a ser negativo.

un saludo
 
Atrás
Arriba