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?
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?
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.
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.
Martin Fischer schrieb: > Kannst du mir sagen was FP-Support ist? Unterstützung von Operationen mit Floating Point (deutsch: Fließkomma-) Zahlen.
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
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!
Wie kann ich das in avr-gcc aktivieren bei den linker-optionen? ich nutze kein winavr..
Bin gerade in Zeitdruck, kannst du mir nur noch das bitte kurz verraten? Danke
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.
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
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!)
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
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.
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 !
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.
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.
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 !
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.