Hallo, habe folgendes Problem: Die Ausgabe von Int-Werten aufs LCD funktioniert einwandfrei mit der sprintf() Funktion. Nun möchte ich einen Float Wert ausgeben. char buffer[10]; //Ein Beispiel double wert = 1.234; sprintf(buffer,"%f",wert); lcd_writetext(buffer); //Ausgabe aufs LCD Was hab ich hier falsch gemacht, bzw. vergessen?! Ich krieg auf dem Display ein Fragezeichen?! Danke
Du linkst nicht mit der printf()-Library mit floatingpoint-Unterstützung.
Es gibt verschiedene Varianten der printf-Library, die sich in der Größe unterscheiden. Die mit floatingpoint-Unterstützung ist die größte. Für Anwendungen, die keine floatingpoint-Ausgabe benötigen, gibt es daher auch eine printf-Library ohne floatingpoint-Unterstützung. Und mit genau der linkst Du Deinen Code.
Wie baust du denn dein Makefile zusammen? Normalerweise existieren dort bereits Vorkehrungen, um die printf- und scanf-Bibliotheken auszuwählen.
Hallo, danke für die Hinweise, habe aber leider keine Ahnung um was es genau geht, bin Anfänger auf C. Habt ihr vielleicht konkrete Vorschläge, wie ich im Code vorgehen sollte? Die Problemstellung kennt ihr ja bereits. Also wie gesagt, die Anzeige von Int werten geht ohne Probleme mit #include <stdio.h> ...; sprintf(buffer,"%d",wert); ...;
Es liegt nicht am Code, sondern an den Linkereinstellungen bzw. Libraryangaben im Makefile. Das haben Jörg und auch ich versucht Dir zu erklären.
Ok, habe verstanden. Und wie ändere ich das jetzt ab :S Sorry, stehe auf der Leitung
Vielleicht hilft das Makefile ######################################################################## ####### # Makefile for the project lcd_8 ######################################################################## ####### ## General Flags PROJECT = lcd_8 MCU = atmega128 TARGET = lcd_8.elf CC = avr-gcc.exe ## Options common to compile, link and assembly rules COMMON = -mmcu=$(MCU) ## Compile options common for all C compilation units. CFLAGS = $(COMMON) CFLAGS += -Wall -gdwarf-2 -O0 CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d ## Assembly specific flags ASMFLAGS = $(COMMON) ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2 ## Linker flags LDFLAGS = $(COMMON) LDFLAGS += ## Intel Hex file production flags HEX_FLASH_FLAGS = -R .eeprom HEX_EEPROM_FLAGS = -j .eeprom HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load" HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0 ## Objects that must be built in order to link OBJECTS = lcd.o ## Objects explicitly added by the user LINKONLYOBJECTS = ## Build all: $(TARGET) lcd_8.hex lcd_8.eep## Compile lcd.o: ../lcd.c $(CC) $(INCLUDES) $(CFLAGS) -c $< ##Link $(TARGET): $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET) %.hex: $(TARGET) avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $@ %.eep: $(TARGET) avr-objcopy $(HEX_EEPROM_FLAGS) -O ihex $< $@ %.lss: $(TARGET) avr-objdump -h -S $< > $@ ## Clean target .PHONY: clean clean: -rm -rf $(OBJECTS) lcd_8.elf dep/* lcd_8.hex lcd_8.eep ## Other dependencies -include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)
Bau dir'n neues Makefile mit Mfile. Da hast du dafür einen Menüpunkt. Ansonsten müsste es gehen, indem du LIBS= -Wl,-u,vfprintf -lprintf_flt -lm irgendwo im Makefile einfügst.
Hm, habs probiert, funzt aber noch nicht. Hab jetzt in den Optionen folgendes gefunden: "Link with these Objects" Da hab ich libprintf_flt.a hinzugefügt! war das ein richtiger weg? Funktioniert aber immer noch nicht
Nochmals ich. hab jetzt geschafft mit dem externen eigenen makefile, wo ich die zeile eingefügt habe. Build started 1.3.2006 at 17:57:19 avr-gcc.exe -mmcu=atmega8 -Wall -gdwarf-2 -O0 -MD -MP -MT lcd.o -MF dep/lcd.o.d -c ../lcd.c ../lcd.c:5: warning: return type of 'main' is not `int' ../lcd.c: In function `main': ../lcd.c:25: warning: unused variable `y' avr-gcc.exe -mmcu=atmega8 lcd.o -Wl,-u,vfprintf -lprintf_flt -lm -o lcd_9.elf avr-objcopy -O ihex -R .eeprom lcd_9.elf lcd_9.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex lcd_9.elf lcd_9.eep Build succeeded with 2 Warnings... Geht aber immer noch nicht
SO, sorry habe das "s" vor printf vergessen. Jetzt funktionierts.. vielen dank
> habs probiert, Was denn? Sicher nicht Mfile. > Hab jetzt in den Optionen folgendes gefunden: > "Link with these Objects" Dort gibt's nämlich sowas nicht. Dafür einen Menüpunkt Makefile -> printf() options... > Da hab ich libprintf_flt.a hinzugefügt! > war das ein richtiger weg? Nein, das ist kein Objektmodul, sondern eine Bibliothek. Diese Bibliothek besitzt aber nur eine Implementierung für vfprintf(). Diese Funktion musst du zusätzlich mittels -uvfprintf noch dem Linker als Anforderung mitgeben, andernfalls wird aus dieser Bibliothek nichts gelinkt. Gelinkt würde stattdessen das vfprintf() aus der Standardbibliothek, nachdem es über die Auflösung von sprintf() aus der Standardbibliothek anschließend plötzlich als undefined reference auftaucht. Zu diesem Zeitpunkt ist die Verarbeitung von libprintf_flt.a aber bereits abgeschlossen und vergesen.
// get converted value double x = ADCW/1023.*5.; char buffer[5]; sprintf(buffer,"%.3f",x);einstellen lcd_gotopos(2,6); lcd_writetext(buffer); Egal, ich hab meine Programmierung jetzt so und hab die Zeile... LIBS= -Wl,-u,vfprintf -lprintf_flt -lm ...ins Makefile dazugegeben und es funktioniert einwandfrei. Danke Jörg
komisch, in meinem Programm (atmega16) habe ich "sprintf" benutzt, im Makefile keine Lib eingebunden und funktioniert trotzdem. # Additional libraries # # Minimalistic printf version #LDFLAGS += -Wl,-u,vfprintf -lprintf_min # # Floating point printf version (requires -lm below) #LDFLAGS += -Wl,-u,vfprintf -lprintf_flt # # -lm = math library LDFLAGS += -lm Gruß Ralf
Ja klar funktioniert sprintf auch so, nur eben nicht die Gleitkomma-Formate.
sprintf().... dieser oder ähnliche befehle sprengen den avrspeicher. sind sehr sehr aufgebläht. am besten ist wenn man die routinen selber strickt, die sind dann um ein etliches kleiner
Hallo, also ich finde sprintf() sehr fein. Habe jetzt mit sehr wenig Aufwand eine Dezimalzahl mit Nachkommastellen auf meinem Display. ....................................................... Ein paar Verständnisfragen hätte ich da aber noch. 1. Was hat das mit dem AVR Speicher zu tun am PC, bevor ich das HEX file hinüber lade? 2. Liegt das daran, dass AVR Studio den ATmega8 simuliert und somit nicht mehr Speicher hergibt? 3. Wieso funktioniert der Befehl sprintf() aber trotzdem sehr schön, indem man nur das makefile ändert (libs)? Vielen Dank Stögi
> dieser oder ähnliche befehle sprengen den avrspeicher.
Verallgemeinerungen sind immer richtig.
Erstens ist printf() eine recht komplexe Funktion (die folglich auch sehr viel Code mit sich in den ROM schleppt).... aus diesem fachforum und von dir noch unterstützt. wenn du den code anschauen tust, weisst du wie umständlich diese anweisung in c geschrieben wird. und die spr... ist noch complexer als die pr...
"und die spr... ist noch complexer als die pr..." Wieso das denn?
> Wieso das denn?
Weil er den Code vielleicht doch nicht angeguckt hat? Sonst wüsste
er, dass alles da drin in vfprintf() passiert und alles andere nur
Wrapper darum sind. Daher muss man auch mit -uvfprintf eine
undefinierte Referenz zu dieser Funktion erzwingen, denn nur diese
befindet sich in libprintf_flt.a, alle Wrapper wie printf() oder
sprintf() fehlen da drin.
Meine Bemerkung bezog sich nur auf die Unzulässigkeit einer
Verallgemeinerung: in einem ATtiny2313 will ich auch kein printf
haben, in einem ATmega8 kommt's drauf an (wenn der Platz dafür noch
frei ist, kann sich's damit einfacher debuggen lassen), auf einem
ATmega1281 interessiert's kein Schwein mehr wirklich, wieviel Platz
das braucht. Da kann dann einfach keine Rede mehr sein von ,,sprengen
den avrspeicher''.
Tja, vielen Dank, hat mir doch um einiges weitergeholfen :)
ha...ha...ha.... ihr legt euch die eigene aussage so zurecht, so wie ihr sie braucht. von dieser seite kann es aber nicht so sehen. verstanden hat das der stoeger aber immer noch nicht und geholfen erst recht nicht.
Das klingt wie der Ruf nach der Heise-Makrele. Dabei ist doch erst Donnerstag ... Oder könntest Du versuchen, Deine Aussage mit irgendwelcher Substanz zu belegen?
Ach, pebisoft will uns nur mal wieder die Steilvorlage fürs Wochenende geben.
Hallo, also ich muss sagen, der Beitrag von Karlheinz war nicht gerade mit Niveau... Naja egal. Auf jeden Fall, Hab ich vorher nicht so viel gewusst, wie jetzt, nachem meine Frage beantwortet wurde. Immerhin ist das Ergebnis da, nach dem ich suchte. Vielen Dank, ihr könnt ja weiter Diskutieren ;)
schaut euch mal das marktforum an....da könnt ihr menschen kennenlernen aus eurem fach (studiert), die sich haben übers ohr hauen lassen mit sogenannte schnäppchen. ich glaube so etwas spricht für sich. ich dachte erst das man nur noch die ossis bescheissen kann, aber ihr habt es auch anscheinend noch nicht gelernt, bzw die weisheit nicht mit dem löffel gegessen. schaut euch ruhig einmal die namen an. es sind namen von leuten hier aus dem forum,die den kopf immer stolz angehoben haben...und nun diese blamage..he..he..es ist nicht immer gold was glänzt und hier angeblich fachwissen von sich gibt. wenn man im glashaus sitzt..he..he..
Da hat Jörg wohl voll ins Schwarze getroffen. Ich hatte diese vermutung auch schon seit längerem...
"Forum - Sonstiges / Offtopic" schaut euch mal dieses forum an. den untertitel "karrikaturen" und andere. ich habe den eindruck, das ein ganz grosser teil eine volksverhetzung nebenbei betreibt. da tummeln sich naziparolen und ausländerfeindlichkeit, ich wusste nicht das ihr zu dieser richtung gehört. ich kann den betreiber der seiten nur raten, eine bessere aufsicht und reinigung der seiten durchzuführen. ich glaube das es von einer anzeige wegen volksverhetzung und ausländerbeleidigung nicht mehr weit enfernt ist. ein tipp: die obengenannten seiten mal zu filzen. aber schawchköpfe lassen sich leicht steuern. auch tauchen wieder einige namen von euch auf. eine meldung dieser unmisslichkeiten ist bald unumgänglich. es ist für mich als deutscher peinlich, wenn ich beim ausländertreffen darauf hingewiesen werde.
Was hat das ganze mit der Benutzung verschiedener printf-Derivate zu tun? Nichts. Ist irgendein Zusammenhang zur von "karlheinz" aufgestellten Behauptung, daß sprintf deutlich mehr Code benötigen würde als printf, zu erkennen? Oder gar eine Art Versuch, diese Behauptung zu erläutern? Die Indiskutabilität einiger Beiträge im OT-Forum muss hier nicht angesprochen werden, aber sie steht auch in keinerlei Zusammenhang mit der fachlichen Qualifikation von Patrick, Jörg oder auch mir. Vorschlag zur Güte: Lerne denken. Lerne lesen. Lerne C. Oder gehe woanders hin.
gerade muss dieses auch hier angesprochen werden. ich weiss nicht ob du auch zu dieser gruppe gehören tust, du nimmst diese hetzparolen gerade im schutz. die fachliche qualifikation spreche ich patrick, jörg und dir ab. null ahnung habt ihr, nur ein restgeschafele befindet sich in euer hirn, was sich noch vom studium festgesetzt hat. ansonsten seit ihr nicht in der lage, euch auf neue situation und neue fragesteller einzustellen. ihr seit wandelde wracks, die aber auch keiner belastung standhalten, sondern sich nur mit dummen fachgeschwafel über wasser halten. ihr seit nicht in der lage, alleine ein kilo salz zu kaufen, soweit steht ihr abseits vom wirklichen leben. ich brauch nur einmal eure forumzeiten hier durchzugehen, dann weiss man , ihr steht alleine und einsam in der welt und schwätzt nur dumm herum. der eine oder andere von euch hat vielleicht ein pipijob, aber zur leistung seit ihr nicht geboren.
So, nachdem unser kleiner Troll Karlheinz seinen Spaß hatte, möchte ich gern auf das ursprüngliche Thema zurückkommen. Ich habe das selbe Problem wie Daniel am Anfang, nämlich ein Fragezeichen im Output statt einer Fließkommazahl. Im Makefile hab ich brav LIBS = -Wl,-u,vprintf -lprintf_flt -lm eingetragen. Allerdings gibt es bei LDFLAGS nochmal -Wl. Ist das ein Problem? Hab auch schon versucht alles in LDFLAGS reinzuschreiben, hat auch nichts geändert... Es geht um printf(), nicht sprintf(), aber das sollte im Prinzip doch das gleiche sein, oder?
Ja, es ist das gleiche. Schreib mal die Kommandozeile auf, die "make" produziert, wenn es den ganzen Job linken will. Vielleicht hättest du ja auch besser 'nen neuen Thread angefangen statt diese olle Kammelle wieder aufzuwärmen. ;-) Ist jetzt zu spät.
Sieh mal hier nach http://www.mikrocontroller.net/articles/FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio
Werner, meinst du wirklich, der OP liest das nach über einem Jahr noch?
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.