sprintf gibt nur "?" auf LCD aus

Gast #2877394
Lesenswert?

Guten Morgen an die Nachtschwärmer,

ein altbekanntes Thema über sprintf.
Die Forumsuche war die letzen 2h ohne Erfolg, da ich kein AVRStudio 
verwende.

Es soll einfach eine float/ double Variable auf einem LCD ausgegeben 
werden.
Allerdings kommt immer nur ein "?" zum vorschein.
Bei der Nutzung von Integern funktioniert alles wunderbar.

Das System ist ein m32 mit 16Mhz Quarz mit HD44780 LCD.

Folgende Warnungen kommen immer im Outputfenster:
forum.c:27: warning: implicit declaration of function 'sprintf'
forum.c:27: warning: incompatible implicit declaration of built-in 
function 'sprintf'

Hat jemand eine Lösung für WINAVR parat WINAVR-20100110 zur Hand?

Viele Grüße
Angehängte Dateien:
Gast #2877410
Lesenswert?

Klaus Wachtler schrieb:
> Zeig doch mal den aktuellen (kompletten) Quelltext und das Makefile

Ist hier jetzt zusammen mit dem Text aus der "Output" - Box angehangen.


Volker schrieb:
> Ich nehme mal an du benutzt ein Makefile.

Das ist richtig. Ist mir im ersten Post zu dieser Zeit untegegangen.


Genutzte HW:
(jetzt) m644p
16Mhz Quarz
Devboard ist ein EasyAVR 5A

SW:
WINAVR-20100110 mit entsprechendem gcc Compiler mit entsprechendem 
Makefile

Zum flashen wird das hauseigene Flashtool AVRFlash genutzt.
(Hat bisher wunderbare dienste geleistet)

LCD Ansteuerung wurde aus aktuellem Tutorial entnommen.
Angehängte Dateien:
#2877412
Lesenswert?

Es ist übrigens keine gute Idee, eine .c mit #include einzubinden.
Die gehört vielmehr getrennt kompiliert und dann dazu gelinkt.
(Sollte nicht dieses Problem sein, aber trotzdem...)

Abesehen davon ist der Quelltext nicht vollständig, weil die 
lcd-routines.c fehlt...
Gast #2877413
Lesenswert?

gecco schrieb:
> LCD Ansteuerung wurde aus aktuellem Tutorial entnommen.

Diese habe ich aufgrund meiner letzten Zeile weggelassen gehabt.


Klaus Wachtler schrieb:
> und wo ist das #include <stdio.h> ?

Ganz peinlich, habe eine andere Datei gepostet als hier drin ist.
Nochens und dann ab in die Federn...

Danke schonmal für eure aushilfen zu dieser Stunde!
Angehängte Dateien:
#2877425
Lesenswert?

Während du selig schläfst, habe ich noch etwas...

In deinem Makefile steht:
1
PRINTF_LIB = 
2
#PRINTF_LIB = $(PRINTF_LIB_MIN)
3
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)

So sollte es besser gehen:
1
#PRINTF_LIB = 
2
#PRINTF_LIB = $(PRINTF_LIB_MIN)
3
PRINTF_LIB = $(PRINTF_LIB_FLOAT)
#2877427
Lesenswert?

PS: Wenn man auf einem AVR float benutzt, macht man meistens etwas 
falsch.
Mit etwas Nachdenken und Festkommazahlen kommt man in 99.9% der Fälle 
ohne aus, und spart dann enorm Programmspeicher und Rechenzeit.

Dann bräuchte man auch keinen mega644...

Andererseits: Wenn man wirklich Gleitkommazahlen braucht, stellt sich 
die Frage, ob ein AVR die richtige Wahl ist.
Man hat eh nur single precision, was eher mau ist, und selbst daran 
rechnet sich der arme Racker halb tot.

(Natürlich gibt es auch Fälle, wo es ok ist: Man hat genug Zeit zum 
Rechnen, das Programm ist klein genug - wozu soll man Hirnschmalz 
verschwenden, um auf Gleitkommazahlen zu verzichten? Aber wenn du auf 
mega644 umsteigst, wird es einen Grund haben.)
Gast #2877429
Lesenswert?

Anstelle "sprintf" verwendest du lieber die Funktion :
char *   dtostrf (double __val, signed char __width, unsigned char 
__prec, char *__s)
 Sie gehört zwar nicht zum Standard-C ist aber in gcc vorhanden

In deinem Fall:
  dtostrf(test,38,35,Buffer);
        lcd_string(Buffer);

Für weitere Umwsndlungsfragen hilft dir:
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga060c998e77fb5fc0d3168b3ce8771d42
Hans Peter
Gast #2877430
Lesenswert?

gecco schrieb:
> Es soll einfach eine float/ double Variable auf einem LCD ausgegeben
> werden.
> Allerdings kommt immer nur ein "?" zum vorschein.
Mit dem LCD hat dein Problem überhaupt nichts zu tun. Der Fehler 
passiert schon vor der Ausgabe. Guck mal in Buffer[] ;-)
Gast #2877488
Lesenswert?

Klaus Wachtler schrieb:
>Wenn man auf einem AVR float benutzt, macht man meistens etwas
>falsch.
Diese Aussage kann heutzutage auch umgekehrt gelten. Die Preise für HW 
sind so niedrig wie nie zuvor, warum soll ich als Entwickler stundenlang 
rumpopeln um 1kB einzusparen? Wir leben nicht in den 80ern des letzten 
Jahrhunderts. 32Bit gibts für 5 EUR, im Tray für 2 EUR.
#2877551
Lesenswert?

