Рефераты. Устройство ультразвукового измерения дальности

Подпрограмма передачи 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

если сигнала нет-продолжаем счет времени

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" для таймера в аккумулятор

movwf        TMR0         ;помещаем значение из аккумулятора в таймер

bcf    INTCON, TOIF   ;устанавливаем в 0 флаг прерывания по переполнению таймера

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" для таймера в аккумулятор

movwf        TMR0         ;помещаем значение из аккумулятора в таймер

bcf    INTCON, TOIF   ;устанавливаем в 0 флаг прерывания по переполнению таймера

recp4 btfss  INTCON, TOIF   ;проверяем флаг переполнения таймера если таймер не переполнен-

btfss  PORTA, 1  ;проверяем наличие сигнала на линии RA1 порта А если таймер переполнен или нет

goto   recp5 ;сигнала-идем на метку recp5 если таймер не переполнен и есть

goto   recp4 ;сигнал-идем на метку recp4

;-----------------------------------------------------проверяем флаг переполнения таймера

recp5 btfss  INTCON, TOIF   ;если таймер не переполнен-

goto   recp3 ;сигнал не наш-идем на метку recp3

;---------------------------------------------------------------------------------------------------------    

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



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.