Цитата(Whosthere @ Dec 6 2011, 11:04)

..ATMEGA128.
Код
.cseg
in r15,UDR0
ldi r17, 47; устанавливаем скорость 9600
out UBRR0L,r17
регистр UBRRxn 16 битный. А вы сколько в него пихаете?
В даташите есть примеры. нафига не используете опыт ранее накопленный до вас?
правильный код (даташит) (входные регистры r17:r16 - тут приведу инициализацию их)
Код
ldi r16,low(47)
ldi r17,high(47)
; Set baud rate
out UBRR0H, r17
out UBRR0L, r16
ышо правильнее за место 47 объявить дефайн константу и юзать её...
Цитата(Whosthere @ Dec 6 2011, 11:04)

Код
ldi r16, 18; устанавливаем режим приема
out UCSR0B, r16; данных в 8битном пакете
Давайте посчитаем...
18(10) = 0b00010010(2)
это Вы взводите биты RXEN0 и RXB80
как уже было сказано выше - 1 бит - это вы погорячились...
достаточно (для поллинга как у вас ниже) бита RXEN0
и ещё. чтоб не путаться и наглядно принято писать такие комбинации:
Код
ldi r16,(1 << RXEN0)
всякие стоп биты, чётности и т.д. инициализируются в регистре UCSR0C
этого в вашем примере нет.
ещё пять копеек:
прерывания надо запрещать перед тем как это всё делать. после - восстанавливать (а не разрешать) - это так к слову..
Цитата(Whosthere @ Dec 6 2011, 11:04)

Код
Receive:
sbis UCSR0A, RXC0; ожидаем приема полного пакета данных
rjmp receive
in r15, UDR0; загружаем данные в R15
rjmp receive
Микроконтроллер тактируется от кварцевого генератора с частотой 7,3728 МГц.....
это конечно же круто. но лучше пример из даташита:
Код
USART_Receive:
; Wait for data to be received
sbis UCSRA, RXC
rjmp USART_Receive
; Get status and 9th bit, then data from buffer
in r18, UCSRA
in r17, UCSRB
in r16, UDR
; If error, return -1
andi r18,(1<<FE)|(1<<DOR)|(1<<UPE)
breq USART_ReceiveNoError
ldi r17, HIGH(-1)
ldi r16, LOW(-1)
USART_ReceiveNoError:
; Filter the 9th bit, then return
lsr r17
andi r17, 0x01
ret
выкинем 9 бит и имеем
Код
USART_Receive:
; Wait for data to be received
sbis UCSRA, RXC
rjmp USART_Receive
; Get status then data from buffer
in r18, UCSRA
in r16, UDR
; If error, return -1
andi r18,(1<<FE)|(1<<DOR)|(1<<UPE)
breq USART_ReceiveNoError
ldi r16, LOW(-1)
USART_ReceiveNoError:
....
; далее ваш текст программы. ретурн, возврат на начало приёма - хз. единственное хочу сказать, что результат надо куда то выпихивать, сохранять, контролировать...а не тупо просто циклить. а то можно и не увидеть самого главного нечаянно.
при вашей скорости кварца значения делителя 47. При U2X0 = 0 и указанного кварца - он верный. Fuse выставлен на внешний кварц.
из приведённого вами куска, больше всего подозрение вызывает:
не правильная инициализация 16 битного регистра скорости!!!
удачи вам
(круглый)