volatile unsigned char temp[];
Где размер массива? Без этого нельзя обращаться к такому массиву без извращений, которые я бы вам не рекомендовал.
// Установка скорости 9600
UBRRH=0; // UBRR=f/(16*band)-1 f=7372800Гц band=9600,
UBRRL=47; // нормальный асинхронный двунаправленный режим работы
Удобнее воспользоваться макросом.
Код: Выделить всё
#define UART_BAUD 9600
#define UART_UBRR ((F_CPU / 8 / UART_BAUD + 1)/2) //даже с округлением до ближайшего целого. Впрочем, писал из головы, лучше проверьте перед использованием
UBRR = UART_UBRR;
UCSRB|=(1<<RXEN)|(1<<RXCIE)|(1<<TXEN);
// URSEL - всегда 1
// |UMSEL - режим:1-синхронный 0-асинхронный
// ||UPM1 - UPM0:1 чётность
// |||UPM0 - UPM0:1 чётность
// ||||USBS - топ биты: 0-1, 1-2
// |||||UCSZ1 - UCSZ0:2 размер кадра данных
// ||||||UCSZ0 - UCSZ0:2 размер кадра данных
// |||||||UCPOL- в синхронном режиме - тактирование
// 76543210
UCSRC=0b10000110; // 8-битовая посылка
Расписывать биты прямо в коде не стоит - кому надо посмотрят в даташите, а вот указать какие биты выставляете (как вы сделали с UCSRB, но почему-то не сделали с UCSRC) стоит.
ISR(USART_RXC_vect) //прерывание по приему
Возможно, лучше выставить флаг в какой-нибудь переменной, а обработку вести уже в основном цикле.