Биты PSA и PS2-PS0 определяют подключение предделителя и коэффициент деления. Когда предделитель подключен к TMR0, любая команда записи в TMR0 будет очищать предделитель. Когда предделитель подключен к WDT, команда CLRWDT очистит предделитель вместе с WDT. Предделитеяь недоступен для чтения или записи. При сбросе предделитель также очищается.
Управление подключением предделителя полностью программное, т.е. можно его переключить во время выполнения программы.
1.4 Разработка программного обеспечения
1.4.1 Обзор команд
Каждая команда PIC16F84 - это 14-битовое слово, которое разделено по смыслу на следующие части:
1. Код операции,
2. Поле для одного и более операндов, которые могут участвовать или нет в этой команде.
Система команд PIC16F84 включает в себя байт-ориентированные команды, бит-ориентированные, операции с константами и команды передачи управления. В таблицах 1.3, 1.4 и 1.5 представлены команды микроконтроллера PIC16F84.
Для байт-ориентированных команд "f" обозначает собой регистр, с которым производится действие; "d" - бит определяет, куда положить результат. Если
"d" = 0, то результат будет помещен в W регистр, при "d" = 1 результат будет помещен в "f", упомянутом в команде, в отличии от бит-ориентированных команд, в которых "b" обозначает номер бита, участвующего в команде, а "f" - это регистр , в котором этот бит расположен.
Для команд передачи управления и опреаций с константами, "k" обозначает восьми или одинадцатибитную константу.
Все команды выполняются в течение одного командного цикла. В двух случаях исполнение команды занимает два командных цикла:
1. Проверка условия и переход,
2. Изменение программного счетчика как результат выполнения команды.
Один командный цикл состоит из четырех периодов генератора. Таким о разом, для генератора с частотой 4 МГц время исполнения командного цикла будет 1 мкс.
Таблица 1.3 — Бит ориентированные команды
Мнемокод | Название команды |
BCF f,b | Сброс бита в регистре f |
BSF f,b | Установка бита в регистре f |
BTFSC f,b | Пропустить команду, если бит = 0 |
BTFSSf,b | Пропустить команду, если бит = 1 |
Таблица 1.4 — Байт ориентированные команды
Мнемокод | Название команды |
ADDWF f,d | Сложение W с f |
ANDWF f,d | Логическое И W и f |
CLRF f | Сброс регистра f |
CLRW | Сброс регистра W |
COMF f,d | Инверсия регистра f |
DECF f,d | Декремент регистра f |
DECFSZ f,d | Декремент f, пропустить команду, если 0 |
INCF f,d | Инкремент регистра f |
INCFSZ f,d | Инкремент f, пропустить команду, если 0 |
IORWF f,d | Логическое ИЛИ W и f |
MOVF f,d | Пересылка регистра f |
MOVWF f | Пересылка W в f |
NOP | Холостая команда |
RLF f,d | Сдвиг f влево через перенос |
RRF f,d | Сдвиг f вправо через перенос |
SUBWF f,d | Вычитание W из f |
SWAPF f,d | Обмен местами тетрад в f |
XORWF f,d | Исключающее ИЛИ W и f |
ADDLW k | Сложение константы с W |
ANDLW k | Логическое И константы и W |
IORLW k | Логическое ИЛИ константы и W |
SUBLW k | Вычитание W из константы |
MOVLW k | Пересылка константы в W |
XORLW k | Исключающее ИЛИ константы и W |
OPTION | Загрузка W в OPTION регистр |
TRIS f | Загрузка TRIS регистра |
Таблица 1.5 — Команды переходов
Мнемокод | Название команды |
CALLk | Вызов подпрограммы |
CLRWDT | Сброс Watchdog таймера |
GOTOk | Переход по адресу |
RETLWk | Возврат из подпрограммы с загрузкой константы в W |
RETFIE | Возврат из прерывания |
RETURN | Возврат из подпрограммы |
SLEEP | Переход в режим SLEEP |
1.4.2 Программа PIC-контроллерного устройства измерения временных велечин сигналов
Начальная инициализация
clrfport а ; Обнулить порт А.
clrfportb ; Обнулить порт В.
bsfstatus,5 ; Обращение к банку 1.
movlw27 ; Синхронизация таймера 0 по заднему фронту
внешних тактов, включение таймера.
movwfoption_reg
movlw10
movwftrisa ; RAO - RA3 выходы, RA4 вход.
clrf trisb ; RBO - RB7 выходы.
bcfstatus, 5 ; Обращение к банку 0.
movlw 08 ; Для контроля дисплея
movwfDig_x ; Загрузить во все регистры индикации 8.
MovwfDig_y
movwfDig_z
movwfDig_exp
Основной цикл программы
movlw0A ; Установить счетчик циклов индикации.
movwfcnt_r
loop1 callrefresh ; Вывод на индиторы.
decfsz cnt_r, f
goto loop1
loop5 clrf tmr0 ; Сбростаймера.
bsfstatus, 5 ; Обращение к банку 1.
movlw0001 ; Разрешить прохождение внешних тактов на
вход таймера, RBO вход.
movwftrisb
bcfstatus,5 ; Обращение к банку 0.
movlw.199 ; 1 мс ожидания для измерения
высокочастотных сигналов.
movwf cnt1
in_ms nор
clrwdt
decfsz cntl, f
goto in_ms
bsfstatus, 5 ; Обращение к банку 1.
clrftrisb ; Заблокировать прохождение внешних тактов
на вход таймера, RBO выход.
bcfstatus, 5 ; Обращение к банку 0.
callprescaler ; Считать накопленное значение таймера.
movfH_byte, f
btfssstatus,2 ; Старший байт значения таймера = 0?
gotocall_ms ; Нет, переход на обработку.
btfscL_byte,7 ; Старший разряд младшего байта значения=0?
gotocall_ms ; Нет, переход на обработку.
clrftmr0 ; Сброс таймера.
bsfstatus,5 ; Обращение к банку 1.
movlw01 ; Разрешить прохождение внешних тактов на
вход.
movwftrisb ; таймера, RBO вход.
bcfstatus,5 ; Обращение к банку 0.
nор ; 0.5 с ожидания для измерения низкочастотных сигналов.
nор
movlw0A ; Установить счетчик циклов индикации.
movwfcnt_r
looprcallrefresh ; Вывод на индикацию.
decfsz cnt_r, f
goto loopr
nор
nор
nор
bsfstatus,5 ; Обращение к банку 1.
clrftrisb ; Заблокировать прохождение внешних тактов
на вход таймера, RBO выход.
bcfstatus,5 ; Обращение к банку 0.
callprescaler ; Считать накопленное значение таймера.
movfH_byte, f
btfssstatus,2 ; Старший байт значения таймера = 0?
gotocal05 ; Нет, переход на обработку.
btfscL_byte,7 ; Старший разряд младшего байта значения=0?
gotocal05 ; Нет, переход на обработку.
clrfDigx ; Да, обнулить текущее значение индикации.
clrf Dig_y
clrf Dig_z
clrfDig_exp
gotoloop5 ; Переход на начало основного цикла.
Обработка измерения высокочастотных сигналов.
call_msclrfU ; Очистка десятичных регистров.
clrf D clrf H
clrf M
clrfDM
clrfCM
movlw03 ; Коррекция порядка результата для
высокочастотных сигналов.
movwfDig_exp
callsegment ; Преобразование DEC в семисегментный код.
movwfportb ; Вывод цифры на индикатор.
bcfporta,1 ; Активизировать индикатор.
callDelay ; Задержка времени для сканирования.
bsfporta, 1 ; Отключить индикатор.
movfDig_z, W ; Значение сотых для индикации.
callsegment ; Преобразование DEC в семисегментный код.
movwfportb ; Вывод цифры на индикатор.
bcfporta,2 ; Активизировать индикатор.
callDelay ; Задержка времени для сканирования.
bsfporta,2 ; Отключить индикатор.
movfDig_exp, W ; Значение порядка результата для индикации.
callsegment ; Преобразование DEC в семисегментный код.
movwfportb ; Вывод цифры на индикатор.
bcfporta,3 ; Активизировать индикатор.
callDelay ; Задержка времени для сканирования.
bsfporta, 3 ; Отключить индикатор.
return
prescaler ; Считать накопленное значение таймера.
movftmr0, W
movwfH_byte ; Сохранить значение таймера 0.
Извлечение значения предделителя TMR00.
clrfN ; Обнулить счетчик.
ciclbcfportb,0 ; Сформировать тактовый импульс на входе
синхронизации таймера.
bsfportb,0
bcfportb,0
incfN, f ; Инкремент счетчика.
movfH_byte, W
xonvftmrO, W ; Значение таймера 0 изменилось? btfscstatus,2
gotocicl ; Нет, повторить цикл.
movlw 00FF
movwf L_byte
movf N, W
subwfL_byte, f ; Получить и сохранить значение
предделителя.
incf L_byte, f
return
calc ; Преобразование формата: HEX в DEC.
movlw.16 ; Установить счетчик разрядов.
movwfN
coder
rlfL_byte, f ; Сдвиг старшего разряда значения таймера в
битС.
rlf H_byte, f
btfscstatus,0 ; Бит С = 1?
callsessn ; Да, прибавить десятичное значение разряда к десятичным регистрам.
decfszN, f ; Декремент счетчика разрядов.
gotocoder ; Продолжить преобразование.
callreport ; Коррекция значений десятичных регистров.
; Вычисление порядка значения индикации.
movlw05 ; Установить счетчик разрядов после запятой.
movwfEmovlwCM+1 ; Загрузить адрес строки десятичных разрядов
для косвенной адресации.
movwffsr
calc_ext ; Поиск старшего значащего разряда.
decffsr, f ; Коррекция счетчика разрядов.
movf indf, W
btfss status,2 ; Значение = О?
gotoend_ext ; Нет, закончить поиск.
decfszE, f ; Все разряды проверены?
gotocalc_ext ; Нет, продолжить поиск.
end_ext
movlw 2
subwf E,W
btfssstatus,0 ; Значение порядка < 2? gotoerr ; Да, ошибка - обнулить значение индикации.
btfscstatus,2 ; Значение порядка = 2? gotono_app ; Да, обход округления.
; Округление выходного значения.
addlwU ; Получить адрес отбрасываемого разряда для косвенной адресации.
movwffsr ;
decffsr, fmovlw05 ; Сравнить значение разряда с 5.
subwf indf, W
btfss status,0 ; Значение > 5?
gotono_app ; Нет, обход округления.
incffsr, f
incfindf, f ; Да, инкремент следующего разряда.
no_app
callreport ; Коррекция значений десятичных регистров после округления. movfE,W ; Формирование значения для индикации.
addwfDig_exp, f ; Сохранить значение Е.
addlwU ; Получить адрес строки десятичных разрядов
для косвенной адресации.
movwffsr
movfindf, W
movwfDig_x ; Переслать значение X.
decf fsr, f
movf indf, W
movwfDig_y ; Переслать значение Y.
decf fsr, f
movf indf, W
movwfDig_z ; Переслать значение Z.
return
Ошибка - обнулить значение индикации.
err movlw 0
movwf Dig_x
clrf N
callcalc ; Вычисление значения для индикации.
movlw0A ; Загрузить счетчик циклов индикации.
movwfcnt_r
gotoloop1 ; Переход на начало основного цикла.
Обработка измерения низкочастотных сигналов.
саl05 clrfU ; Очистка десятичных регистров.
clrf D clrf H
clrf M
clrfDM
clrfCM
movlw.17 ; Установить счетчик разрядов.
movwfN
btfscH_byte,7 ; Старший разряд значения таймера =1?
callsessn ; Да, загрузить в десятичные регистры
216=65536.