Forum: Compiler & IDEs printf auf RS232, was genau fehlt


von CAnfänger (Gast)


Lesenswert?

Hallo allerseits, mein Programm hab ich jetzt fertig geschrieben und ich 
fange jetzt mit dem debuggen auf dem STK600/ATMEGA2560 an.

Bei printf fehlt mir ein Stück vom Puzzle - ich had die (erste) Uart 
initialisiert,

UDR0='b';
// funktioniert, am PC kommt ein "b" an

printf("b");
// funktioniert nicht.


Ich hab im Tutorial nicht genau verstanden, welche Routine(n)? genau ich 
wo einfügen muß, um die Standardausgabe auf die erste UART umzuleiten..?

von Gast (Gast)


Lesenswert?

Was genau verstehst du nicht?
Steht doch alles genau beschrieben -> 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Die_Nutzung_von_printf

von CAnfänger (Gast)


Lesenswert?

Ja, ich hab das auch gelesen und mir jetzt aus anderen 
Programmbeispielen die Vorgehensweise hier zusammengesucht.

Also ich hätte halt zuerst mal vermutet, daß die Standard-Aus und 
Eingabe auf die Uart(für RS232) zeigt, statt ins Nirwana (Oder wohin 
zeigt sie standardmäßig). Wenn das "AVR-GCC" heißt, liegt das doch 
irgendwie nahe bzw. werden doch sicher > 90% der Fälle, die printf 
benutzen, das so umleiten? Dateisystem/Festplatte und Monitor werden 
seltenst vorhanden sein.

Dann lese ich also den ersten Absatz und es kommt ein sprintf innerhalb 
einer Funktion vor, die wiederum im main aufgerufen wird, plus ein 
Hinweis auf eine andere Funktion (uart_puts), wo man nicht erkennt, 
wofür die gut sein soll.

Ich will als Anfänger auch nicht im Tutorial 'rumschreiben, aber als 
konstruktive Kritik: Ich hätte es schöner gefunden als "Kochrezept":

Willst Du printf benutzen, mußt Du

1) Die Standardausgabe umleiten, das geht mit dieser Zeile ...
2) Eine Funktion schreiben, die ein Zeichen an die UART sendet - und 
damit die Standardausgabe diese Funktion auch benutzt muß sie so 
heißen...


Das steht zwar da sinngemäß beschrieben, aber wenn man dann zu der Zeile 
mit FILE und stream kommt, grübelt man schon erstmal..

Und ich hätte das zweite Beispiel (printf und Ausgabeumleitung) zuerst 
genannt.

von Karl H. (kbuchegg)


Lesenswert?

CAnfänger wrote:
> Also ich hätte halt zuerst mal vermutet, daß die Standard-Aus und
> Eingabe auf die Uart(für RS232) zeigt, statt ins Nirwana (Oder wohin
> zeigt sie standardmäßig).

Hätt ich nicht vermutet.
Warum Uart, warum nicht LCD?
Die meisten meiner µC-Anwendungen haben zwar ein LCD aber keine UART

Wie ist das mit der Baudrate, welche soll benutzt werden, wer stellt die 
ein? Willst du nur senden oder auch empfangen? (Grade in einem anderen 
Thread: Der Programmierer will nur senden, weil er den Empfangspin als 
normalen Eingang braucht. Nur blöd, dass ihm BASCOM da keine einfache 
Möglichkeit bietet, die Uart Komponente auf 'Nur Senden' zu stellen.) 
Was ist mit Handshake? Einstellung der Stopbits?

> Dann lese ich also den ersten Absatz und es kommt ein sprintf innerhalb
> einer Funktion vor, die wiederum im main aufgerufen wird, plus ein
> Hinweis auf eine andere Funktion (uart_puts), wo man nicht erkennt,
> wofür die gut sein soll.

DU kannst nicht erkennen, wozu das gut sein soll.
Wenn du das Tutorial von oben durch gemacht hättest und das Kapitel über 
Uart studiert hättest, wär dir die Funktion bekannt vorgekommen.
Wenn du über normale C-Basisgrundlagen verfügen würdest, dann würdest du 
die Funktion puts aus der Standardlibrary kennen und in weniger als 1 
Sekunde auf den Gedanken verfallen, dass uart_puts wohl sowas wie puts 
für die Uart sein wird.

