Смекни!
smekni.com

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

Биты 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-контроллерного устройства измерения временных велечин сигналов

Начальная инициализация

START

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.