Testen kann ich es leider nicht da ich keinen Atmega8515 habe. Ich habe Atmega 88, 1280, einen Atmega8 bzw Attiny 44, 45 und 2313.

Bei deiner UART.h sind Berechnungen eingebaut. Normalerweise macht man das nicht. In die UART.h würde man nur Definitionen einbauen (schau einmal die Headerdateien an die bei AVR Studio dabei sind). Programmcode kommt in eine C-Datei. Das hat aber nichts mit der Funktion zu tun. Man macht es nur nicht.

Habe den Code durchgeschaut. Beim Hauptprogramm steht in "void uart_init (void)" in der ersten Zeile " uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU/(16*BAUDRATE) - 1);". Was soll das bedeuten? Das wird zu keinem Ergebnis führen. Besser ist es wenn man die Berechnung per Hand ausrechnet und diese als Variable hinschreibt.

Damit man den Code besser lesen kann sollte man nicht z.B. "UCSRA |= 2;" schreiben sondern "UCSRA |= (1<<U2X);". So sieht man auf einen Blick was man gesetzt und was man nicht gesetzt hat.
UCSRC passt?

Probier einmal die von mir gepostete Zeile zu ändern. Ansonsten müsste ich weiter schauen.

MfG Hannes