ння з підпрограми
; ============================================== ================
При виконанні цієї підпрограми відбувається тестування присутності сигналу (+5 В) на лінії RA2 порту A. Якщо на лінію надходить напруга (Кнопка натиснута) - виконується команда переходу в основну програму на відповідну мітку (main2). В іншому випадку (Кнопка не натискати) перехід здійснюється на іншу мітку основної програми (main2). br/>
Підпрограма передачі transfer
Даний блок відповідає наведеній нижче частини програми.
; ============================================== ================
transfer; підпрограма передачі імпульсів
movlw d'5 '; поміщаємо значення "5" для NUMIMP в акумулятор
movwf NUMIMP; поміщаємо значення з акумулятора в NUMIMP
; ---------------------------------------------- ------- передача сигналу
tran1 bsf PORTA, 0; встановлюємо в 1 лінію RA0 порту А
movlw d'249 '; поміщаємо значення "249" для таймера в акумулятор
movwf TMR0; поміщаємо значення з акумулятора в таймер
bcf INTCON, TOIF; встановлюємо в 0 прапор переривання по переповнення таймера
tran2 btfss INTCON, TOIF; перевіряємо прапор переривання по переповнення таймера
goto tran2; якщо прапор дорівнює 0 (лічильник не переповнений)-виконуємо перевірку
; якщо прапор дорівнює 1 (лічильник переповнений) -
; ---------------------------------------------- ------- затримка сигналу
bcf PORTA, 0; встановлюємо в 0 лінію RA0 порту А
movlw d'251 '; поміщаємо значення "251" для таймера в акумулятор
movwf TMR0; поміщаємо значення з акумулятора в таймер
bcf INTCON, TOIF; встановлюємо в 0 прапор переривання по переповнення таймера
tran3 btfss INTCON, TOIF; перевіряємо прапор переривання по переповнення таймера
goto tran3; якщо прапор дорівнює 0 (лічильник не переповнений)-виконуємо перевірку
, якщо прапор дорівнює 1 (лічильник переповнений) -
; ---------------------------------------------- ------- вважаємо імпульси
decfsz NUMIMP, 1; зменшуємо зачение NUMIMP на "1" якщо NUMIMP НЕ дорівнює "0"
; (передано <5імпульсов) -
goto tran1; переходимо в початок підпрограми на tran1 якщо NUMIMP дорівнює "0"
; ---------------------------------------------- ------- (передано 5 імпульсів) -
movlw d'3 '; поміщаємо значення "3" для NUMIMP в акумулятор
movwf NUMIMP; поміщаємо значення з акумулятора в NUMIMP
return; повернення з підпрограми
; ============================================== ================
Ця підпрограма виводить на лінію RA0 порту А мікроконтролера +5 імпульсів частотою 40 кГц. Враховуючи, що ми не підключаємо предделітель для таймера-лічильника TMR0 і в схемі використовується керамічний резонатор частотою 4 МГц маємо тактову частоту мікроконтролера рівну 1 МГц, тобто одна команда виконується за 1 мкс. Отже один імпульс частотою 40 кГц має тривалість 1/40000 = 25 мкс. Тобто ми повинні сформувати один імпульс за 25 мкс. Блок-схема даної підпрограми представлена ​​на рис. 11. Значення для таймера підібрані таким чином, щоб сформувати імпульс на лінії тривалістю близько 25 мкс. У кінці підпрограми встановлюється нове значення для змінної NUMIMP, тому що воно буде потрібно для роботи іншої підпрограми.
В
Рис. 11. Блок-схема підпрограми transfer.
Підпрограма очікування waiting
В
Даний блок відповідає наведеній нижче частини програми.
; ============================================== ================
waiting; підпрограма очікування відбитого сигналу
; ---------------------------------------------- ------- затримка початку прийому сигналу
movlw d'151 '; поміщаємо значення "151" для таймера в акумулятор
movwf TMR0; поміщаємо значення з акумулятора в таймер
bcf INTCON, TOIF; встановлюємо в 0 прапор переривання по переповнення таймера
wait1 btfss INTCON, TOIF; перевіряємо прапор переривання по переповнення таймера
goto wait1; якщо прапор дорівнює 0 (лічильник не переповнений)-виконуємо перевірку
; якщо прапор дорівнює 1 (лічильник переповнений) -
; ---------------------------------------------- ------- починаємо рахунок часу
очікування прийоми (по 100 мкс)
wait3 movlw d'161 '; поміщаємо значення "161" для таймера в акумулятор
movwf TMR0; поміщаємо значення з акумулятора в таймер
bcf INTCON, TOIF; встановлюємо в 0 прапор переривання по переповнення таймера
wait2 btfsc PORTA, 1; перевіряємо наявність сигналу на лінії RA1 порту А
goto wait4; якщо сигнал є-переходимо на мітку wait4
якщо сигналу ні-продовжуємо рахунок часу
btfs...