movlw 27 ; Синхронизация таймера 0 по заднему фронту
внешних тактов, включение таймера.
movwf option_reg
movlw 10
movwf trisa ; RAO - RA3 выходы, RA4 вход.
clrf trisb ; RBO - RB7 выходы.
bcf status, 5 ; Обращение к банку 0.
movlw 08 ; Для контроля дисплея
movwf Dig_x ; Загрузить во все регистры индикации 8.
MovwfDig_y
movwfDig_z
movwfDig_exp
Основной цикл программы
movlw 0A ; Установить счетчик циклов индикации.
movwf cnt_r
loop1 call refresh ; Вывод на индиторы.
decfsz cnt_r, f
goto loop1
loop5 clrf tmr0 ; Сброс таймера.
bsf status, 5 ; Обращение к банку 1.
movlw 0001 ; Разрешить прохождение внешних тактов на
вход таймера, RBO вход.
movwf trisb
bcf status,5 ; Обращение к банку 0.
movlw .199 ; 1 мс ожидания для измерения
высокочастотных сигналов.
movwf cnt1
in_ms nор
clrwdt
decfsz cntl, f
goto in_ms
clrf trisb ; Заблокировать прохождение внешних тактов
на вход таймера, RBO выход.
call prescaler ; Считать накопленное значение таймера.
movf H_byte, f
btfss status,2 ; Старший байт значения таймера = 0?
goto call_ms ; Нет, переход на обработку.
btfsc L_byte,7 ; Старший разряд младшего байта значения=0?
clrf tmr0 ; Сброс таймера.
bsf status,5 ; Обращение к банку 1.
movlw 01 ; Разрешить прохождение внешних тактов на
вход.
movwf trisb ; таймера, RBO вход.
nор ; 0.5 с ожидания для измерения низкочастотных сигналов.
nор
loopr call refresh ; Вывод на индикацию.
goto loopr
goto cal05 ; Нет, переход на обработку.
clrf Dig x ; Да, обнулить текущее значение индикации.
clrf Dig_y
clrf Dig_z
clrf Dig_exp
goto loop5 ; Переход на начало основного цикла.
Обработка измерения высокочастотных сигналов.
call_msclrf U ; Очистка десятичных регистров.
clrf D clrf H
clrf M
clrf DM
clrf CM
movlw 03 ; Коррекция порядка результата для
movwf Dig_exp
call segment ; Преобразование DEC в семисегментный код.
movwf portb ; Вывод цифры на индикатор.
bcf porta,1 ; Активизировать индикатор.
call Delay ; Задержка времени для сканирования.
bsf porta, 1 ; Отключить индикатор.
movf Dig_z, W ; Значение сотых для индикации.
bcf porta,2 ; Активизировать индикатор.
bsf porta,2 ; Отключить индикатор.
movf Dig_exp, W ; Значение порядка результата для индикации.
bcf porta,3 ; Активизировать индикатор.
bsf porta, 3 ; Отключить индикатор.
return
prescaler ; Считать накопленное значение таймера.
movf tmr0, W
movwf H_byte ; Сохранить значение таймера 0.
Извлечение значения предделителя TMR00.
clrf N ; Обнулить счетчик.
cicl bcf portb,0 ; Сформировать тактовый импульс на входе
синхронизации таймера.
bsf portb,0
bcf portb,0
incf N, f ; Инкремент счетчика.
movf H_byte, W
xonvf tmrO, W ; Значение таймера 0 изменилось? btfsc status,2
goto cicl ; Нет, повторить цикл.
movlw 00FF
movwf L_byte
movf N, W
subwf L_byte, f ; Получить и сохранить значение
предделителя.
incf L_byte, f
calc ; Преобразование формата: HEX в DEC.
movlw .16 ; Установить счетчик разрядов.
movwf N
coder
rlf L_byte, f ; Сдвиг старшего разряда значения таймера в
бит С.
rlf H_byte, f
btfsc status,0 ; Бит С = 1?
call sessn ; Да, прибавить десятичное значение разряда к десятичным регистрам.
decfsz N, f ; Декремент счетчика разрядов.
goto coder ; Продолжить преобразование.
call report ; Коррекция значений десятичных регистров.
; Вычисление порядка значения индикации.
movlw 05 ; Установить счетчик разрядов после запятой.
movwf E movlw CM+1 ; Загрузить адрес строки десятичных разрядов
для косвенной адресации.
movwf fsr
calc_ext ; Поиск старшего значащего разряда.
decf fsr, f ; Коррекция счетчика разрядов.
movf indf, W
btfss status,2 ; Значение = О?
goto end_ext ; Нет, закончить поиск.
decfsz E, f ; Все разряды проверены?
goto calc_ext ; Нет, продолжить поиск.
end_ext
movlw 2
subwf E,W
btfss status,0 ; Значение порядка < 2? goto err ; Да, ошибка - обнулить значение индикации.
btfsc status,2 ; Значение порядка = 2? goto no_app ; Да, обход округления.
; Округление выходного значения.
addlw U ; Получить адрес отбрасываемого разряда для косвенной адресации.
movwf fsr ;
decf fsr, f movlw 05 ; Сравнить значение разряда с 5.
subwf indf, W
btfss status,0 ; Значение > 5?
goto no_app ; Нет, обход округления.
incf fsr, f
incf indf, f ; Да, инкремент следующего разряда.
no_app
call report ; Коррекция значений десятичных регистров после округления. movf E,W ; Формирование значения для индикации.
addwf Dig_exp, f ; Сохранить значение Е.
addlw U ; Получить адрес строки десятичных разрядов
movwf Dig_x ; Переслать значение X.
decf fsr, f
movwf Dig_y ; Переслать значение Y.
movwf Dig_z ; Переслать значение Z.
Ошибка - обнулить значение индикации.
err movlw 0
movwf Dig_x
clrf N
call calc ; Вычисление значения для индикации.
movlw 0A ; Загрузить счетчик циклов индикации.
goto loop1 ; Переход на начало основного цикла.
Обработка измерения низкочастотных сигналов.
саl05 clrf U ; Очистка десятичных регистров.
movlw .17 ; Установить счетчик разрядов.
movwfN
btfsc H_byte,7 ; Старший разряд значения таймера =1?
call sessn ; Да, загрузить в десятичные регистры
216=65536.
bcf status, 0
rlf L_byte, f ; Коррекция значения таймера до 1с.
clrf Dig_exp ; Коррекция порядка результата для
низкочастотных сигналов.
Delay ; Подпрограмма задержки времени для
сканирования индикации.
movlw .10
movwf cnt 1
beta movlw .248
movwf cnt2
clrwdt ; Сброс сторожевого таймера.
Alfa nор
decfsz cnt2, f
goto alfa
goto beta
refresh ; Процедура сканирования индикации.
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9