Дипломная работа: Разработка PIC-контроллера устройства измерения временных величин сигналов
Мнемокод |
Название команды |
CALL k |
Вызов подпрограммы |
CLRWDT |
Сброс Watchdog таймера |
GOTO k |
Переход по адресу |
RETLW k |
Возврат из подпрограммы с
загрузкой константы в W |
RETFIE |
Возврат из прерывания |
RETURN |
Возврат из подпрограммы |
SLEEP |
Переход в режим SLEEP |
1.4.2 Программа PIC-контроллерного
устройства измерения временных велечин сигналов
Начальная инициализация
START
clrf port а ; Обнулить порт А.
clrf portb ; Обнулить
порт В.
bsf status,5 ; Обращение к банку 1.
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
bsf status, 5 ; Обращение к
банку 1.
clrf trisb ;
Заблокировать прохождение внешних тактов
на
вход таймера, RBO выход.
bcf status, 5 ; Обращение к
банку 0.
call prescaler ; Считать накопленное
значение таймера.
movf H_byte, f
btfss status,2 ; Старший байт
значения таймера = 0?
goto call_ms ; Нет, переход на обработку.
btfsc L_byte,7 ; Старший разряд младшего байта
значения=0?
goto call_ms ; Нет, переход на обработку.
clrf tmr0 ;
Сброс таймера.
bsf status,5 ; Обращение к банку 1.
movlw 01 ; Разрешить
прохождение внешних тактов на
вход.
movwf trisb ; таймера, RBO вход.
bcf status,5 ; Обращение к банку 0.
nор ;
0.5 с ожидания для измерения низкочастотных сигналов.
nор
movlw 0A ; Установить счетчик циклов индикации.
movwf cnt_r
loopr call refresh ; Вывод на индикацию.
decfsz cnt_r, f
goto loopr
nор
nор
nор
bsf status,5 ; Обращение к банку 1.
clrf trisb ;
Заблокировать прохождение внешних тактов
на
вход таймера, RBO выход.
bcf status,5 ; Обращение к банку 0.
call prescaler ; Считать
накопленное значение таймера.
movf H_byte, f
btfss status,2 ; Старший байт
значения таймера = 0?
goto cal05 ; Нет, переход
на обработку.
btfsc L_byte,7 ; Старший разряд младшего байта
значения=0?
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 ;
Значение сотых для индикации.
call segment ; Преобразование DEC в семисегментный код.
movwf portb ; Вывод цифры на индикатор.
bcf porta,2 ; Активизировать
индикатор.
call Delay ;
Задержка времени для сканирования.
bsf porta,2 ; Отключить индикатор.
movf Dig_exp, W ;
Значение порядка результата для индикации.
call segment ; Преобразование DEC в семисегментный код.
movwf portb ; Вывод цифры на индикатор.
bcf porta,3 ; Активизировать
индикатор.
call Delay ;
Задержка времени для сканирования.
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
return
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 ; Коррекция
значений десятичных регистров.
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 |