mikrocontroller.net

Forum: Compiler & IDEs PrintF + ATmega162


Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Joerg Wunsch (Gast)
Datum:

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

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/a...

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

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

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

MFG Jörn

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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_Homepag...).

MFG Jörn

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.