Пункт 1.
Ничего, что у тебя в UBBRH 0x06?..
Делитель получается 16 * (256 * 6 + 25 + 1) = 24992, 4 МГц / 24992 = 160.05 бит/с.
Регистр UCSRC и UBBRH имеют общий адрес.
Чтение с этого адреса всегда приводит к чтению UBBRH.
Запись в этот адрес значения(!) с URSEL = 1, приводит к записи в UCSRC, а с URSEL = 0 к записи в UBBRH.
Там дешифрация по старшему биту.
Замени:
UCSRC = 0x06; - запись 0x06 в UBRRH
UCSRC |= URSEL;
на:
UCSRC = URSEL | 0x06;
Это не УСАПП странно работает, а разработчик.
Пункт 2.
Вообще не ясно, зачем так инициализацию делать:
UCSRB |= RXEN;
UCSRB |= TXEN;
UCSRB |= TXCIE;
UCSRB |= RXCIE;
логичней:
UCSRB = RXEN | TXEN | TXCIE | RXCIE;
Это не УСАПП странно работает, а снова разработчик.
Пункт 3.
Неверно:
UCSRB = RXEN | TXEN | TXCIE | RXCIE;
Верно:
UCSRB = (1 << RXEN) | (1 << TXEN) | (1 << TXCIE) | (1 << RXCIE);
RXEN, TXEN, ... - номера(!) бит, а не готовые маски.
Это не УСАПП странно работает, и снова разработчик.
Пункт 4.
Есть такая штука - симуляторы...