Подпрограмма передачи 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" для таймера в аккумулятор
tran3 btfss INTCON, TOIF ;проверяем флаг прерывания по переполнению таймера
goto tran3 ;если флаг равен 0 (счетчик не переполнен)-выполняем проверку
;-----------------------------------------------------считаем импульсы
decfsz NUMIMP, 1 ;уменьшаем зачение NUMIMP на "1" если NUMIMP не равен "0"
;(передано<5импульсов)-
goto tran1 ;переходим в начало подпрограммы на tran1 если NUMIMP равен "0"
;-----------------------------------------------------(передано 5 импульсов)-
movlw d'3' ;помещаем значение "3" для 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" для таймера в аккумулятор
wait1 btfss INTCON, TOIF ;проверяем флаг прерывания по переполнению таймера
goto wait1 ;если флаг равен 0 (счетчик не переполнен)-выполняем проверку
;-----------------------------------------------------начинаем счет времени
ожидание приема (по 100 мкс)
wait3 movlw d'161' ;помещаем значение "161" для таймера в аккумулятор
wait2 btfsc PORTA, 1 ;проверяем наличие сигнала на линии RA1 порта А
goto wait4 ;если сигнал есть-переходим на метку wait4
если сигнала нет-продолжаем счет времени
btfss INTCON, TOIF ;проверяем флаг прерывания по переполнению таймера
goto wait2 ;если флаг равен 0 (счетчик не
;-----------------------------------------------------переполнен)-выполняем проверку
decfsz TIMER1, 1 ;если флаг равен 1 (счетчик переполнен)-уменьшаем TIMER1 на 1
goto wait3 ;если TIMER1 не равен "0"
;-----------------------------------------------------продолжаем ожидание если TIMER1 равен "0"-
movlw d'100' ;помещаем значение "100" для TIMER1 в аккумулятор
movwf TIMER1 ;помещаем значение из аккумулятора в TIMER1
decfsz TIMER2, 1 ;уменьшаем значение TIMER2 на 1
goto wait3 ;если TIMER2 не равен "0"
;-----------------------------------------------------продолжаем ожидание
;если TIMER2 равен "0" (сигнал уже не вернется)-заполняем
;значения DIGIT1..3
movlw d'9' ;помещаем значение "9" для переменной DIGIT1 в аккумулятор
movwf DIGIT1 ;помещаем значение из аккумулятора в DIGIT1
movlw d'9' ;помещаем значение "9" для переменной ;DIGIT2 в аккумулятор
movwf DIGIT2 ;помещаем значение из аккумулятора в DIGIT2
movlw d'9' ;помещаем значение "9" для переменной ;DIGIT3 в аккумулятор
movwf DIGIT3 ;помещаем значение из аккумулятора в DIGIT3
goto main1 ;возврат из подпрограммы (сигнала нет)
wait4 goto main4 ;возврат из подпрограммы (сигнал есть)
Рис. 12. Блок-схема подпрограммы waiting.
В начальной части подпрограммы производится небольшая задержка начала счета времени ожидания для того, чтобы произошло затухание помех вызванных излучением сигнала в предыдущей подпрограмме. Затем запускается таймер на 100 мкс. Т.к. мы будем считать промежутки времени по 100 мкс. Блок-схема подпрограммы представлена на рис. 12. Таким образом максимальный период ожидания составит 100*100*100=1000000 мкс, что составляет 1с. Принимая скорость распространения звука равной 331,4 м/с – это более чем достаточно, т.к. по условию задания максимальная измеряемая дальность устройства составит 99,9 метра.
Подпрограмма приема reception
reception ;подпрограмма приема отраженного сигнала
ожидание окончания сигнала
recp1 btfsс PORTA, 1 ;проверяем наличие сигнала на линии RA1 порта А
goto recp1 ;если сигнала есть-продолжаем ожидание
;-----------------------------------------------------если сигнала нет-начинаем проверку
recp6 movlw d'251' ;помещаем значение "251" для таймера в аккумулятор
recp1 btfss INTCON, TOIF ;проверяем флаг переполнения таймера если таймер не переполнен-
btfsc PORTA, 1 ;проверяем отсутствие сигнала на линии RA1 порта А
;если таймер переполнен или есть
goto recp2 ;сигнал-идем на метку recp2 если таймер не переполнен и нет
goto recp1 ;сигнала-идем на метку recp1
;-----------------------------------------------------проверяем флаг переполнения таймера
recp2 btfss INTCON, TOIF ;если таймер не переполнен-
goto recp3 ;сигнал не наш-идем на метку recp3
movlw d'252' ;помещаем значение "252" для таймера в аккумулятор
recp4 btfss INTCON, TOIF ;проверяем флаг переполнения таймера если таймер не переполнен-
btfss PORTA, 1 ;проверяем наличие сигнала на линии RA1 порта А если таймер переполнен или нет
goto recp5 ;сигнала-идем на метку recp5 если таймер не переполнен и есть
goto recp4 ;сигнал-идем на метку recp4
recp5 btfss INTCON, TOIF ;если таймер не переполнен-
decfsz NUMIMP, 1 ;уменьшаем значение NUMIMP на "1"
goto recp6 ;если NUMIMP не равен "0"-продолжаем проверку
goto main5 ;если NUMIMP равен "0"-возврат из подпрограммы
recp3 goto main3 ;продолжение ожидания сигнала
Блок-схема данной подпрограммы представлена на рис. 13. Т.к. переход в подпрограмму осуществляется при наличии сигнала на линии RA1 порта А микроконтроллера, то сначала дожидаемся окончания сигнала. Затем производим тестирование отсутствия сигнала на протяжении определенного времени, если до истечения данного промежутка времени сигнал появился, то делаем вывод, что принят не наш сигнал и выходим из подпрограммы и продолжаем ожидание правильного сигнала в подпрограмме waiting. После этого производим тестирование наличия сигнала на протяжении определенного времени, если до истечения данного промежутка времени сигнал пропал, то делаем вывод, что принят не наш сигнал и выходим из подпрограммы и продолжаем ожидание правильного сигнала в подпрограмме waiting. Если же в течение определенного времени сигнала не было, а затем в течении определенного времени сигнал был, то делаем вывод, что был успешно произведен прием одного импульса нашего сигнала, уменьшаем счетчик принятых импульсов на 1 и возвращаемся на метку recp6 рассматриваемой подпрограммы и производим все действия по приему импульса сигнала еще раз. Прием импульсов проводится до тех пор пока счетчик импульсов NUMIMP не станет равен нулю, и мы можем считать, что приняли три импульса нашего сигнала. После этого переходим в подпрограмму calculation. Работа подпрограммы более понятна из приведенной блок-схемы.
Страницы: 1, 2, 3, 4, 5, 6