Forum: Compiler & IDEs PrintF + ATmega162


von Jörn (Gast)


Lesenswert?

Hi

Ich möchte die PrintF funktion hier aus dem Forum mit meinem ATmega162
verwenden. Ein paar änderungen habe ich schon vorgenommen, doch im
Terminal erscheint nichts! Mein simples Assemblerprogramm sendet
dagegen fröhlich test auf den bildschirm. Welche änderungen muss ich
vornehmen damit das funktioniert?

von Joerg Wunsch (Gast)


Lesenswert?

Warum nimmst Du nicht das printf(), was bei der avr-libc mit dabei
ist?

von Jörn (Gast)


Lesenswert?

@Joerg Wunsch

Wie, in AVR-GCC ist eine PrintF funktion für die serielle schnittstelle
schon mit drin? Welche datei muss ich mit in mein programm einbinden um
die funktion nutzen?

von Joerg Wunsch (Gast)


Lesenswert?

> Wie, in AVR-GCC ist eine PrintF funktion ...

Jein.  Nicht wirklich in AVR-GCC, aber in avr-libc (ist ja eine
Bibliotheksfunktion), außerdem heißt sie standardgemäß printf().
C unterscheidet Groß- und Kleinschreibung...

> für die serielle
> schnittstelle schon mit drin?

Nein.  Sie ist allgemein gehalten, Du mußt ihr dann schon sagen, daß
Du die (welche? :-) serielle Schnittstelle benutzen willst.  Das
machst Du mit fdevopen().  Sie ist allgemein, damit man sie auch für
ein LCD-Display oder für die USART1 oder für eine völlig andere
Schnittstelle benutzen kann.

> Welche datei muss ich mit in mein
> programm einbinden um die funktion nutzen?

RTFDoc.

http://savannah.nongnu.org/download/avr-libc/doc/avr-libc-user-manual/group__avr__stdio.html

Ein (simples) Beispiel für eine Ausgabefunktion für 'ne Standard-UART
ist in der Doku sogar drin.

von Jörn (Gast)


Lesenswert?

Hi,
Also so langsam versteh ich das... Aber wo muss dann die putchar
routine hin????? Irgendwo in fdevopen() rein oder? Hast du vielleicht
ein simples beispielprogramm?

MFG Jörn

von Joerg Wunsch (Gast)


Lesenswert?

> Aber wo muss dann die putchar routine hin? Irgendwo in fdevopen()
> rein oder?

Ja, sicher.  Sie darf übrigens nicht putchar() heißen, dieser Name
ist durch den C-Standard reserviert.  Wenn Du uart_putchar() nimmst
(so wie im Beispiel), dann genügt es,

(void)fdevopen(uart_putchar, NULL, 0);

aufzurufen.  Den Rückkehrwert kannst Du im einfachsten Fall
ignorieren, da der erste Aufruf von fdevopen() zugleich den
Standard-Descriptor stdout mit setzt, der von printf() ja benutzt wird
(während fprintf() den Descriptor explizit mit übergeben bekommen
will).

von Jörn (Gast)


Lesenswert?

Hi,

(void)fdevopen(uart_putchar, NULL, 0);

was ist NULL, eine Variable ? Und wofür steht die 0 am Ende?

MFG Jörn

von Joerg Wunsch (Gast)


Lesenswert?

> was ist NULL, eine Variable ?

Umm, diese Frage haut mich aber jetzt um.

Wo hast Du C gelernt?  Wenn Du printf() benutzen willst, gehe ich
davon aus, daß Du stdio als solches (in Standard-C, also nicht
microcontroller-spezfisch) kennst.  NULL ist die symbolische Konstante
für einen Null-Zeiger.  Physisch ist sie meist »0« oder »((void *)0)«,
aber das ist irrelevant.

> Und wofür steht die 0 am Ende?

Hast Du denn wenigstens mal ins Manual geguckt?

