Forum: Mikrocontroller und Digitale Elektronik Codevision Printf auf UART2 legen


von Mark (Gast)


Lesenswert?

Hallo Forum,

ich suche nun schon seit einiger Zeit eine Lösung wie ich bei Codevision 
den Uart für Printf umlegen kann.. (Atmega128)

Kann mir da jemand weiterhelfen ?


Danke!
lg

von Hei (Gast)


Lesenswert?

Irgendwann sollte man sich von solchen eierfressenden Wollmilchsaeuen 
loesen. Ueberleg dir was du uebertragen haben willst und uebertrag genau 
das und keine formatierten Strings.

von Seano L. (Gast)


Lesenswert?

Muss es unbedingt printf sein? Je nach Implementierung ist das viel zu 
speicherhungrig und langsam, ich würde das nur verwenden wenn eigene 
komplexe Formatierungsroutinen zu aufwendig wären, im Normalfall macht 
man das 'von Hand' und kommt ohne printf aus.
Was machst du denn mit printf genau?

von Mark (Gast)


Lesenswert?

Hallo,

ich möchte mehrere Float und Int ausgeben. Speicher ist egal da der MCU 
eh viel zu viel hat..


lg

von Karl H. (kbuchegg)


Lesenswert?

Mark schrieb:
> Hallo,
>
> ich möchte mehrere Float und Int ausgeben. Speicher ist egal da der MCU
> eh viel zu viel hat..

Ja.
Und was hindert dich jetzt daran?

Letzten Endes musst du die UART Anbindung ja sowieso selber machen.
D.h. du hast eine Funktion, die einen String auf der UART 2 ausgeben 
kann.

Ob du die jetzt an printf hängst, oder ob du die Ausgabe mittels itoa 
oder ftoa zusammensetzt, ist Jacke wie Hose. Einziger Unterschied: du 
sparst dir den ganzen Unterbau, den printf benötigt bzw. das darunter 
liegende I/O system (ok, das ist auf einem AVR nicht die Welt).

Aber wenns unbedingt sein muss, kann man ja auch spritnf benutzen
1
   char buffer[40];
2
3
   sprintf( buffer, ".....", argumente );
4
   uart_writeString( buffer );

sprintf funktioniert wie printf. Also mit Format String und allem drum 
und drann. Nur dass es auf keinem Gerät ausgibt, sondern das Endprodukt 
als String in einen char Buffer schiebt. Mit diesem String kannst du 
dann machen was du willst. Zb auf einer UART ausgeben. Oder auf einem 
LCD. Oder per Infrarot LED zum Jupiter morsen. Oder ...

printf bzw. sprintf sind sehr mächtige Funktionen. Wenn du also nicht 
spezielle Formatierwünsche hast, dann lohnt sich das kaum. Dann fährt 
man mit itoa, ltoa, ftoa und Zusammensetzen der Einzelteile besser. Da 
schreibt man sich dann eben einmalig eine Funktion, die aus den 
interessierenden Werten die Ausgabe zusammensetzt und an die UART 
ausgibt, und gut ists.


Edit:
Mein Bauchgefühl sagt mir allerdings, dass es an den UART Funktionen 
krankt und du hoffst, dass man da eine Funktion aufruft oder so, und 
irgendwie funktioniert das dann so, dass printf auf der UART ausgibt.
Tja. Wenn das so ist, dann hast du mit Zitronen gehandelt. Ich hab zwar 
keine Ahnung, ob Codevision sowas wie fertige-UART Funktionen seinem 
Compiler beilegt, besser ist es aber wenn man versteht was man da tut. 
Denn spätestens bei der Fehlersuche (und die wird kommen) rächt sich 
Nichtwissen.

: Bearbeitet durch User
von Ste N. (steno)


Lesenswert?

Nach kurzer Suche in der Doku gefunden, versuch es mal damit:


For the ATxmega chips the getchar and putchar functions use by default 
the USARTC0.
If you wish to use another USART, you must define the ATXMEGA_USART 
preprocessor macro prior to #include the stdio.h header file, like in 
the example below:
1
/* use the ATxmega128A1 USARTD0 for getchar and putchar functions */
2
#define _ATXMEGA_USART_ USARTD0
3
4
/* use the Standard C I/O functions */
5
#include <stdio.h>

The ATXMEGA_USART macro needs to be defined only once in the whole 
program, as the compiler will treat it like it is globally defined.


Eventuell gibt es sowas auch für
1
_ATMEGA_USART_


Ansonsten wieder laut Doku:

If you intend to use other peripherals for Input/Output, you must modify 
accordingly the getchar and putchar functions like in the example below:

1
#include <stdio.h>
2
3
4
/* inform the compiler that an alternate version
5
   of the getchar function will be used */
6
#define _ALTERNATE_GETCHAR_
7
8
9
/* now define the new getchar function */
10
char getchar(void) {
11
/* write your code here */
12
13
14
}
15
16
17
/* inform the compiler that an alternate version
18
   of the putchar function will be used */
19
#define _ALTERNATE_PUTCHAR_
20
21
22
/* now define the new putchar function */
23
void putchar(char c) {
24
/* write your code here */
25
26
27
}

Mann kann davon ausgehen, das printf() zur Zeichenausgabe putchar() 
aufruft. Dann müßte es etwa so gehen.
1
#define _ALTERNATE_PUTCHAR_
2
3
/* now define the new putchar function */
4
void putchar(char c)
5
{
6
  // putchar1 (c);  // Ausgabe auf UART1 umleiten
7
  putchar2 (c);  // Ausgabe auf UART2 umleiten
8
}

: Bearbeitet durch User
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.