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