> Das steht zwar da sinngemäß beschrieben, aber wenn man dann zu der Zeile
> mit FILE und stream kommt, grübelt man schon erstmal..

Das Tutorial ist nicht dafür gedacht, absoluten Neueinsteigern in C die 
Grundlagen der Sprache beizubringen (auch wenn es mittlerweile 
phasenweise dahin ergänzt wurde). Das Tutorial setzt ein gewisses 
C-Basiswissen voraus und geht auf die Besonderheiten bei der 
Programmierung von AVRs ein.
Sorry, aber sprintf ist eine Basis-C Funktion, die in jedem Lehrbuch 
über C abgehandelt wird (gleich nachdem über Stringverarbeitung 
referiert wird).

Wenn der Anspruch des Tutorials dahingehend geändert werden würde, 
absoluten Neueinsteigern auch noch die Grundlagen von C beizubringen, 
dann wäre es nämlich 15 mal so lang. Und über die Sinnhaftigkeit braucht 
man dann auch nicht mehr diskutieren. Es ist sinnlos, hier Dinge in ein 
Tutorial zu packen, die dir in einem von 20 verschiedenen Büchern, die 
du um die Ecke in der nächsten Buchhandlung kaufen kannst, wesentlich 
besser erklärt werden können.


Und zu guter letzt:
printf ist in den meisten µC Anwendungen ganz einfach Overkill. Wenn man 
im Speicher genug Platz hat, ist es ok. Aber in den meisten Fällen 
benötigt man genau 2 Funktionalitäten: einen String ausgeben; einen int 
ausgeben. Dafür reichen 2 Funktionen und die eierlegende Wollmilchsau 
printf kann in ihrem Stall bleiben. Ditto für sprintf. Wobei sprintf 
noch den Vorteil hat, dass man dieselbe Funktionalität auch für LCD oder 
sonstige Ausgaben benutzen kann, wenn man das Prinzip 'erst einen String 
generieren, dann entscheiden was mit dem String geschehen soll' erst mal 
verstanden hat. In diesem Sinne ist sprintf also die universellere 
Lösung.

von CAnfänger (Gast)


Lesenswert?

>Warum Uart, warum nicht LCD?

na weil die UART meist im Chip eingebaut ist, LCD nur beim Butterfly. 
Und am häufigsten benutzt wird wohl 9600,8,n,1

>Das Tutorial ist nicht dafür gedacht, absoluten Neueinsteigern in C die
Grundlagen der Sprache beizubringen

Ok, aber ich denke, die Anfänger, die hier ankommen, sind halt neu im 
Fach uC und in C, da ist es schon schön, wenn es etwas pragmatischer 
aufgearbeitet ist und man schneller ein Erfolgserlebnis hat. Debuggen 
mit printf ist häufig so ziemlich das Erste, was man tut, nachdem man 
die LED blinken lassen hat..

Ich bin nicht der Meinung, daß man analytisch alles zur UART und zur 
Standardausgabe in C durchgekaut haben sollte, nur um sich "Hello world" 
am Terminal anzeigen zu lassen. Man kann es auch umgekehrt lernen 
(erstmal empirisch, spielend, ...)

von Karl H. (kbuchegg)


Lesenswert?

CAnfänger wrote:
>>Warum Uart, warum nicht LCD?
>
> na weil die UART meist im Chip eingebaut ist, LCD nur beim Butterfly.
> Und am häufigsten benutzt wird wohl 9600,8,n,1

Du bist noch nicht lange bei den µC, stimmst.
Bei einer UART kann so viel schief gehen, das kannst du dir nicht 
vorstellen. Das geht von falsch beschalteten MAX232 bis hin zu falsch 
konfektionierten Kabeln oder falschen Einstellungen auf PC Seite. Das 
Forum hier ist voll mit Problemen bei der UART Konfiguration.

> Ok, aber ich denke, die Anfänger, die hier ankommen, sind halt neu im
> Fach uC und in C, da ist es schon schön, wenn es etwas pragmatischer
> aufgearbeitet ist und man schneller ein Erfolgserlebnis hat. Debuggen
> mit printf ist häufig so ziemlich das Erste, was man tut, nachdem man
> die LED blinken lassen hat..

Wenn du als Anfänger in der µC Szene auf eine funktionierende UART als 
Debug-Werkzeug setzt, hast du mit Zitronen gehandelt :-)

