AVR-C double gibt auf LCd nur aus

Gast #3546820
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.
Gast #3546850
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!
Gast #3546878
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.
#3546950
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.
#3546985
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 !
#3547574
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 !

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren