mir ist grade bei deiner init() eine unstimmigkeit aufgefallen, kannst du SICHER sagen das gesendete bytes auch SO ankommen wie sie sollen ?

Code:
UBRRL = (TAKT / (16UL * BAUD)) -1;

in 

UBRR = (TAKT / (16UL * BAUD)) -1;

ändern , ist schliesslich ein 16bit register und du spricht nur das low-byte an

versuch auch mal alternativ

UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
so wird es im datenblatt EMPFOHLEN

wenn jetzt nix geht, sag mir noch fix welchen prozessor du hast, dann probier ichs selber, prüfe nochmal deine hardware, by the way ... wie sieht DIE eigentlich aus ?