Рефераты. Разработка PIC-контроллера устройства измерения временных величин сигналов

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                       ; Коррекция значений десятичных регистров.

; Вычисление порядка значения индикации.

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 fsr

movf indf, W

movwf Dig_x                                    ; Переслать значение X.

decf fsr, f

movf indf, W

movwf Dig_y                                    ; Переслать значение Y.

decf fsr, f

movf indf, W

movwf Dig_z                                    ; Переслать значение Z.

return

Ошибка - обнулить значение индикации.

err               movlw 0

movwf Dig_x

clrf N

call calc                                            ; Вычисление значения для индикации.

movlw 0A                                         ; Загрузить счетчик циклов индикации.

movwf cnt_r

goto loop1            ; Переход на начало основного цикла.

Обработка измерения низкочастотных сигналов.

саl05           clrf U                    ; Очистка десятичных регистров.

clrf D clrf H

clrf M

clrf DM

clrf CM

movlw .17                                         ; Установить счетчик разрядов.

movwfN

btfsc H_byte,7               ; Старший разряд значения таймера =1?

call sessn                                          ; Да, загрузить в десятичные регистры

                                                        216=65536.

bcf status, 0

rlf L_byte, f          ; Коррекция значения таймера до 1с.

rlf H_byte, f

clrf Dig_exp                   ; Коррекция порядка результата для

низкочастотных сигналов.

clrf N

call calc                          ; Вычисление значения для индикации.

goto loop5            ; Переход на начало основного цикла.

Delay                                                ; Подпрограмма задержки времени для

                                                        сканирования индикации.

movlw .10

movwf cnt 1

nор

beta             movlw .248

movwf cnt2

clrwdt                            ; Сброс сторожевого таймера.

Alfa             nор

nор

decfsz cnt2, f

goto alfa

nор

nор

decfsz cntl, f

goto beta

nор

return

refresh                                              ; Процедура сканирования индикации.

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9



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