back

printf() für ATmega und Co.

Manchmal möchte man gern gemischte Inhalte aus float, int, oder strg ausgeben. Dafür ist printf() noch immer das Mittel der Wahl. Nur wie bringe ich es dem AVR-Studio bei? Hier eine Kurzanleitung.

  

Beispiele für AVR-Studio 4.19 Build 730, ©Atmel 1996-2011

//#####################################################
//	sprintf
//#####################################################

	// sprintf braucht lib_printf_flt.a und libm.a
	// für float-Konversion. Dazu eintragen in 
	// Project/Configuration/Libraries
	// 		lib_printf_flt.a	// Reihenfolge beachten!
	//		libm.a			// Reihenfolge beachten!
	// dann in Project/Configuration/Custom Options/Linker Options
	// 		-Wl,-u,vfprintf
	// eintragen
	// bei float-Fehler: lib_printf_flt.a einbinden


//#####################################################
//   printf   =  sprintf() + (stdout = &uartstr;)
//#####################################################

in main.c:

#include <stdio.h>	// printf()

static FILE uartstr = FDEV_SETUP_STREAM( uprintc, NULL, _FDEV_SETUP_RW );
	// add in Project/Configuratiuon/Custom/[Linker Options]: -Wl, -u, vfprintf
	// add in main(): stdout = &uartstr;	// uartstr nach stdout umlenken
	// add in uart.c/.h: int uprintc(char ch, FILE *stream) {uputc(ch); return 0;}
	// uputc(ch) lenkt auf gewünschte UART um.
	// falls __mulhi3 fehlt: libgcc.a einbinden (sollte eigentlich vorhanden sein)

int main( void ) {
	stdout = &uartstr;	// für printf: schreibt auf stdout mit FILE-struct
	...
	double pi = 3.141;		// Beispiel
	printf("pi = %f\r\n", pi);	// geht jetzt!
}


Siehe auch www.mikrocontroller.net