He estado desarrollando una miniaplicación para leer los valores PWM de un acelerómetro, es un ADXL210E.
Ya consigo leerlos, y además veo cómo varían según la inclinación que le dé, pero hay una pijotada que no me sale y me gustaría.
Se trata de formatear el resultado de salida, que es un float, de manera que me muestre un determinado nº de decimales.
En el código que adjunto ya consigo que calcule sólo los decimales que yo quiero, pero sin embargo, al representarlos en el LCD me sigue mostrando ceros a partir del último decimal, con lo que no me deja acabar con el símbolo del %.
Echadle un vistazo, masters del universo, y decidme algo, please:
Codigo:
#include <16F877A.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT
#define use_portb_lcd TRUE
#include "lcd.c"
#include "math.h"
float lee_acelerometro (int Eje, int Decimales) { // Según Eje sea 0 o 1 se lee el pin D0 o D1
// Decimales indica la resolución del resultado
// El resultado siempre será un porcentaje
int32 alto=0, bajo=0, j;
float Resultado;
int i;
for (i=0;i<10;++i) { // se lee 10 veces, para evitar márgenes de error (se puede modificar)
// si es necesaria mayor frecuencia
if (Eje) {
while( input(PIN_D0)); // esperamos a que baje la señal de entrada
while( !input(PIN_D0)); // esperamos a que suba la señal de entrada
while( input(PIN_D0)) { // mientras esté arriba vamos contando en alto
alto++;
} ;
while( !input(PIN_D0)) { // y mientras esté abajo vamos contando en bajo
bajo++;
};
} else {
while( input(PIN_D1) );
while( !input(PIN_D1) );
while( input(PIN_D1) ) {
alto++;
} ;
while( !input(PIN_D1) ) {
bajo++;
};
};
};
Resultado = (((float)alto/((float)alto+(float)bajo))-0.43)*10000/9; // el resultado es alto/(alto+bajo),
// las constantes son ajustes de escala y calibración del acelerómetro
Resultado = floor(Resultado*pow(10,Decimales))/pow(10,Decimales); // Formateamos el resultado con nº decimales
return (Resultado); // no he podido hacer toda la operación aquí porque me decía "Expression too complex"
}
void main()
{
lcd_init();
output_high (PIN_B0); // es un led que se enciende al arrancar, y me sirve para señalar si ha habido un reset
delay_ms (300); // lo mantengo encendido 3 décimas de segundo
output_low (PIN_B0); // y lo apago
while (TRUE) {
printf (lcd_putc,"fLectura: %f%%",lee_acelerometro(0,2)); // muestra el resultado de la lectura del eje 0
lcd_gotoxy (1,2);
printf (lcd_putc,"Lectura: %f%%",lee_acelerometro(1,2)); // muestra el resultado de la lectura del eje 1
output_high (PIN_B0);
delay_ms (100); // parpadea para saber que ha pasado por el bucle
output_low (PIN_B0);
};
}