No cóż, jak dla mnie to 2 sprawy do przerobienia :
1. Pomiar czasu na Timer0 - jakaś parka bajtów w SRAM, służąca za licznik, który co przerwanie zmniejsza swoją wartość do zera, ale się nie przekręca. Jak chcemy zmierzyć czas, to cli, zapis licznika, sei i już tylko sprawdzamy czy licznik jest wyzerowany, a w międzyczasie program może wyskoczyc do pętli głównej, robić coś pożytecznego, zamiast "mielić" w miejscu.
2. Analogicznie przy "sbis USR, UDRE" - niech robi swoje w petli głównej, do póki nie można będzie coś wysłać, dałbym nawet mały buforek danych do wysłania i odpowiednią procedurkę do kompletu.
Może wycinek kodu z mojej procedurki (ATmega8515) coś podpowie:
#ifdef RS232_DEBUG_TXD
.dseg
TxBuff:
.byte 0x40
cTxBuff:
.byte 0x01
lpSendTxBuff:
.byte 0x02
.cseg
USARTTxInit:
sts cTxBuff, TempD
ldi TempA, LOW(TxBuff)
sts lpSendTxBuff, TempA
ldi TempA, HIGH(TxBuff)
sts lpSendTxBuff+1, TempA
ret
USARTTx:
sbis UCSRA, UDRE
rjmp USARTTxEnd
lds TempA, cTxBuff
tst TempA
breq USARTTxEnd
lds XL, lpSendTxBuff
lds XH, lpSendTxBuff+1
ld DataByte, X+
out UDR, DataByte
sts lpSendTxBuff, XL
sts lpSendTxBuff+1, XH
dec TempA
sts cTxBuff, TempA
USARTTxEnd:
ret
#endif
Wywołanie :
W rejestrze
TempD (
r13 - tak sobie ponazywałem...

) - długość tekstu wpisanego do
TxBuff
Działanie : podprocedurka pętli głównej, jak transmisja zajęta, to wraca i nic nie wysyła, można tu dorobić dodanie czegoś do bufora i zwiekszenie licznika ilości danych do wysłania
cTxBuff
--------------
Abstrachując od UART-a, możesz chyba pod jakiś wolny pin podpiąć LED+rezystorek i niech ona się zaświeci, jeżeli DS odpowiada...
Light-I