PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Befehl sprintf



Achim S.
18.04.2010, 17:50
Habe in einem Code den sprintf gefunden. Habe auch ein Stück code kopiert. Es geht ein einfach nicht so wie es soll. Damit soll die Spannung an einem Rob gemessen werden. Die Spannung liegt ständig am IC an und wird mit float berechnet und anschliessen angezeigt. Bekomme zwar die Anzeige Batterie und V aber als wert wird nur ein ? angezeigt. Die enrsprechenden Dazei habe ich eingebunden.

bot_update();
char text [32];
float ubatt = 0.0166 * bot_supply - 1.19;

sprintf(text, "%3.1fV",ubatt);
gfx_move(25, 0);
gfx_set_proportional(1);
gfx_print_text("Batterie :");
gfx_set_proportional(1);

gfx_print_text(text);

yaro
18.04.2010, 19:15
Der sprintf-Befehl ist eindeutig richtig.
Das Problem liegt wohl eher an deiner Berechnung von ubatt.
Versuch es mal folgendermaßen: float ubatt = 0.0166f * bot_supply - 1.19f;

Wenn das nicht klappt, versuch mal einen konstanten Wert (z.B. 6.4) mit sprintf auszugeben. wenn das nicht klappt, müssen wir weiterschauen.

Gruß, Yaro

Achim S.
18.04.2010, 19:38
Hallo
habe gleich die Sache ubatt ausprobiert. Das war leider ohne Erfolg. Als nöchstes mache ich den konstanten wert. mal sehen ob das geht.
Achim

yaro
18.04.2010, 20:31
Welchen Compiler verwendest du?

Gruß, Yaro

Achim S.
19.04.2010, 20:18
Ich nehme AVRStudio4. Wenn ich die Zeilen -WI, -u, -vprintf eingebe bekomme ich diese Fehlermeldung. Komme nicht ganz mit

"cc1.exe: error: unrecognized command line option "-WI""

Achim

yaro
19.04.2010, 22:03
Der Error sagt, dass die Option -WI von ihm nicht erkannt wird.
Kenne mich damit leider nicht aus, kann da also nicht weiterhelfen.....

Hast du sprintf schon versucht, mit einer Konstanten auszuführen?
sprintf(text, "%3.1fV",6.7534f);
Hat es geklappt, oder nicht?

Gruß, Yaro

Jaecko
20.04.2010, 07:30
Achtung Falle: Ein grosses I sieht fast genau so aus wie ein kleines l.
Die Option ist -Wl.

Was ich hier oft noch machen muss: Die Libs libm.a und libprintf_flt.a dazulinken, dass aus dem ? ein brauchbarer Wert wird.

Achim S.
20.04.2010, 16:58
Hallo
erst mal danke für die Antwort. Habe es gleich ausprobiert. Wenn ich eine Zahl eintippe im sprintf bekomme ich meldung das es double sein soll und keine Anzeige bzw. wird abgebrochen. Habe alles versucht so mit kleinen l und i und 1 und alles gross. Die Datein sind eingebunden. Bekomme trotzdem Fehlermeldung. Nach dem Tutorial soll ich die Datein bei Customer Options > Linker Options eingeben. Richtig?
Achim

yaro
20.04.2010, 20:54
Versuch es mal so:
float a = 4.3f;

sprintf(text, "%3.1fV",(double)a);

So sollte zumindest keine Fehlermeldung auftreten.

stdio.h hast du doch sicherlich eingebunden, oder?

Gruß, Yaro

Achim S.
21.04.2010, 17:24
Hallo yaro
Habe das Programm so geändert wie du es beschrieben hast. Das ? bleibt.Ich bekomme kein Ergebnis. Wenn ich die Datei -vfprintf bei Linker Options eintrage bekomme ich wieder einen Fehler angezeigt. Die stdio.h steht im Kopf, wenn ich sie stdio_init() bekomme ich auch einen Fehler. Kennst du vielleicht einen anderen Weg um die Spannung anzuzeigen ohne sprintf. Es geht doch dabei nur um die Umrechnung und die ricjtige Darstellung.
Achim

yaro
21.04.2010, 18:20
Es geht mit char * itoa ( int value, char * str, int base );
Value ist der Wert, str ein char array und base ist die Basis (10 für dazimale ausgabe).
Das Problem ist, dass es eben kein float ist, sondern "nur" ein int, was man ausgeben kann. Natürlich kann man das umgehen, wenn man den float zuerst mit 10 multiplziert und dann in ein int castet.


In Code sieht das dann ungefähr so aus:

#include <string.h> //eins von beiden, weiß nicht mehr, welches
#include <stdlib.h>

float komma = 4.5f;

int zahl = (int)(komma*10);

char ch_zahl[5];

itoa(zahl, ch_zahl, 10);

gfx_print_text(ch_zahl);


Sollte gehen. Ansonsten gibt es glaub ich auch eine Funktion ftoa(), habe ich aber noch nicht ausprobiert.

Probier erstmal itoa() aus......wenn das nicht geht, gibts noch andere Möglichkeiten =)

Gruß, Yaro

P.s. aktualisier vielleicht mal deinen Compiler, weiß nicht, wie alt der ist...