Wahrscheinlich nicht, sonst bräuchtest Du nicht fragen:

> The third parameter opts is currently unused, but reserved for
> future extensions.

von Jörn (Gast)


Lesenswert?

Hi,

Sorry, aber so ganz bilck ich bei der AVRlibc halt nicht durch, davon
mal abgesehen fang ich gerade mit c an und brauch halt printf um
"ergebnisse" meiner programme am pc sichtbar zu machen.

Also kann ich für "NULL" auch einfach 0 schreiben. Hab ich schon
probiert dann bekomme ich auch nicht mehr den fehler nicht deklarirt
oder so. Hab das prog auch schon getestet, nur komischerweise wird mein
"Hallo" nicht gesendet, stattdessen sendet das programm so ziemlich
den ganzen zeichensatz.

Wenn ich die UART initialisiere führe ich einmal fdevopen(uart_putchar,
0, 0); aus, ist das richtig? So danach soll er dann "Hallo" senden
was ich so mache: printf('Hallo', 0);
Nur funzt das halt nicht.

PS: Danke für deine superschnellen Antworten

MFG Jörn

von Joerg Wunsch (Gast)


Lesenswert?

> Sorry, aber so ganz bilck ich bei der AVRlibc halt nicht durch,
> davon mal abgesehen fang ich gerade mit c an und brauch halt printf
> um "ergebnisse" meiner programme am pc sichtbar zu machen.

Das ist keine rechte Entschuldigung dafür, daß Du die
Programmiersprache, die Du hier zu benutzen versuchst, gar nicht erst
gelernt hast.

C lernt sich nicht besonders toll auf einem Microcontroller.  Lern'
es
erstmal auf einem PC.

> Also kann ich für "NULL" auch einfach 0 schreiben. Hab ich schon
> probiert dann bekomme ich auch nicht mehr den fehler nicht deklarirt
> oder so.

Wenn Du den bekommen hast, hast Du

#include <stdio.h>

vergessen.  Schon wieder fehlendes C-Basiswissen. :(

> printf('Hallo', 0);

Das hat Dir der Compiler abgenommen?

Ich bekomme für sowas eine Warnung:

warning: passing arg 1 of `printf' makes pointer from integer without
a cast

Wiederum C-Basiswissen:

printf("Hallo");

Apostrophe (ASCII 0x27) begrenzen Zeichenkonstanten (und dies sind per
definitionem Integer-Zahlen), doppelte Anführungszeichen (ASCII 0x22)
begrenzen Zeichen/ketten/konstanten, das wiederum sind technisch
gesehen Arrays (die an eine Funktion immer als Zeiger übergeben
werden).

Bitte: lern C.  Wenn es eilig ist, besorg Dir einen Crashkurs irgendwo
im Internet.  Lern' es bitte nicht auf dem Controller, der rennt
einfach ins Nirvana, wenn was nicht klappt, während ein `hosted
environment' Dir irgendwelche Hinweise auf den Fehler bringen kann.
Den GCC gibt's sowohl für Unix als auch für Windows kostenlos, da
hast
Du praktisch dieselbe Umgebung, aber halt nicht für den Controller,
sondern für Deinen Host-Computer.

von Jörn (Gast)


Lesenswert?

Hi,

Super!! jetzt funktioniert es!! Ohne deine Hilfe hätte ich das nie
geschafft!! Ich werd mir dann mal das GCC für Windoof runterladen und
damit ein bisschen rumprobieren.

Nur noch eine frage: Kann ich auch Variablem mit printf ausgeben oder
nur text? Wenn ja wie ??

THX

MFG Jörn

von Jörn (Gast)


Lesenswert?

Hi,

Also das mit der Vriable ausgeben läuft nun auch, ich habe mir mal ein
bischen C Grundwissen angeeignet
(http://www.ipsi.fhg.de/%7Ethiemert/Private_Homepage/index2.htm).

MFG Jörn

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.