Forum: Mikrocontroller und Digitale Elektronik sprintf gibt nur "?" auf LCD aus


von gecco (Gast)


Angehängte Dateien:

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

von user (Gast)


Lesenswert?

binde mal die stdio.h ein

#include <stdio.h>

von gecco (Gast)


Lesenswert?

Gesagt getan, leider ohne Erfolg :(

von Volker (Gast)


Lesenswert?


von gecco (Gast)


Lesenswert?

Volker schrieb:
> http://www.mikrocontroller.net/articles/FAQ#Aktivi...


Ich nutze den AVR Studio ja nicht.
Daher ja dieser neue Thread.

von Volker (Gast)


Lesenswert?

Ich nehme mal an du benutzt ein Makefile. Dann musst du halt die printf 
lib für Floatingpoints anstatt der normalen da angeben.

von Klaus W. (mfgkw)


Lesenswert?

gecco schrieb:
> Gesagt getan, leider ohne Erfolg :(

D.h. immer noch mit derselben Meldung?
Zeig doch mal den aktuellen (kompletten) Quelltext und das Makefile 
bitte ...

von gecco (Gast)


Angehängte Dateien:

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.

von Klaus W. (mfgkw)


Lesenswert?

und wo ist das #include <stdio.h> ?

von Klaus W. (mfgkw)


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...

von gecco (Gast)


Angehängte Dateien:

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!

von Klaus W. (mfgkw)


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)

von Klaus W. (mfgkw)


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.)

von Hans Peter B. (Gast)


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

von Ein Gast (Gast)


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[] ;-)

von Gordon Moore (Gast)


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.

von Klaus W. (mfgkw)


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 :-)

von Peter D. (peda)


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

von gecco (Gast)


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

von Klaus W. (mfgkw)


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...

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.