1. В прерывании по int0 вместо
Код
in temp, GIMSK;* Запрет INT0
cbr temp, 0b10111111;*
out GIMSK, temp;*
нужно
Код
in temp, GIMSK;* Запрет INT0
cbr temp, 0b01000000;*
out GIMSK, temp;*
а еще лучше cbr temp,1<<Int0
2. 1/период переполнения таймера в режиме СТС равен ZQ/PSK/(OCRA+1), поэтому длительности в 1 бит будет соответствовать значение в ОСRA == 144-1. Соответственно, 1/2 бита == 144/2-1=70
P.S. В качестве счетчика битов можно использовать и сам регистр input0, если по приходу старт-бита (по инт0) в загружать в него 0x80.
Признаком окончания приема будет появление "1" в бите переноса при прокрутке регистра input0 вправо
Тогда код
Код
RX0:;* Приём
inc count0;* Увеличить на 1 значение счётчика битов
lsr input0;* сдвинуть вправо регистр данных
clt;* сбросить бит Т
sbic PinD,2
set;* Установить бит Т если на входе 1
bld input0,7;* Скопировать бит Т в 7-й бит регистра данных
cpi count0,8;* Если принятых бит не 8, то выход
brne Exit0
sbi flags0,6;* в противном случае устанавливаем флаг приёма байта данны
нужно заменить на
Код
clc;Входящий бит записываем через бит переноса
sbic PinD,2
sec;
ror input0; Записываем входящий бит, признак последнего бита - в флаг С
brcc Exit0;
sbi flags0,6; Если на выходе С==1, то принятый бит - последний. Дальше принимаем стоп-бит