26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
LDI OSRG,63 ;63 - (0.25Y) вычитаем
SUB OSRG,ACC
RET ; Выходим с результатом в OSRG
; X= 150 - Y
Near: LDI OSRG,150
SUB OSRG,ACC ; 150-Y Не зря мы в АСС скопировали
RET ; Выходим с результатом в OSRG
; X = 63+255-4Y
Far: LSL OSRG ; Y*4 сдвигом умножаем на 4
LSL OSRG
COM OSRG ; 255-(Y*4) вычли
SUBI OSRG,-63 ; 63+(255-(Y*4)) сложили
RET ; Выходим с результатом в OSRG
TooFar: LDI OSRG,255 ; Совсем далеко? Ну и думать нечего!
RET ; Выходим с результатом в OSRG
Итого, 52 байта на весь экшн. Причем на самую длинную ветвь отводится
всего 10 тактов. Красота! Можно даже в прерывании обрабатывать!
Да, к вопросу о том, зачем мне понадобилось растягивать диапазон до 255
попугаев. Дело в том, что несколько повышается точность выхода, но правда
увеличивается уровень болтанки сигнала. Т.к. ИК порой выдает много
мусора, особенно на дальних расстояниях, когда у него вытягивается
характеристика и малейшие колебания превращаются в мощный расколбас
выходного значения.
Так вот, когда у нас диапазон большой, то можно нажрать этой каши
побольше, потом усреднить и сразу же поделить на попугаев (в том же
сдвиге). На выходе, по идее, получим очень стабильные и красивые
сантиметры. Впрочем, это только первичный экспериментальный прогон. Я
толком еще не тестировал, но первые опыты уже дали более-менее
адекватные результаты.