Forum: Mikrocontroller und Digitale Elektronik AVR-C double gibt auf LCd nur aus


von Martin F. (martin_f70)


Lesenswert?

Hallo Freunde.

Ich habe ein double so berechnet:
uint8_t int1 = 255;
uint8_t int2 = 46;
double s;
s = (3-7)/(int1-int2);

char buffer[20];

sprintf(buffer, "%f", s);

lcd_string(buffer);

-> auf LCD ist nur ein ?


Warum?

von Bastler (Gast)


Lesenswert?

printf-Lib mit FP-Support dazugebenden?
Steht im FAQ.

von Bitflüsterer (Gast)


Lesenswert?

Und warum machst Du hier einen zweiten Thread auf?
Beitrag "Re: C - Zwei Zahlen zu einer Mappen"

Die Sache mit den Libs ist Dir dort auch schon gesagt worden. Was soll 
der Blödsinn?

von Martin F. (martin_f70)


Lesenswert?

Wie genau meinst du das?

von Bitflüsterer (Gast)


Lesenswert?

Was meint wer?

von Martin F. (martin_f70)


Lesenswert?

Sag einfach wie das geht bitte?

von sebi707 (Gast)


Lesenswert?

Deine Rechnung enthält nur Integer daher wird das Ergebnis auch nur ein 
Integer sein. Der Teil "int1-int2" kann noch als Integer berechnet 
werden aber für die Division musst du mit doubles rechnen. Ich würde es 
so schreiben: s = (3.0 - 7.0)/(int1-int2);

Bin mir außerdem nicht ganz sicher ob man für den AVR nicht noch 
irgendwo aktivieren muss, dass sprintf auch mit float/double 
funktioniert. Meine ich mal gelesen zu haben aber ich kenn mich mit der 
AVR Programmierung selbst noch nicht so gut aus. Das würde auf jeden 
Fall das Fragezeichen erklären.

von Bastler (Gast)


Lesenswert?

Der Ausdruck ohne FP-Wert ist ein Problem. Dadurch wird aber nur ein 
falsches Ergebnis berechnet. Wenn printf keinen FP-Support hat, dann 
kommt eben "?" statt Zahl.

von Martin F. (martin_f70)


Lesenswert?

Kannst du mir sagen was FP-Support ist?

von Martin F. (martin_f70)


Lesenswert?

Oder kannst du mir sagen wie ich den nutzen kann bitte?

von Mike (Gast)


Lesenswert?

Martin Fischer schrieb:
> Kannst du mir sagen was FP-Support ist?

Unterstützung von Operationen mit Floating Point (deutsch: Fließkomma-) 
Zahlen.

von Bastler (Gast)


Lesenswert?

Das printf FP-Zahlen ausgeben kann. Braucht man auf dem AVR oft nicht, 
aber braucht massig Platz im Flash. Wenn man es braucht, dann muß man 
dem Linker sagen, vor der StandardLib mit kleinem printf, die 
Full-Featured-printf Lib zu linken.
http://www.mikrocontroller.net/articles/FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_bei_WinAVR_bzw_AVR-Studio

von TriHexagon (Gast)


Lesenswert?

Sag mal liest du eigentlich auch die Beiträge? Rolf Magnus hat das schon 
im letztem Thread angemerkt.

Rolf Magnus schrieb:
> Dein Problem ist, daß du die Doku der avr-libc nicht gelesen hast. Da
> floating-point sehr viel Flash braucht, unterstützt das per default
> gelinkte printf keine Gleitkommazahlen.

Wenn du jetzt nicht weißt was Fließkomma oder Floating-Point ist. Dann 
lese endlich mal dein C-Buch gescheit!

von Martin F. (martin_f70)


Lesenswert?

Wie kann ich das in avr-gcc aktivieren bei den linker-optionen? ich 
nutze kein winavr..

von Martin F. (martin_f70)


Lesenswert?

Kann mir bitte jemand helfen???

von Georg G. (df2au)


Lesenswert?

RTFM!

von Martin F. (martin_f70)


Lesenswert?

Bin gerade in Zeitdruck, kannst du mir nur noch das bitte kurz verraten? 
Danke

von Bastler (Gast)


Lesenswert?

Dann sollte in deinem makefile irgendwo -lm stehen.
Davor (damit printf schon da ist, wenn die kleinere Version aus der 
Standard-Lib dazukommt) noch ein -lprintf_flt schreiben und das ? 
verschwindet.
Bleibt noch der Ausdruck ohne FP, der dann als INT berechnet wird und 
deshalb nicht so aussehen wird, wie du erwartest. Mach aus den 
Konstanten FP, Z.B. (3.0-7.0) ..., und es wird gut.

von Bitflüsterer (Gast)


Lesenswert?

LTFMBRBY

von Helmut S. (helmuts)


Lesenswert?

In  stdlib.h gibt es eine hilfreiche Funktion zum Konvertieren von 
Double.

"dtostrf() function returns the pointer to the converted string \c "


char Temp_str[18];
double Temp_ntc;


