Dein Problem liegt hier:
Code:
SIGNAL( SIG_USART_RECV )
{
   uint8_t data;
   data = UDR;
   
   /* echo */
   USART_transmit(data);

}
Du versuchst aus einer INT routine heraus USART_transmit aufzurufen. Diese Funktion wartet auf einen INT bis Platz ist ein Zeichen zu senden. Aber die INTs sind dekativiert wenn du in der Routine bist. Also wartet es ewig.
Die Loesung waere USART_transmit im normalen Programm aufzurufen.