TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: piriots en 28 de Mayo de 2007, 13:25:58
-
Buenas!! estoy haciendo un programa y me encuentro con un problemilla. Si saco una variable float por la LCD no tengo ningun problema, la dificultad aparece cuando defino los decimales que quiero %1.2f, lo que me ocurre en este caso es que el lcd no muestra bien los datos, muestra la primera fila, parpadea se borra la primera fila y se queda la segunda hasta que se refresca la lcd (mediante interrupcion del timer). ¿Alguien sabe que es lo que puede ocurrir? Aqui les dejo el trozo de codigo que me da los problemas.
float pinof;
float coronaf;
pinof=pino;
coronaf=corona;
enable_interrupts(int_timer0);
enable_interrupts(int_timer2);
reltrans=coronaf/pinof;
rpmcotxe=conta*reltrans; // calculamos las rpm del motor a partir de las ruedas
// velocitat=conta*(6.2832 *(diametre/2)); // calculamos la velocidad a partir del diametro de la ruda y las vueltas
// velms=velocitat/1000;
lcd_putc("\f"); // borra el display
lcd_gotoxy(1,1);
printf(lcd_putc,"V=14.3 Ve=%1.2f\n",reltrans);
printf(lcd_putc,"I=150 Rpm=%lu",rpmcotxe);
Salu2 y gracias
-
Trata de modificar tu programa de esta manera.
printf(lcd_putc,"V=14.3 Ve=%1.4f\n",reltrans);
Me parece, me parece!! digo que algunos compiladores la segunda cifra la entienden como el numero total de caracteres que va a imprimir el float esto quiere decir segun el 1.4:
vas a escribir
1-> unidades-> un espacio
. -> coma decimal -> un espacio
2 -> decimales -> dos espacios
en total 4
pruebalo y nos cuentas ;)
-
Ahora mismo lo he probado y la cosa sigue igual y la verdad es que no tengo la menor idea del porque.
Salu2
-
Que tipo de variables son reltrans y rpmcotxe ?
No veo las declaraciones... :mrgreen: :mrgreen:
-
Piriots, ¿no será que con un sólo dígito entero el resultado no cabe y el PIC se hace la picha un lío?
-
No ves la declaracion porque son variables globales y las he puesto al principio del programa
static float reltrans=0;
static long int rpmcotxe=0
Manolo normalmente el resultado estara entre 1 y 3 la parte entera, y con 2 decimales hay suficiente. El resultado es correcto cuando uso %f por ejemplo salia 2.70000000000 pues claro esta que no necesito todos estos ceros para nada, al intentar acortar el numero de posiciones decimales %1.2f no sale el resultado y es cuando empieza a parpadear la pantalla.
Salu2
-
Si consigues que CCS pueda poner un valor float en una variable STATIC, por favor avisame, asi yo tambien lo hago!! :D :D :D :D
Una variable Static en C es una constante!! :mrgreen: :mrgreen: :mrgreen: :mrgreen:
-
Si consigues que CCS pueda poner un valor float en una variable STATIC, por favor avisame, asi yo tambien lo hago!! :D :D :D :D
Enga pues vamos a intentarlo! me lo tomare como un reto personal :D :D :D
Continuemos con el asunto de la variable magica :-) , he intentado hacer lo mismo declarando la variable solo float y el resultado es el mismo, la LCD parpadea sin mostrar el resultado.
Marcos, tu post me ha creado una duda, porque si no puedo poner un valor float en una static, antes obtenia el resultado correcto usando %f y al usar %1.2f aparecen los problemas?
Salu2
-
Pues es raro lo que te pasa, pero en vista de lo habitual de los bugs de CCS, yo probaría compilando con otra versión.
-
...
Una variable Static en C es una constante!! :mrgreen: :mrgreen: :mrgreen: :mrgreen:
que raro, yo tenía la idea que con static, se iniciaba la variable a cero al ejecutarse un programa. :5}
-
segun F1 (AYUDA!!!!) en CCS
static
Variable is globally active and initialized to 0. Only accessible from this compilation unit.
-
Pido disculpas, aparentemente estoy equivocado respecto de Static. :shock: :shock: :shock:
Pero igualmemente ese tipo de variables puede ser utilizada dentro del programa, como hace Piriots?? :shock: :shock: :shock:
-
que raro, yo tenía la idea que con static, se iniciaba la variable a cero al ejecutarse un programa. :5}
Esta es la intencion que yo tenia al hacer la declaracion. Y segun tengo entendido, las variables globales hay que declararlas fuera de las funciones y del main, esto es lo que he hecho yo:
#include <16f877.h>
#use delay(clock=4000000)
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD
#org 0x1F00, 0x1FFF // bootloader
#include <lcd.c>
//#define use_portb_lcd
#byte port_a=5
#byte port_b=6
#byte port_c=7
static int long_roda=0;
static int velocitat=0.00;
static int velms=0.00;
static long int rpmcotxe=0;
static long conta=0;
static long rpm=0;
static float reltrans=0;
static int cotxe=0;
static int actualitza=0;
static int pral=0;
static int sec=0;
int diametre=10;
int pino=9;
int corona=27;
static int tecla=0;
Esta es la declaracion de variables que he hecho, el motivo de que sean static es que necesito utilizar el valor y modificarlo dentro de distintas funciones, por lo que tiene que ser una variable global.
¿Cual seria la forma correcta de hacerlo?
Salu2
-
Ya lo he solucionado!! al final no era ningun problema de variables! El caso es que para refrescar los valores del lcd utilizo la interrupcion del timer 2, y no se que es exactamente lo que pasaba pero cambiando la configuracion del timer se ha solucionado el problema.
Gracias por vuestros comentarios!
Salu2
-
Me alegro que lo tengas, ¡pero qué raro!
-
Si Manolo, muy extraño... no se que tiene que ver el timer con estas rarezas al representar variables. Yo estava seguro que pasaba algo con las variables, pero probé que ocurria si no refrescaba la LCD y me di cuenta que funcionaba, luego empecé a cambiar configuraciones a boleo y de repente funcionó, claro esta que no lo he vuelto a tocar. El tiempo de refresco esta alrededor de un segundo o algo mas, no me he parado a calcularlo, antes era unos 750ms.
Salu2
-
analizando lo leido anteriormente a mi también me llegó a ocurrir eso.
la letras en la lcd parpadeaban, y la solución fué introducir un retardo antes de mandar nuevos datos a la pantalla.