У меня код чтения получается примерно такой:
В теории, после настройки он может ловить импульсы минимальной длительностью от SET1 до RTS плюс время нескольких пар BIT/BEQ чтобы можно было различать длинные и короткие импульсы. Правда нужно выравнивать длины веток переходы на которые помечены как add NOPS. Настройка заключается в установке LINEH/LINEL на последнюю пару BIT/BEQ(BNE), и попытке приёма одного слова. Затем передвигаем их назад, пока мы не определим весь диапазон устойчивого приёма слов настроечного сигнала, после чего метки нужно поставить посередине. По сравнению с кодированием скважностью, когда 1 бит кодируется двумя полуволнами, здесь для кодирования 4х бит требуется 6 полуволн(и 4 для кодирования комбинации 0000), то есть для скорости 10 кбод, частота будет чуть менее 7500 Гц.Код:MOV AAA,Rbuf ; начало буфера MOV NNN,Rlen ; длина буфера WAITZ: BIT / BNE WAITZ ; вход должен находиться в пассивном состоянии JSR BUFRD ; вызываем функцию чтения BUFRD: MOV 1,Rdata ; регистр для накопления слова c флагом для 16 бит MOVB 4,Ridx ; регистр для накопления индекса с флагом для 6 бит WAITH: BIT / BEQ WAITH ; ждём первый бит BR LINEH ; переходим к измерению длительности ;дальнейший код нужен еще в одном экземпляре для другой полуволны BIT / BEQ SET1 ; если переход сработает значит импульс короткий LINEH: BIT / BEQ SET1 ; положение данной метки настраивается в записимости от скорости BIT / BEQ SET1 WAITL: BIT / BNE WAITL ; переходы не сработали, значит импульс длинный, ждем окончание ;длинный импульс SET0: ASLB Ridx BCS SET2 ; add NOPS флаг индекса вылез, значит получено 6 бит CMPB 64,Ridx BEQ SET2 ; флаг не вылез, но это нуль из 4х бит ASL Rdata ; сдвигаем данные по каждому длинному импульсу BCS SAVE1 ; флаг вылез значит это последняя тетрада слова BR LINEL ; add NOPS ;короткий импульс SET1: ASLB Ridx BCC INC1 ; флаг индекса не вылез, значит нужно только добавить 1 и читать следующую полуволну INC Ridx ; флаг индекса вылез, длинных испульсов было только 2 ASL Rdata ; значит нужно сдвинуть данные еще 2 раза SET2: ASL Rdata BCC SUM1 ; флаг еще не вылез, значит это не последняя тетрада SAVE1: ADD (Table+Ridx),Rdata ; конвертируем индекс по таблице, нуль имеет индекс 64 MOV Rdata,(Rbuf)++ ; сохраняем данные MOVB 4,Ridx ; ставим флаг индекса MOV 1,Rdata ; ставим флаг данных SUB 1,Rlen ; уменьшаем длину BNE LINEL ; читаем другую полуволну RTS INC1: INC Ridx BR LINEL ; add NOPS SUM1: ADD (TableOdd+Ridx),Rdata MOVB 4,Ridx BR LINEL ; add NOPS




Ответить с цитированием