Bueno antes que nada gracias a
stk500 por intentar ayudarme. Se que no hice el codigo limpio por lo que me disculpo por eso, pero me ayudo que hallas intentado ayudarme. La verdad estaba muy estresado pero el apoyo me sirvio.

Ya pude hacer funcionar el programa. Si alguien quiere el codigo puedo subirlo, pero hay muchos ejemplos en internet, solo asegurense de leer un poco los que les pongo. Estos son los pasos que lleve acabo para poder hacer funcionar el codigo.
Primero. Asegurarse de configurar bien los registros.Para esto hay que leer el PDF del atmel en cuestion. Los registros dependen del modulo que se esta usando por ejemplo para el USART0, el registro UBRRnH se debe cambiar la n por el "0" para quedar asi UBRR0H, si no dara un error.
#define FOSC 8000000
#define BAUD 9600
#define MYUBRR (((FOSC/(16UL*BAUD)))-1)
void USART_init(unsigned int ubrr)
{
//set baud rate
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char)ubrr;
//Enable receiver and transmitter
UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0); // Interrupción por recepción.
//set frame format: 8 data, 1 stop bit
UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
}Segundo. El orden del codigo.Como en USART_init(MYUBRR) se estan habilitando la interrupcion por recepcion se debe llamar la funcion sei() para habilitar las interrupciones generales. En este caso me parece que el orden importa, entonces lo puse en ese orden porque de otra forma no funciona, no a mi por lo menos
USART_init(MYUBRR);
sei();Tercero. El parametro de la interrupcion.
Las interrupciones utilizan parametros para determinar el tipo de interrupcion. A mi me llamo la atencion que cada atmel tenga diferentes parametros para el mismo tipo de interrupcion. En este caso, para la interrupcion por recepcion de usart del ATmega168 usa como parametro "
USART_RX_vect" mientras que otro Atmel como el ATmega323 use como parametro "
USART_RXC_vect".
ISR(USART_RX_vect)
{
data=UDR0;
}Si alguien se topa con ese problema, porque de hecho el compilador les dara un warning parecido a este "'USART0_RX_vect' appears to be a misspelled signal handler [enabled by default]" y por ende no entrara a la interrupcion. Les dejo esta pagina para que chequen, dependiendo del modelo que es lo que necesitan. Eso si, parace que esa informacion esta dentro de la librerria avr/interrupt.h
http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.htmlCuarto. Frecuencia de cristal.
Quien se mete a con la comunicacion serial y seguramente con otros modulos internos del atmel se va a dar cuenta que necesita definir una frecuencia de reloj. Para no hacer el cuento largo, al momento de programar se define las caracteristicas de ese cristal que se necesita, por lo que no es necesario meterse con los "fuses".
Ademas, si se simula en proteus. En las propiedades del microcontrolador atmel, viene por default, el CLKDIV8 esta habilidado como (0) programmed. Este valor debe cambierse por (1) unprogrammed para evitar la division por 8 del reloj y por tanto evitar anomalias. Claro a menos que se ocupe asi.
Espero que esta experiencia ayude a personas que van empezando como yo.
Cuidense.