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).
Hi, (void)fdevopen(uart_putchar, NULL, 0); was ist NULL, eine Variable ? Und wofür steht die 0 am Ende? MFG Jörn
> 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.