- •1.1 Цель работы
- •1.2 Общие сведения
- •1.3 Области применения
- •1.4 Номенклатура микроконтроллеров семейства pic16f8хх
- •1.5 Технические характеристики микроконтроллера pic16f877
- •1.6 Архитектура микроконтроллера pic16f877
- •1.7 Основные регистры специального назначения
- •1.7.1 Регистр status
- •1.7.2 Регистр option_reg
- •1.7.3 Регистр intcon
- •1.7.4 Регистр pie1
- •1.7.5 Регистр pir1
- •1.7.6 Регистр pie2
- •1.7.7 Регистр pir2
- •1.7.8 Регистр pcon
- •1.7.9 Регистры pclath и pcl
- •1.7.10 Вычисляемый переход
- •1.7.11 Стек
- •1.7.12 Страницы памяти программ
- •1.7.13 Косвенная адресация, регистры indf и fsr
- •1.8 Порты ввода/вывода
- •1.8.1 Регистры portа и trisa
- •1.8.2 Регистры portb и trisb
- •1.8.3 Регистры portc и trisc
- •1.8.4 Регистры portd и trisd
- •1.8.5 Регистры porte и trise
- •1.9 Eeprom память данных и flash память программ
- •1.9.1 Регистры eecon1, eecon2
- •1.9.2 Чтение из eeprom памяти данных
- •1.9.3 Запись в eeprom память данных
- •1.10 Модуль таймера tmr0
- •1.10.1 Прерывания от tmr0
- •1.10.2 Использование внешнего источника тактового сигнала для tmr0
- •1.10.3 Предделитель
- •1.11 Модуль таймера tmr1
- •1.11.1 Работа tmr1 в режиме таймера
- •1.11.2 Работа tmr1 в режиме счетчика
- •1.11.3 Работа tmr1 в режиме синхронного счетчика
- •1.11.4 Работа tmr1 в режиме асинхронного счетчика
- •1.11.5 Чтение/запись tmr1 в асинхронном режиме
- •1.11.6 Генератор tmr1
- •1.11.7 Сброс tmr1 триггером модуля сср
- •1.11.8 Сброс регистров tmr1 (tmr1h, tmr1l)
- •1.11.9 Предделитель tmr1
- •1.12 Прерывания
- •1.12.1 Внешнее прерывание с входа rb0/int
- •1.12.2 Прерывание по переполнению tmr0
- •1.12.3 Прерывание по изменению уровня сигнала на входах rb7:rb4
- •1.13 Система команд
1.12.1 Внешнее прерывание с входа rb0/int
Внешнее прерывание с входа RB0/INT происходит: по переднему фронту сигнала, если бит INTEDG (OPTION_REG<6>) установлен в '1'; по заднему фронту сигнала, если бит INTEDG сброшен в '0'. Когда активный фронт сигнала появляется на входе RB0/INT бит INTF (INTCON<1>) устанавливается в '1'. Прерывание может быть запрещено сбросом бита INTE (INTCON<4>) в '0'. Флаг прерывания INTF должен быть сброшен программно в подпрограмме обработки прерываний. Прерывание INT может вывести микроконтроллер из режима SLEEP, если бит INTE=1 до перехода в режим SLEEP. Состояние бита GIE определяет, переходить на подпрограмму обработки прерываний после выхода из режима SLEEP.
1.12.2 Прерывание по переполнению tmr0
Переполнение таймера TMR0 (FFh → 00h) устанавливает флаг T0IF (INTCON<2>) в '1'. Прерывание от TMR0 можно разрешить/запретить установкой/сбросом бита T0IE(INTCON<5>). Описание работы модуля TMR0 смотрите в разделе 1.10.
1.12.3 Прерывание по изменению уровня сигнала на входах rb7:rb4
Изменение уровня сигнала на входах RB7÷RB4 вызывает установку флага RBIF(INTCON<0>). Прерывание можно разрешить или запретить установкой или сбросом бита RBIE(INTCON<4>). Описание работы PORTB смотрите в разделе 1.8.2.
Пример работы обработки прерываний смотри в разделе 3.8, Лабораторная работа № 8.
1.13 Система команд
Каждая команда микроконтроллеров PIC16F87X состоит из одного 14-разрядного слова, разделенного на код операции (OPCODE), определяющий тип команды и один или несколько операндов, определяющие операцию команды. Полный список команд смотрите в таблице 1.18. Команды разделены на следующие группы:
байт ориентированные команды;
бит ориентированные команды;
команды управления и операций с константами.
Описание полей кода операции смотрите в таблице 1.17.
Все команды микроконтроллера PIC16F877 выполняются за один машинный цикл, кроме команд условия, в которых получен истинный результат и инструкций изменяющих значение счетчика команд PC. В случае выполнения команды за два машинных цикла, во втором цикле выполняется инструкция NOP. Один машинный цикл состоит из четырех тактов генератора. Для тактового генератора с частотой 20 МГц все команды выполняются за 200 нс. Если результат проверки условия истинен или изменяется счетчик команд PC в результате выполнения команд переходов(GOTO, RETURN и др.), то время выполнения команды равно 400 нс.
Основным языком программирования для микроконтроллеров является ассемблер, для компиляции исходного текста программы на языке ассемблер для PIC-микроконтроллеров используется инструмент MPASM входящий в интегрированную среду разработки MPLAB. Подробнее описание среды разработки MPLAB смотрите в разделе 2.
Мнемоника команд, поддерживаемая ассемблером MPASM, показана в таблице 1.17. На рисунке 1.3 показан формат команд трех основных групп.
Байтовые операции |
|||||||||||||
Бит 13 |
Бит 12 |
Бит 11 |
Бит 10 |
Бит 9 |
Бит 8 |
Бит 7 |
Бит 6 |
Бит 5 |
Бит 4 |
Бит 3 |
Бит 2 |
Бит 1 |
Бит 0 |
КОД ОПЕРАЦИИ (OPCODE) |
d |
f (регистр) |
|||||||||||
d = 0 результат в W |
|
|
|
|
|
|
|
|
|||||
d = 1 результат в f |
|
|
|
|
|
|
|
|
|||||
f = 7 - разрядный адрес регистра |
|
|
|
|
|
|
|
|
|||||
Битовые операции |
|||||||||||||
Бит 13 |
Бит 12 |
Бит 11 |
Бит 10 |
Бит 9 |
Бит 8 |
Бит 7 |
Бит 6 |
Бит 5 |
Бит 4 |
Бит 3 |
Бит 2 |
Бит 1 |
Бит 0 |
КОД ОПЕРАЦИИ (OPCODE) |
b (разряда) |
f (регистр) |
|||||||||||
b = 3 - разрядный номер бита |
|
|
|
|
|
|
|
|
|||||
f = 7 - разрядный адрес регистра |
|
|
|
|
|
|
|
|
|||||
Операции с константами |
|||||||||||||
Бит 13 |
Бит 12 |
Бит 11 |
Бит 10 |
Бит 9 |
Бит 8 |
Бит 7 |
Бит 6 |
Бит 5 |
Бит 4 |
Бит 3 |
Бит 2 |
Бит 1 |
Бит 0 |
КОД ОПЕРАЦИИ (OPCODE) |
k (константа) |
||||||||||||
k = 8 - разрядное непосредственное значение |
|
|
|
|
|
|
|
|
|||||
Операции передачи управления (CALL и GOTO) |
|||||||||||||
Бит 13 |
Бит 12 |
Бит 11 |
Бит 10 |
Бит 9 |
Бит 8 |
Бит 7 |
Бит 6 |
Бит 5 |
Бит 4 |
Бит 3 |
Бит 2 |
Бит 1 |
Бит 0 |
КОД ОПЕРАЦИИ |
k (константа) |
||||||||||||
k = 11 - разрядное непосредственное значение |
|
|
|
|
|
|
|
|
|||||
Рисунок 1.4 Форматы команд микроконтроллера PIC16F877
Для байт-ориентированных команд «f» является указателем регистра, а «d» указателем адресата результата. Указатель регистра определяет, какой регистр должен использоваться в команде. Указатель адресата определяет, где будет сохранен результат. Если «d» = 0, результат сохраняется в регистре W. Если «d» =1, результат сохраняется в регистре, который используется в команде.
В бит-ориентированных командах «b» определяет номер бита участвующего в операции, а «f» - указатель регистра, который содержит этот бит.
В командах управления или операциях с константами «k» представляет восьми- или одиннадцатиразрядное число или значения литерала(метки).
Команда микроконтроллера является частью системы команд микроконтроллера, состав которой индивидуален для каждого микроконтроллера. Например, микроконтроллер PIC16F877 имеет систему команд, включающую в себя 35 команд.
Таблица 1.17 Описания полей кода операции
Поле |
Описание |
f |
Адрес регистра (от 0x00h до 0x7Fh) |
W |
Рабочий регистр (аккумулятор) |
b |
Номер бита в 8-разрядном регистре |
k |
Константа (данные или метка) |
x |
Неопределённое значение (0/1). Ассемблер генерирует код х = 0. Рекомендуется для совместимости со всеми инструментальными средствами программного обеспечения. |
d |
Указатель адресата результата операции |
label |
Имя метки |
ТОС |
Вершина стека |
РС |
Счетчик команд |
РСLATH |
Буфер старшего байта счетчика команд |
GIE |
Бит глобального разрешения прерываний |
WDT |
Сторожевой таймер |
ТО |
Флаг переполнения WDT |
PD |
Флаг сброса по включению питания |
dest |
Приемник результата операции, регистр W или регистр памяти |
[ ] |
Дополнительные параметры (опции) |
( ) |
Содержимое |
|
Присвоение |
< > |
Битовое поле (указатель разряда) |
|
Из набора (множества) |
В описание команд входит: расшифровка команды, перевод расшифровки, синтаксис команды (ее написание в языке ассемблера), операнды (какие значения они могут принимать), операция (символьное представление выполняемой команды), биты состояния (какие биты изменяются в регистре специального назначения STATUS, в результате выполнения команды), описание (подробное описание действий, производимых командой).
Таблица 1.18 Мнемоника команд микроконтроллера PIC16F877
Мнемоника команды |
Описание |
Циклов |
Флаги |
|
Байт – ориентированные команды |
||||
ADDWF |
f, d |
Сложение W и f |
1 |
C,DC,Z |
ADDWF |
f, W |
(f) + (W) (W) |
|
|
ADDWF |
f, F |
(f) + (W) (f) |
|
|
ANDWF |
f, d |
Побитное «И» W и f |
1 |
Z |
ANDWF |
f, W |
(f) and (W) (W) |
|
|
ANDWF |
f, F |
(f) and (W) (f) |
|
|
CLRF |
f |
Очистить f (00hf) |
1 |
Z |
CLRW |
– |
Очистить W(00h W) |
1 |
Z |
COMF |
f, d |
Инвертировать f |
1 |
Z |
COMF |
f, W |
not (f) (W) |
|
|
COMF |
f, F |
not (f) (f) |
|
|
DECF |
f, d |
Вычесть 1 из f |
1 |
Z |
DECF |
f, W |
(f) - 1 (W) |
|
|
DECF |
f, F |
(f) – 1 (f) |
|
|
DECFSZ |
f, d |
Вычесть 1 из f и пропустить если 0 |
1(2) |
Z |
DECFSZ |
f, W |
(f) - 1 (W) / If (W) = 0 then NOP |
|
|
DECFSZ |
f, F |
(f) – 1 (f) / If (f) = 0 then NOP |
|
|
INCF |
f, d |
Прибавить 1 к f |
1 |
Z |
INCF |
f, W |
(f) + 1 (W) |
|
|
INCF |
f, F |
(f) + 1 (f) |
|
|
INCFSZ |
f, d |
Прибавить 1 к f и пропустить если 0 |
1(2) |
Z |
INCFSZ |
f, W |
(f) + 1 (W) / If (W) = 0 then NOP |
|
|
INCFSZ |
f, F |
(f) + 1 (f) / If (f) = 0 then NOP |
|
|
IORWF |
f, d |
Побитное «ИЛИ» W и f |
1 |
Z |
IORWF |
f, W |
(f) or (W) (W) |
|
|
IORWF |
f, F |
(f) or (W) (f) |
|
|
MOVF |
f, d |
Переслать f |
1 |
Z |
MOVF |
f, W |
(f) (W) |
|
|
MOVF |
f, F |
(f) (f) |
|
|
MOVWF |
f |
Переслать W в f |
1 |
– |
NOP |
– |
Нет операции |
1 |
|
RLF |
f, d |
Циклический сдвиг f влево через перенос |
1 |
C |
RLF |
f, W |
(C)← f (7)← f (6) ←… f (0) ←(C) / (f) (W) |
|
|
RLF |
f, F |
(C)← f (7)← f (6) ←… f (0) ←(C) / (f) (f) |
|
|
RRF |
f, d |
Циклический сдвиг f вправо ч/з перенос |
1 |
C |
RRF |
f, W |
(C) f (7) f (6) … f (0) (C) / (f) (W) |
|
|
RRF |
f, F |
(C) f (7) f (6) … f (0) (C) / (f) (f) |
|
|
SUBWF |
f, d |
Вычесть W из f |
1 |
C,DC,Z |
SUBWF |
f, W |
(f) - (W) (W) |
|
|
SUBWF |
f, F |
(f) - (W) (f) |
|
|
SWAPF |
f, d |
Поменять местами полубайты в регистре f |
1 |
– |
SWAPF |
f, W |
f (7÷4) f (3÷0) (W) |
|
|
SWAPF |
f, F |
f (7÷4) f (3÷0) (f) |
|
|
XORWF |
f, d |
Побитное «исключающее ИЛИ» W и f |
1 |
Z |
XORWF |
f, W |
(f) xor (W) (W) |
|
|
XORWF |
f, F |
(f) xor (W) (f) |
|
|
Продолжение таблицы 1.18
Бит – ориентированные команды |
||||
BCF |
f, b |
Очистить бит b в регистре f / 0F(b) |
1 |
– |
BSF |
f, b |
Установить бит b в регистре f / 1F(b) |
1 |
– |
BTFSC |
f, b |
Если F(b) = 0 то пропустить |
1(2) |
– |
BTFSS |
f, b |
Если F(b) = 1 то пропустить |
1(2) |
– |
Команды управления и операции с константами |
||||
ADDLW |
k |
Сложить константу с W |
1 |
C,DC,Z |
|
|
(W) + (k) (W) |
|
|
ANDLW |
k |
Побитное «И» константы и W |
1 |
Z |
|
|
(W) and (k) (W) |
|
|
CALL |
k |
Вызов подпрограммы |
2 |
– |
|
|
PC+1TOS / kPC(10÷0) / PCLATH(4,3) PC(12,11) |
|
|
CLRWDT |
– |
Очистить WDT / (00hWDT) |
1 |
-TO, -PD |
GOTO |
k |
Безусловный переход |
2 |
– |
|
|
kPC(10÷0) / PCLATH(4,3) PC(12,11) |
|
|
IORLW |
k |
Побитное «ИЛИ» константы и W |
1 |
Z |
|
|
(W) or (k) (W) |
|
|
MOVLW |
k |
Переслать константу в W / (k) (W) |
1 |
– |
RETFIE |
– |
Возврат из п/п с разрешением прерываний |
2 |
– |
|
|
TOSPC / 1GIE |
|
|
RETLW |
k |
Возврат из п/п с загрузкой константы в W |
2 |
– |
|
|
TOSPC /(k) (W) |
|
|
RETURN |
– |
Возврат из п/п / TOSPC |
2 |
– |
SLEEP |
– |
Перейти в режим SLEEP |
1 |
-TO, -PD |
|
|
00hWDT / 0 предделитель WDT, PD / 1TO |
|
|
SUBLW |
k |
Вычесть W из константы / k - (W) (W) |
1 |
C,DC,Z |
XORLW |
k |
Побитное «исключающее ИЛИ» k и W |
1 |
Z |
|
|
(k) xor (W) (W) |
|
|
