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!!
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!!