Для выравнивания веток лучше всего использовать не NOP, а такие же команды как используются в длинной ветке, а ненужные результаты записывать в Rtemp. Ну а команду сохранения меняем на команду загрузки, только указатель не увеличиваем. Данному коду требуется, чтобы длина короткой полуволны была больше, чем время выполнения от SET1 до RTS, а вместе с пачкой BIT/BEQ была перекрыта и длинная полуволна(иначе будет непонятно где середина устойчивого приёма). Можно для начала сделать и со счётчиком, правда там придётся делать его загрузку, проверку и условный переход, что несколько снизит максимальную скорость приёма. Вообще для выравнивания времени выполнения кода можно сделать следующее:
1) подать на вход сигнал с некоторой частотой(с ним будем сравнивать время выполнения кода)
2) дождаться начала положительного импульса(это нужно будет делать для каждого измерения)
3) выполнить эталонную ветку заменив условные переходы на безусловные
4) скопировать 256 раз состояние входа в память, после чего вывести полученную зебру на экран
5) дождаться нового импульса и выполнить другой код
6) прочитать 256 раз состояние входа и вывести рядом с первым
7) по сдвигу между выведенными полосками мы сможем определить насколько совпадает время их выполнения
8) добавляем или убираем команды и повторяем эксперимент
PS: можно вообще дождаться импульс, после чего 256 раз прогонять код и записывать по 1 значению входа, тогда вид зебр станет одинаковым при идеальной подгонке кода, иначе чем ближе к концу, тем больше будет расползаться.
PPS: Пришла тут мысль, что лучше использовать кодирование 3 длинных/3 коротких, там всего 20 комбинаций, но если выкинуть 011011011, 001001001 и еще парочку, то соотношение 0 и 1 во всех случаях будет 4/5, и код несколько упрощается:
Если нам не требуется фиксированная скорость, и вход позволяет принимать данные при соотношении H и L равном 1 к 2 или наоборот, можно всё существенно упростить, причём ветка с сохранением получается достаточно короткой:Код:LDDAT: MOV 1,Rdata ; флаг для отлова окончания слова LDIDX: MOVB -4,Ridx ; 6 флагов для отлова окончания индекса WAIT0: MOV Tune,Rcnt INC0: DEC Rcnt BIT BNE INC0 ASL Rdata ; всего здесь слово будет сдвинуто 3 раза ASLB Ridx ; индекс двигаем 2 раза чтобы не двигать в длинной ветке ASLB Ridx ASL Rcnt ; добавляем едриницу в предпоследний бит ADCB Ridx ASL Rcnt ADCB Ridx ; add NOPS WAIT1: MOV Tune,Rcnt INC1: DEC Rcnt BIT BEQ INC1 ASL Rcnt ; устанавливаем младший бит индекса ADC Ridx BMI WAIT0 ; add NOPS если индекс еще не закончился ASL Rdata ; 4й раз сдвигаем данные и проверяем не закончилось ли слово BCC BADD ADD (Table+Ridx),Rdata ; сохраняем если закончилось MOV Rdata,(Rbuf)++ DEC Rlen BNE LDDAT RTS BADD: ADD (Table+Ridx),Rdata BR LDIDX ; add NOPS
Код:MOV 1,Rdata MOV Tune,Rcnt WAIT0: DEC Rcnt ; ждём первый и нечётные биты BIT BNE WAIT0 ASL Rdata ASL Rcnt MOV Tune,Rcnt ADC Rdata ASL Rdata ; сдвигаем здесь, чтобы не двигать когда придёт последний бит BCC WAIT2 ; add NOPS WAIT1: DEC Rcnt ; ждём последний бит BIT BEQ WAIT1 ASL Rcnt MOV Tune,Rcnt ADC Rdata MOV Rdata,(Rbuf)++ MOV 1,Rdata DEC Rlen BNE WAIT0 RTS WAIT2: DEC Rcnt ; ждём чётные биты, кроме последнего BIT BEQ WAIT2 ASL Rcnt MOV Tune,Rcnt ADC Rdata BR WAIT0 ; add NOPS




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