чекаємо закінчення сигналу. Потім виробляємо тестування відсутності сигналу протягом певного часу, якщо до закінчення даного проміжку часу сигнал з'явився, то робимо висновок, що прийнятий не наш сигнал і виходимо з підпрограми і продовжуємо очікування правильного сигналу в підпрограмі waiting. Після цього проводимо тестування наявності сигналу на Протягом певного часу, якщо до закінчення даного проміжку часу сигнал пропав, то робимо висновок, що прийнятий не наш сигнал і виходимо з підпрограми і продовжуємо очікування правильного сигналу в підпрограмі waiting. Якщо ж протягом певного часу сигналу не було, а потім на протязі певного часу сигнал був, то робимо висновок, що був успішно проведений прийом одного імпульсу нашого сигналу, зменшуємо лічильник прийнятих імпульсів на 1 і повертаються на мітку recp6 розглянутої підпрограми і проводимо всі дії з прийому імпульсу сигналу ще раз. Прийом імпульсів проводиться до тих пір поки лічильник імпульсів NUMIMP стане дорівнює нулю, і ми можемо вважати, що взяли три імпульсу нашого сигналу. Після цього переходимо в підпрограму calculation. Робота підпрограми більш зрозуміла з наведеної блок-схеми. В
Рис. 13. Блок-схема підпрограми reception. br/>
Підпрограма обчислення calculation
Даний блок відповідає наведеній нижче частини програми.
; ============================================== ================
calculation; підпрограма обчислення відстані інвертуємо значення TIMER1 і
; ---------------------------------------------- ------- TIMER2
movf TIMER1, 0; записуємо значення змінної TIMER1 в акумулятор
clrf TIMER1; Обнуляємо значення TIMER1
sublw d'100 '; з числа 100 віднімаємо значення акумулятора
movwf TIMER1; записуємо отримане значення в змінну TIMER1
movf TIMER2, 0; записуємо значення змінної TIMER2 в акумулятор
clrf TIMER2; Обнуляємо значення TIMER2
sublw d'100 '; з числа 100 віднімаємо значення акумулятора
movwf TIMER2; записуємо отримане значення в змінну TIMER2
; ---------------------------------------------- ------- встановлюємо значення для LAPSE і DIGIT1 .. 3
clrf LAPSE; Обнуляємо значення LAPSE
movlw d'57 'записуємо в акумулятор значення "57"
movwf LAPSE; записуємо значення акумулятора в змінну LAPSE
clrf DIGIT1; Обнуляємо значення DIGIT1
clrf DIGIT2; Обнуляємо значення DIGIT2
clrf DIGIT3; Обнуляємо значення DIGIT3
; ---------------------------------------------- ------- записуємо в акумулятор від'ємник
calc3 movlw d'6 '; "6"
subwf TIMER1, 1; віднімаємо з змінної TIMER1 значення акумулятора
перевіряємо прапори регістра STATUS
btfss STATUS, C; прапор Z-нульового результату
btfsc STATUS, Z; і прапор C-перенесення
goto calc4; якщо прапори Z і C не рівні 0
goto calc1; якщо Z = 0 і C = 0 означає результат негативний
; ---------------------------------------------- ------- міняємо значення DIGIT1 ... 3 та LAPSE
calc4 incf DIGIT1, 1; збільшуємо змінну DIGIT1 на "1"
movlw d'10 '; записуємо в акумулятор значення "10"
subwf DIGIT1, 0; віднімаємо значення акумулятора з змінної DIGIT1
btfss STATUS, Z; перевіряємо результат на "0"
goto calc2 якщо результат не "0" йдемо на мітку
; ---------------------------------------------- ------- calc2
decf DIGIT1, 1; якщо результат дорівнює "0" зменшуємо змінну DIGIT1 на "1"
incf DIGIT2, 1; збільшуємо змінну DIGIT2 на "1" (переносимо розряд)
movlw d'10 '; записуємо в акумулятор значення "10"
subwf DIGIT2, 0; віднімаємо значення акумулятора з змінної DIGIT2
btfss STATUS, Z; перевіряємо результат на "0"
goto calc2; якщо результат не "0" йдемо на мітку
; ---------------------------------------------- ------- calc2
decf DIGIT2, 1; якщо результат дорівнює "0" зменшуємо змінну DIGIT2 на "1"
incf DIGIT3, 1; збільшуємо змінну DIGIT3 на "1" (переносимо розряд)
movlw d'10 '; записуємо в акумулятор значення "10"
subwf DIGIT3, 0; віднімаємо значення акумулятора з змінної DIGIT3
btfss STATUS, Z; перевіряємо результат на "0"
goto calc2; якщо результат не "0" йдемо на мітку calc2
decf DIGIT3, 1; якщо результат дорівнює "0" зменшуємо змінну DIGIT3 на "1"
goto calc5; виходимо з підпрограми тому досягнуто значення 99,9
; ---------------------------------------------- ------- коригуємо похибка перекладу
calc2 decfz LAPSE, 1; зменшуємо значення LAPSE на 1
goto calc3; якщо мінлива LAPSE не дорівнює "0" - йдемо на мітку calc3
movlw d'57 '; записуємо в акумулятор значення "57"
movwf LAPSE; записуємо значення акумулятора в змінну LAPSE