von Stefan B. (stefan) Benutzerseite


Lesenswert?

CAnfänger wrote:

> Also ich hätte halt zuerst mal vermutet, daß die Standard-Aus und
> Eingabe auf die Uart(für RS232) zeigt, statt ins Nirwana (Oder wohin
> zeigt sie standardmäßig). Wenn das "AVR-GCC" heißt, liegt das doch
> irgendwie nahe bzw. werden doch sicher > 90% der Fälle, die printf
> benutzen, das so umleiten? Dateisystem/Festplatte und Monitor werden
> seltenst vorhanden sein.

Du kannst dir ein Rumpfprogramm machen, bei dem das so ist. Derzeit ist 
die AVR-LIBC so dikumentiert und implementiert, dass stdout nicht per 
Voreinstellung auf irgendwas gerichtet ist. Dadurch ist es u.a. auch 
möglich die Library klein zu halten. Es wird nicht per Voreinstellung 
eine Ausgabefunktion hinzugebunden, die der Anwender später nicht 
braucht. Wenn der Anwender eine Funktion z.B. für UART braucht, stellt 
er die bereit und klinkt die ein.

> Dann lese ich also den ersten Absatz und es kommt ein sprintf innerhalb
> einer Funktion vor, die wiederum im main aufgerufen wird, plus ein
> Hinweis auf eine andere Funktion (uart_puts), wo man nicht erkennt,
> wofür die gut sein soll.

Ich habe den Text behutsam umgeschrieben und hoffe das Vorgehen wird 
klarer.

> Ich will als Anfänger auch nicht im Tutorial 'rumschreiben, aber als
> konstruktive Kritik: Ich hätte es schöner gefunden als "Kochrezept":

Lobenswert!

> Willst Du printf benutzen, mußt Du
>
> 1) Die Standardausgabe umleiten, das geht mit dieser Zeile ...
> 2) Eine Funktion schreiben, die ein Zeichen an die UART sendet - und
> damit die Standardausgabe diese Funktion auch benutzt muß sie so
> heißen...
>
>
> Das steht zwar da sinngemäß beschrieben, aber wenn man dann zu der Zeile
> mit FILE und stream kommt, grübelt man schon erstmal..

Ich habe den Text behutsam umgeschrieben und hoffe das Vorgehen wird 
klarer. ABER: C sollte dem Leser des AVR-GCC-Tutorials bereits 
bekannt sein. Das Konzept der STREAMs ist in C essentiell und sollte den 
Leser hier eigentlich nicht überraschen.

> Und ich hätte das zweite Beispiel (printf und Ausgabeumleitung) zuerst
> genannt.

Aus den Gründen, die Karl heinz Buchegger schon genannt hat, sehe ich 
das anders. OK, man kann das besser strukturieren (s. Tutorial jetzt)

von Stefan B. (stefan) Benutzerseite


Lesenswert?

CAnfänger wrote:

> Ich bin nicht der Meinung, daß man analytisch alles zur UART und zur
> Standardausgabe in C durchgekaut haben sollte, nur um sich "Hello world"
> am Terminal anzeigen zu lassen. Man kann es auch umgekehrt lernen
> (erstmal empirisch, spielend, ...)

Das ist sehr schwer, weil es davon abhängt, wie der Leser lernt.

Ein Typ ("Hörsaal, dann Seminar") will zunächst alles Notwendige wissen 
und dann am Beispiel nachvollziehen. Es ist allerdings schwer diese 
Infos umfassend im Tutorial unterzubringen, weil es oft bedeuten würde, 
Datenblätter abzutippen.

Ein anderer Typ ("Bastler") will zuerst das Beispiel, um dann die 
Erklärungen dazu und bei Gelegenheit zieht er sich vielleicht die 
komplette Beschreibung rein.

Das Tutorial ist ein Mix für diese beiden Extreme. Ich versuche meistens 
im Beispiel so viele Kommentare zu geben, damit der Typ II mit dem 
Beispiel zurecht kommt und neugierig auf den Rest wird. Das kann den Typ 
I nerven.

Du bist eingeladen hier im Forum mitzuarbeiten und Schritt für Schritt 
das Tutorial verständlicher zu machen.

von CAnfänger (Gast)


Lesenswert?

@alle

verschiedene Meinungen gibt es immer.. Ich finde es jetzt besser 
verständlich.

PEACE  :-)

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.