Forum: Mikrocontroller und Digitale Elektronik Fleißkommafehler beim AVR


von Karlheinz D. (kdruschel)


Lesenswert?

Hallo zusammen,
ich habe hier einen Mega16 mit einem Display und möchte nun die 
Analogeingänge nutzen.
Im Prinzip geht es auch.
Also ich lege eine Spannung an den ersten Eingang (0..5V, interne 
Referenz Vcc, Kondensator an Aref). Den gewandelten Wert lasse ich mir 
auf dem Display ausgeben, sowohl als Countwert als auch umgerechnet in 
Volt.
Der Countzwert geht einwandfrei, es kommen Werte zwischen 0 und 1023. 
Aber bei der Umrechnung in Spannung geht nix, auf dem Display erscheint 
nur ein Fragezeichen. Habe ich eine Bibliothek vergessen ? Derzeit binde 
ich die "libm.a" und die "libprintf_flt.a" mit ein (ach ja: AVR Studio 
und gcc).
Ich habe versucht das Ganze im Simulator zu debuggen, aber im 
Watch-Fenster zeigt er immer 0 an für beide Variablen (was ja aber auch 
sein kann,d a habe ich ja keinen echten Analogwert).

Mein Codeauszug:
    if (adc_count >= 1000)
    {
  adc_count=0;
  AdcResult = ADC_Read_Avg(0,100);
  Volt = AdcResult*5.0/1024.0;
  sprintf(buffer,"%04d - %f V", AdcResult, Volt);
  lcd_setcursor(0,1);
  lcd_string(buffer);
    }

Greets
Karlheinz

von Yalu X. (yalu) (Moderator)


Lesenswert?


von Karlheinz D. (kdruschel)


Lesenswert?

Hm, was willst Du mir damit sagen ?
Die Compiler-Optionen "-Wl,-u,vfprintf -lprintf_flt -lm" bringen leider 
keine Veränderung.
Und da Volt als Double deklariert ist stimmt das Formatkennzeichen "%f" 
ebenfalls.

von Karl H. (kbuchegg)


Lesenswert?


von Thilo M. (Gast)


Lesenswert?

Karlheinz Druschel schrieb:
> sprintf(buffer,"%04d - %f V", AdcResult, Volt);

Hast du mal versucht, die Stellen anzugeben?
1
sprintf(buffer,"%04d - %4.3f V", AdcResult, Volt);
2
                        ^^^

Im AVRStudio kenne ich mich nicht aus, im Makefile sieht's mit den Libs 
dann so aus:

# If this is left blank, then it will use the Standard printf version.
PRINTF_LIB = $(PRINTF_LIB_FLOAT)
#PRINTF_LIB = $(PRINTF_LIB_MIN)
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)

von Karlheinz D. (kdruschel)


Lesenswert?

@Karl hein Buchegger: Wie ich bereits erwähnte habe ich die im Link 
angegebenen Libs eingebunden, und die Compileroptionen auch gesetzt. 
Passiert nur leider nix

@Thilo: Bringt leider auch nix, hätte mich auch gewundert.

von Martin (Gast)


Lesenswert?

... keinen echten Analogwert ...

Gib einen Wert per Hand ein.

von Mike R. (thesealion)


Lesenswert?

Das muß eine Linker-Option sein. Das Problem hatte ich auch schon mal 
:-)

von Thilo M. (Gast)


Lesenswert?

Hier ist die Einstellung beschrieben, dürfte di Selbe sein wie deine:
http://winavr.scienceprog.com/avr-gcc-tutorial/using-sprintf--function-for-float-numbers-in-avr-gcc.html

Muss man nicht math.h mit einbinden? Irgendwas habe ich da noch im 
Hinterkopf ...

von Karlheinz D. (kdruschel)


Lesenswert?

OKIDOK, ich habs .-)
Ich hatte die Optionen "-WI, -u, vfprintf" bei9 den Complier-Options, 
und nicht bei den Linker-Options eingetragen *lol

Danke für die Tips

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
Noch kein Account? Hier anmelden.