Uart serial communication failing to echo back Atmega16a
Firstly, that code won't compile. The last portion of it (the ISR) looks corrupt - you might want to re-post that bit.

Secondly, it's not surprising that if you type "FOO" it doesn't respond, since the code is waiting for you to press "a" at which point it would respond with "[a][a][a][a][a][a]...." until you press something else.

Thirdly, you should learn to format your code properly, or at least use one of the good auto-formatters, like Artistic Style.

Unfortunately I don't have an ATMega16A here to test your code with, and I am not up on Atmel interrupts, so all I can do is suggest some things to try:


Make sure your code is actually running and the serial itself is working: Make it print a "Hello" message at the start of your main() after configuring the UART.
Make sure the interrupt is actually firing - make it light an LED when the interrupt is triggered.
Make it blink another LED as a "heartbeat" in your main while(1) loop to make sure it's not getting stuck.


Edit: After some digging and reading (I do find that Atmel datasheets are appallingly badly written) I have found that your interrupt vector is named wrong.

This page lists them all: http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html

There, after some scouring, you can find that for the ATMega16 the RX vector should be named:

    USART_RXC_vect 


After changing the name to that I can see from a decompilation that the ISR gets installed properly in the vector table:

00000000 &lt;__vectors&gt;:
   0:   0c 94 2a 00     jmp 0x54    ; 0x54 &lt;__ctors_end&gt;
   4:   0c 94 47 00     jmp 0x8e    ; 0x8e &lt;__bad_interrupt&gt;
   8:   0c 94 47 00     jmp 0x8e    ; 0x8e &lt;__bad_interrupt&gt;
   c:   0c 94 47 00     jmp 0x8e    ; 0x8e &lt;__bad_interrupt&gt;
  10:   0c 94 47 00     jmp 0x8e    ; 0x8e &lt;__bad_interrupt&gt;
  14:   0c 94 47 00     jmp 0x8e    ; 0x8e &lt;__bad_interrupt&gt;
  18:   0c 94 47 00     jmp 0x8e    ; 0x8e &lt;__bad_interrupt&gt;
  1c:   0c 94 47 00     jmp 0x8e    ; 0x8e &lt;__bad_interrupt&gt;
  20:   0c 94 47 00     jmp 0x8e    ; 0x8e &lt;__bad_interrupt&gt;
  24:   0c 94 47 00     jmp 0x8e    ; 0x8e &lt;__bad_interrupt&gt;
  28:   0c 94 47 00     jmp 0x8e    ; 0x8e &lt;__bad_interrupt&gt;
  2c:   0c 94 5c 00     jmp 0xb8    ; 0xb8 &lt;__vector_11&gt;   // &lt;-- ISR
  30:   0c 94 47 00     jmp 0x8e    ; 0x8e &lt;__bad_interrupt&gt;
  34:   0c 94 47 00     jmp 0x8e    ; 0x8e &lt;__bad_interrupt&gt;
  38:   0c 94 47 00     jmp 0x8e    ; 0x8e &lt;__bad_interrupt&gt;
  3c:   0c 94 47 00     jmp 0x8e    ; 0x8e &lt;__bad_interrupt&gt;
  40:   0c 94 47 00     jmp 0x8e    ; 0x8e &lt;__bad_interrupt&gt;
  44:   0c 94 47 00     jmp 0x8e    ; 0x8e &lt;__bad_interrupt&gt;
  48:   0c 94 47 00     jmp 0x8e    ; 0x8e &lt;__bad_interrupt&gt;
  4c:   0c 94 47 00     jmp 0x8e    ; 0x8e &lt;__bad_interrupt&gt;
  50:   0c 94 47 00     jmp 0x8e    ; 0x8e &lt;__bad_interrupt&gt;


... which it didn't before.