Forum: Mikrocontroller und Digitale Elektronik formatierte Ausgabe mit PIC auf einen LCD


von Josef M. (youssefcool)


Lesenswert?

Hallo,
ich möchte eine formatierte Ausgabe mit einen PIC µC auf einen LCD 
anzeigen. also genauso wie auf der AVR-GCC-Tutorial "Die Nutzung von 
sprintf und printf" 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Die_Nutzung_von_sprintf_und_printf.

die sprintf() hat super funktioniert. ich muss aber genau die printf() 
verwenden. bei der wurde die FDEV_SETUP_STREAM() aus der avr-libc 
Bibliothek benutzt, die ich leider bei mir nicht umsetzen könnte.
wie kann ich die printf() mit dem PIC µC benutzen?

kann mir Jemand helfen bitte?

Mit freundlichen Grüßen
Josef M.

von Karl H. (kbuchegg)


Lesenswert?

Josef M. schrieb:

> die sprintf() hat super funktioniert. ich muss aber genau die printf()
> verwenden.

Warum musst du?

Was du brauchst ist im einfachsten Fall eine Funktion, die einen String 
auf dein LCD ausgeben kann. Das kann printf sein, muss es aber nicht.

> wie kann ich die printf() mit dem PIC µC benutzen?

Da musst du in die Doku deines Compilers schauen, wie man die 
Runtime-Library davon überzeugt, auf ein bestimmtes Gerät auszugeben. 
Standard-C hat dazu nichts zu sagen.
Wenn die Runtime-Library nicht schon auf deine Hardware angepasst ist, 
wirst du einen 'Treiber' schreiben müssen, der ein einzelnes Zeichen 
ausgeben kann (meistens reicht das schon). Wie dieser Treiber konkret 
aussieht und wie der in die Runtime eingebunden wird, so dass er von 
printf benutzt werden kann, ist komplett von deiner Hardware bzw von 
deinem Compilersystem abhängig.

von Josef M. (youssefcool)


Lesenswert?

Hallo Karl,
vielen Dank für deine schnelle Antwort.
ich programmiere einen PIC24F Mikrocontroller und verwende das MPLAB 
v8.60 compiler. ich habe schon lange nach einer Lösung umgeblätert bevor 
ich der Beitrag im Forum eingetragen habe. leider nichts gefunden.

>> die sprintf() hat super funktioniert. ich muss aber genau die printf()
>> verwenden.
>
> Warum musst du?
wenn es mit dem printf() nicht funktionieren kann oder kompliziert zu 
lösen ist dann verwende ich einfach die sprintf().

von W.S. (Gast)


Lesenswert?

Josef M. schrieb:
> wenn es mit dem printf() nicht funktionieren kann...

Mein lieber Josef,

wenn ich deine Beiträge hier lese, wird mir sehr melancholisch zumute. 
Warum können die jungen Leute heutzutage es nicht fertig bringen, sich 
auf das einzustellen, was sie zu beackern versuchen? Selbst für die 
Programmierung auf dem PC finde ich solche Funktionen wie printf() und 
Konsorten nicht gut, setzen sie doch für jede kleine Ausgabe einen in 
der Laufzeitlib eingebauten Textinterpreter voraus, der den Formatstring 
interpretiert. Und das, obwohl der Programmierer schon vor dem 
Hinschreiben des Formatstrings gewußt hat, was er denn eigentlich für 
eine Konversion beabsichtigt. Da sind mir beispielsweise die Funktionen 
IntToStr und IntToHex aus der Windowswelt viel lieber, weil einfach 
direkter, schneller, geradliniger. Und nun versuchst du auf einem 
kleinen Mikrocontroller genau den selben aufgeblähten Code zu benutzen, 
der eigentlich schon am PC nicht die allerbeste Wahl ist. Ich hab mir 
für andere (32 Bit) uC's meine eigene Konvertier-Lib zusammengestellt, 
wo ich sowas wie IntToStr und Dezi_OUT, FloatToStr und Float_Out, 
HexByte_Out bis HexLong_Out und so weiter als einzelne Funktionen drin 
habe. Da hat dann auch noch den Vorteil, daß der Linker (wenn er schlau 
genug ist) die nicht benötigten Teile einfach weglassen kann. Bei printf 
geht das nicht, wei der Linker niemals alle eventuell auftretenden 
Formatstrings erfassen und analysieren kann. Naja und für PIC's 
(allerdings die 16Fxxx) hab ich meine Gleitkommalib nebst I/O in 
Assembler.

Also: laß lieber alle solchen SUPERTOLLEN Funktionen wie printf und 
scanf aus den PC-Gefilden besser weg und schreib dir einen Grundstock an 
Konvertierungsroutinen, die einfach besser zu einem uC passen. Du wirst 
dir selber eines Tages dafür dankbar sein.

W.S.

von Peter D. (peda)


Lesenswert?

@W.S.

Es hat sich seit den 1980-ern bei den MCs etwas getan.
Sie sind in der Regel leistungsstark genug, um für den langsamen 
Menschen ein paar popelige printf auszuführen.
Auch sind die C-Compiler entsprechend optimiert. Ich hab selbst mal auf 
nem AT89C2051 aus "Faulheit" float verwendet (belegt etwa 1kB Flash).

Wenn es also keine konkreten Gründe gibt, auf float oder printf zu 
verzichten, muß man es auch nicht.


Peter

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.