1.4.2 Программа PIC-контроллерного устройства измерения временных велечин сигналов
Начальная инициализация
STARTclrf 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 ; Коррекция значений десятичных регистров.
; Вычисление порядка значения индикации.
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 ; Процедура сканирования индикации.
movf Dig_x, W ; Значение единиц для индикации.
call segment ; Преобразование DEC в семисегментный код.
movwf portb ; Вывод цифры на индикатор.
bcf porta, 0 ; Активизировать индикатор.
call Delay ; Задержка времени для сканирования.
bsf porta, 0 ; Отключить индикатор.
movf Dig_y, W ; Значение десятых для индикации.
movwf Dig_y
movwf Dig_z
movwf Dig_exp
return
report ; Коррекция значений десятичных регистров.
movlw 05 ; Установить счетчик разрядов,
movwf cnt_r movlw U ; Загрузить адрес строки десятичных разрядов для косвенной адресации.
movwf fsr
loop_rep
clrf i ; Очистить поправку следующего разряда.
movf indf, W
movwf N ; Загрузить значение во временный регистр.
calc_rep
movf N, W
movwf indf ; Сохранить значение.
incf i, f ; Инкремент поправки следующего разряда.
movlw 0А
subwf N, f ; Вычесть 10.
btfsc status, 0 ; Результат отрицательный?
goto calc_rep ; Нет, продолжить коррекцию.
decf i, f ; Скорректировать поправку следующего разряда.
incf fsr, f
movf i, W
addwf indf, f ; Прибавить поправку к следующему
разряду.
decfsz cnt_r, f ; Все разряды скорректированы?
goto loop_rep ; Нет, продолжить коррекцию.
return
sessn ; Преобразование значения двоичного разряда в десятичное.
movf N, W ; Загрузить номер разряда.
call tab_dec ; Получить смещения в таблице для разряда.
movwf E
call tab_dec ; Получить значение десятков тысяч.
addwf DM, f
incf E, f
movf E, W
call tab_dec ; Получить значение единиц тысяч.
addwf M, f
incf E, f
movf E, W
call tab_dec ; Получить значение сотен.
addwf H, f
incf E,f
movf E, W
call tab_dec ; Получить значение десятков.
addwf D, f
incf E, f
movf E, W
call tab_dec ; Получить значение единиц.
addwf U, f
return
END
... информации о количестве полученной потребителем или выработанной производителем тепловой энергии, температуре, давлении, объеме (массе) теплоносителя и о времени работы в открытых и закрытых водяных системах теплоснабжения при давлениях до 1,6 МПА (16 кгсм2) и температурах до +150 °С. Область применения - теплоэнергетика, системы коммерческого учета расхода горячей воды и тепловой энергии, ...
... САПР Accel Eda (Рис. 5). Рис.5. Принципиальная схема электронного термометра в Accel EDA. Принципиальная схема электронного термометра приведена в Приложении Б. Выбор элементной базы основан на выборе элементов согласующихся с микроконтроллером. Основными элементами схемы являются термодатчики, которые хорошо согласуются с микроконтроллером. Термодатчики DS1820 имеют следующие технические ...
... перевернутый утюг или электроплитку. Плата погружается в расплав, а затем вынимается с одновременным удалением излишков припоя ракелем из твердой резины. 8 Смета затрат на устройство ввода аналоговой информации 8.1 Материалы и комплектующие В таблице 2 показаны затраты на приобретение материалов и комплектующих [10]. Таблица 2 Наименование Кол. Цена, руб. Сумма, руб. ...
... руб. Изготовление печ.платы 2 0,9 15,85 14,27 1,43 15,70 Сборка 4 1,18 20,19 23,82 2,38 26,20 Монтаж 4 2,46 20,19 49,67 4,96 54,63 Наладка 5 0,8 21,20 16,96 1,70 18,66 ИТОГО: 104,72 10,47 115,19 Таблица 4 Плановая канкуляция для зарядного устройства на микроконтроллере PIC12F675 Статьи затрат Сумма затрат (руб.) Обоснование Расчета 1.Сырье и ...
0 комментариев