Ich sagte ja, daß es auch Gründe dafür geben darf.

Andererseits braucht man für die meisten Fälle nicht die 32 IO-Pins des 
mega644.
Brauche ich beispielsweise nur wenige Pins, reicht auch auch ein attiny. 
Den gibt es bis herunter mit 6 I/O-Pins, aber mehr als 8 kB Flash 
bekommt man in dieser Größe nicht.
Verschwende ich soviel Flash, daß ich mehr als 8 kB Programm habe, muß 
ich mindestens einen mega168 nehmen in einem PDIP28- oder TQFP32-Gehäuse 
- gegenüber den PDIP8/SOIC8 eines attiny85.

Zudem sind die ebenfalls billigen "größeren" AVR auch keinen Deut 
schneller, und mit Gleitkommazahlen ist die Rechenleistung schnell weg.

Wie gesagt, es gibt sicher Fälle, wo das egal ist. Die sind nach dem 
sekündlich abgefragten T-Sensor aber schnell zuende.

Aber gut, ich lasse mich von 99.9% der interessanten Fälle auf 97% 
herunterhandeln :-)
#2877558
Lesenswert?

Klaus Wachtler schrieb:
> PS: Wenn man auf einem AVR float benutzt, macht man meistens etwas
> falsch.

Nö.
Das ist nur ein Gerücht.

printf nimmt man in der Regel zur Ausgabe an den schnarch langsamen 
Menschen. Und darauf sollte ein guter Programmierer Rücksicht nehmen, 
also eine ergonomische Darstellung nicht schneller als 5 Werte/s. Tot 
rackert sich der AVR daher nicht, sondern langweilt sich.

Und die optimierte Lib ist auch nicht sonderlich groß. float ohne printf 
läuft ab dem ATtiny25 (Lib ~1kB).
Ab ATmega8 sollte man auch das float-printf nicht mehr merken.


Was dagegen richtig ins Kontor schlägt, ist ein Grafik-LCD zu nehmen, 
wenns ein Text-LCD auch tut.
Die Schriften mit putpixel zusammen zu pfriemeln kostet wesentlich mehr 
CPU-Zeit und Flash, als das popelige float.
Grafik würde ich nicht mit einem AVR machen, da sollte ein 32Bit-Bolide 
ran.


Peter
Gast #2878201
Lesenswert?

Klaus Wachtler schrieb:
> Während du selig schläfst, habe ich noch etwas...
>
> In deinem Makefile steht:PRINTF_LIB =
> #PRINTF_LIB = $(PRINTF_LIB_MIN)
> #PRINTF_LIB = $(PRINTF_LIB_FLOAT)
>
> So sollte es besser gehen:#PRINTF_LIB =
> #PRINTF_LIB = $(PRINTF_LIB_MIN)
> PRINTF_LIB = $(PRINTF_LIB_FLOAT)

mit besten dank und zwischen der Pause zur nächsten Vorlesung:
ES FUNKTIONIERT!!!!
Somit ist auch die Warnung von der Outputbox verschwunden.
Klaus du bist der µC Held =)

Klaus Wachtler schrieb:
> Mit etwas Nachdenken und Festkommazahlen kommt man in 99.9% der Fälle
> ohne aus, und spart dann enorm Programmspeicher und Rechenzeit.
>
> Dann bräuchte man auch keinen mega644...

Mag sein, da ich aber nur µC mit DIL 40 Gehäuse hier rumstehen habe, da 
sie mir freundlicherweise von einem Kollegen überlassen wurden, tut dies 
nichts zur Sache ;)
Der Kleinste hier ist ein m16...

Gordon Moore schrieb:
> Wir leben nicht in den 80ern des letzten
> Jahrhunderts. 32Bit gibts für 5 EUR, im Tray für 2 EUR.

So sieht's aus =)

Ein Gast schrieb:
> Mit dem LCD hat dein Problem überhaupt nichts zu tun. Der Fehler
> passiert schon vor der Ausgabe. Guck mal in Buffer[] ;-)

Soweit habe ich mich auch schon reingelesen gehabt =)
Nur das Klaus die richtige Lösung parat hatte.


@ Hans Peter:

Leider sind meine Programmierkenntnisse beschränken sich eher auf if 
else, for, do while und switch case anweisungen.
Bin da noch nicht so lange drin, dass ich sagen kann, was Pointer sind 
und wie ich sie anwende um Menüs aufzubauen. (Stecke derzeit im Tutorial 
von diesem Forum) ;)


Danke euch allen für die 24h Bereitschaft =)
Ein supergeiles Forum hier, weiter so und einen schönen Abend
#2878364
Lesenswert?

gecco schrieb:
> Somit ist auch die Warnung von der Outputbox verschwunden.

Das lag am stdio.h, der Tip war nicht von mir.

gecco schrieb:
> Bin da noch nicht so lange drin, dass ich sagen kann, was Pointer sind
> und wie ich sie anwende um Menüs aufzubauen. (Stecke derzeit im Tutorial
> von diesem Forum) ;)

Um C zu lernen, ist das Tutorial hier nicht geeignet.
Das lernt sich auch viel einfacher am PC...

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