Die printf-Funktion spricht in C nicht automatisch die UART-Schnittstelle an.
Du kannst aber wohl mit fdevopen() definieren, dass printf auf die UART schreibt. Die Funktion, die ein Zeichen an die UART ausgibt, musst Du aber dann noch selber implementieren.

Hier mal ein bißchen Code wie's eventuell funktionieren könnte. Ich hab's allerdings selber noch nicht ausprobiert.

Code:
int uart_putchar(char c)
{

  if (c == '\n')
    uart_putchar('\r');
  loop_until_bit_is_set(UCSRA, UDRE);
  UDR = c;
  return 0;
}

int main(void)
{
ioinit(); //Schnittstelle initialisieren
fdevopen(uart_putchar, NULL, 0);
printf ("Hello World");
return 0;
}
Gruß,
askazo