Hallo zusammen, ich möchte Werte von A/D Wandler (ADS1118)mit Hilfe des LCD(HD4470) auslesen. Die Werte, die ich rauskriege, sind von Datentyp Integer aber ich möchte in Float und dann in string umwandeln. das hab ich mir überlegt: float f1, f2; ADC_Wert = ADC_Read(config_msb,config_lsb); // Datentyp int f1 = ADC_Wert; f1 = f2; f2 = ((f1*2.048)/(float)(32767*0.005*5)); //my_IntToString(ADC_Wert,buff,5); sprintf(buff,"%f",f2); ich bekomme leider immer nur eine Fragezeichen(?) auf dem Display. wie kann ich das lösen!!! Ich freue mich auf Ihre Antwort und bedanke mich im voraus. LG Grosso
El G. schrieb: > wie kann ich das lösen!!! Indem du uns die wichtigsten Informationen nicht vorenthältst. Prozessor, Compiler, Makefile...
Printf der avr C Library kann nur dann Floats ausgeben, wenn man dazu eine spezielle Library einbindet. Füge in das Makefile ein:
1 | # Enable floating-point support in printf |
2 | LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm |
Moin, Was ist denn mit der Zeile:
1 | f1 = f2; |
Wozu ist die gut? Gruss WK
Hast du einen Debugger? Breakpoint auf Zeile "f1 = f2;" und schauen was f2 fürn Wert hat. Du überschreibst nämlich deine Messung f1, was so nicht sein sollte.
> f1 = ADC_Wert; > f1 = f2; ------^--- Wassollas > f2 = ((f1*2.048)/(float)(32767*0.005*5));
El G. schrieb: > (32767*0.005*5) macht den konstanten Wert 819,175. sowie f2 = ((f1*2.048)/(float)(32767*0.005*5)); entspricht f2 = (f1 x Zahl1) / Zahl2 also f2 = f1 * (Zahl1/Zahl2), hier also 2048 / 819,175 = 2,50007629627369 --> Ich hätte jetzt einfach mal deine f1 x 2.5 gerechnet. Oder was genau bezweckst du mit dieser "Kalkulations-Grundlast" bei jedem Wandler-Vorgang?
El G. schrieb: > sind von Datentyp Integer aber ich möchte in Float und dann in string > umwandeln. Wozu float? Wieviele Nachkommastellen kann dein ADC auflösen? Wieviele Nachkommastellen willst du anzeigen? Mal angenommen, du willst 3 Nachkommastellen anzeigen, dann rechne doch einfach in Integer und in mV...
Wegstaben V. schrieb: > hier also 2048 / 819,175 = 2,50007629627369 wahrscheinlich soll das 2.048 sein, also ist der neue Wert 0,0025000762962737 das ändert aber nix an der Fragestellung: Warum eine wiederholende neu-Berechnung von konstanten werten?
@El Grosso Kann es sein, dass Du in Wirklichkeit eine Art Beschäftigungstherapie für deinen µP aufgebaut hast. Eventuell für thermische Betrachtungen. Natürlich sind Dein Rechner sowie die Entwicklungsumgebung geheim. Leute die Dir antworten wollen, sollen ruhig, kräftig im Nebel herumstochern. Zu deiner Rechnung: Die ist sinnlos, falsch und unnötig aufgeblasen. Die potentiellen Helfer sollen also ruhig noch ein wenig Raten...
Optimiert der Compiler diese Berechnung nicht sowieso zu einer simplen Multiplikation?
@Stefan Zumindest wird er aus 32767*0.005*5 was vernünftiges (819.175) machen.
Amateur schrieb: > Zumindest wird er aus 32767*0.005*5 was vernünftiges (819.175) machen. Das macht der Compiler aus konstanten doch sowieso?
Stefan U. schrieb: > Optimiert der Compiler diese Berechnung nicht sowieso zu einer simplen > Multiplikation? ein guter Compiler ja. Und es "ist" meistens :) besser, den code leserlich und logisch zu lassen, anstatt superoptimalen code zu schreiben, den man nach ein par Monaten (selbst mit Kommentaren) nicht mehr genau versteht. Aber Ausnahmen bestätigen wie immer die Regel.
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.