dtostrf(Temp_ntc, 6, 2, TEMP_str); 6 Zeichen davon 2 hinter dem Komma

von Bastler (Gast)


Lesenswert?

BTW, das alles sagt Dr Gugl, wenn man ihn nett fragt ( und wenn man das 
lange nicht machen will, dann wird dieses Forum auch mal unwirsch!)

von Martin F. (martin_f70)


Lesenswert?

Helmut S. schrieb:
> In  stdlib.h gibt es eine hilfreiche Funktion zum Konvertieren von
> Double.
>
> "dtostrf() function returns the pointer to the converted string \c "
>
>
> char Temp_str[18];
> double Temp_ntc;
>
>
> dtostrf(Temp_ntc, 6, 2, TEMP_str); 6 Zeichen davon 2 hinter dem Komma

Danke,c klappt supi

von Helmut S. (helmuts)


Lesenswert?

Ehrlich gesagt habe ich die Funktion früher auch nicht gekannt.
Ich habe bei meinem ersten C-Projekt einfach verschiedene Beispiele in 
einem Buch angeschaut. Da lernt man dann schnell welche Funktionen bei 
den Mikrocontrollern hilfreich sind um mit wenig Programmzeilen zum Ziel 
zu kommen.

von Ralph S. (jjflash)


Lesenswert?

Schmunzeln muss (weil mir Herr Fischer70) schon mal aufgefallen ist (ob 
seiner eigenen Aussage nach exorbitant sensationell guten 
Programmierkenntnisse)... Okay, er hat sowas in der Art geschrieben 
gehabt: Programmieren kann ich perfekt!

Wenn er jetzt den obigen C-Code verwendet ist das ja gut (und 
Speicherresourcen schonend, weil die FP-Funktion von printf nicht 
verwendet wird)...

Nuuuuuuuuuur: wie man nun die entsprechende Bibliothek (wenn er noch 
einmal FP-Unterstützung in seinem Programm benötigt) hinzulinkt... weiß 
er immer noch nicht !

Manche Leute sind wirklich so was von lernresistent...

Wie gesagt, "schön dass es ihn gibt", er bringt einen wenigstens zum 
Lachen !

von Martin F. (martin_f70)


Lesenswert?

Ralph S. schrieb:
> weiß
> er immer noch nicht !

Stimmt, kannst du mir nun sagen wie es geht?

von TriHexagon (Gast)


Lesenswert?

Tja wärst du dazu fähig Google zu benutzen, wüsstest du das schon 
längst. Aber das bist du leider nicht. Deshalb Pech gehabt.

von Georg G. (df2au)


Lesenswert?

Lies doch mal das hier:
http://www.mikrocontroller.net/articles/FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_bei_WinAVR_bzw_AVR-Studio

Es ist zwar auf das AVR Studio gemünzt, aber die Linker Optionen sind 
die gleichen, wie bei dir. Beide verwenden den GCC Linker.

von Ralph S. (jjflash)


Lesenswert?

Angenommen dein Programm heißt "test.c" und dein Controller ist ein 
ATmega168, dann könnte das so aussehen (kann und nicht muß, viele Wege 
führen nach Rom... oder zur Floating-Point-Ausgabe):

avr-gcc test.c -c -o test.o -Os -mmcu=m168

(es wird eine Datei namens "test.o" erzeugt)

avr-gcc -mmcu=m168 -Wl,-u,vfprintf -Wl,-Map=test.map test.o -lprintf_flt 
-lm -o test.elf

(es werden aus der Datei "test.o" die Dateien namens "test.map" und 
"test.elf" erzeugt - die "elf-Datei" ist die wichtigere)

avr-objcopy -j .text -j .data -O ihex test.elf test.hex

(aus der Datei "test.elf" wird die Datei "test.hex" erzeugt... die zum 
Flashen von AVRDUDE benötigt wird).

----------------------

Warum diese Aufrufe so sein müssen kannst du mit Hilfe von Dr.Gugl (ich 
finde die Bezeichnung die oben jemand verwendet hat klasse) selbst 
herausfinde.

Grundsätzlich hab ich das jetzt gepostet weil ich denke, dass das auch 
noch anderen helfen kann und Dr. Gugl vielleicht eben auch einen Treffer 
hier findet).

Allerdings hätte das Herr Fischer -der alles perfekt kann- ... perfekt 
selbst herausfinden können !

von Martin F. (martin_f70)


Lesenswert?

Ok ist ja gut...war unter Zeitdruck..tut mir leid...

von Fred (Gast)


Lesenswert?

Mike schrieb:
> Floating Point (deutsch: Fließkomma-)

Gleitkomma!

von Cyblord -. (cyblord)


Lesenswert?

Fred schrieb:
> Mike schrieb:
>> Floating Point (deutsch: Fließkomma-)
>
> Gleitkomma!

Genau, dasselbe wie Side-Effects <-> Nebeneffekte (nicht Seiteneffekte), 
sag ich aber auch oft. Klingt besser.

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.