Система команд микроконтроллер.
Каждая команда микроконтроллера состоит из одного 14-разрядного слова разделенного на:
· код операции, определяющий тип команды
· один или несколько операндов, определяющие операцию команды.
Полный список команд смотрите в таблице 2. Команды разделены на следующие группы:
· байтовые команды;
· битовые команды;
· команды управления и операций с константами.
На рисунке 5 показан формат команд трех основных групп.
Для байт ориентированных команд:
· 'f ' является указателем регистра и определяет - какой регистр должен использоваться в команде;
· 'd' указателем адресата результата и определяет, где будет сохранен результат.
Если 'd'=0, результат сохраняется в регистре W.
Если 'd'=1, результат сохраняется в регистре, который используется в команде.
В бит ориентированных командах:
· 'b' определяет номер бита участвующего в операции;
· 'f ' - указатель регистра, который содержит этот бит.
В командах управления или операциях с константами:
· 'k' представляет восемь или одиннадцать бит константы.
|
|
Рис. 5. Формат команд.
Все команды выполняются за один машинный цикл, кроме команд условия, в которых замещается значение программного счетчика. В случае выполнения команды за два машинных цикла, во втором цикле выполняется инструкция NOP. Один машинный цикл состоит из четырех тактов генератора. Для тактового генератора с частотой 4 МГц команда выполняется за 2 мкс.
Таблица 2. Команды микроконтроллера PIC16F877.
Мнемоника | Операция | Циклы | Код команды | Флажки | Примечание | ||
команды | |||||||
БАЙТОВЫЕ КОМАНДЫ | |||||||
ADDWF f, d | Сложение (W + f->d) | 1 | 00 0111 dfff ffff | C.DC.Z | 1,2 | ||
ANDWF f, d | Логическое "И" (W and f — > d) | 1 | 00 0101 dfff ffff | Z | 1,2 | ||
CLRF f | Обнулить f | 1 | 00 0001 1fff ffff | Z | 2 | ||
CLRW - | Обнулить W | 1 | 00 0001 0xxx xxxx | Z | |||
COMF f, d | Дополнение f (Логическое "НЕ") | 1 | 00 1001 dfff ffff | Z | 1,2 | ||
DECF f, d | Декремент f | | 1 | 00 0011 dfff ffff | Z | 1,2 | ||
DECFSZ f, d | Декремент f, пропуск если "0" | 1(2) | 00 1011 dfff ffff | 1,2,3 | |||
INCF f, d | Инкремент f | 1 | 00 1010 dfff ffff | Z | 1,2 | ||
INCFSZ f, d | Инкремент f, пропуск если "0" | 1(2) | 00 1111 dfff ffff | 1,2,3 | |||
IORWF f, d | Логическое "ИЛИ" (W or f-> d) | 1 | 00 0100 dfff ffff | Z | 1,2 | ||
MOVF f, d | Пересылка (f — > W) | 1 | 00 1000 dfff ffff | Z | 1,2 | ||
MOVWF f | Пересылка (W — >f) | 1 | 00 0000 1fff ffff | ||||
NOP | Пустая операция | 1 | 00 0000 0xx0 0000 | ||||
RLF f, d | Сдвиг влево через перенос | 1 | 00 1101 dfff ffff | С | 1,2 | ||
RRF f, d | Сдвиг вправо через перенос | 1 | 00 1100 dfff ffff | C | 1, 2 | ||
SUBWF f, d | Вычитание (f - W -> d) | 1 | 00 0010 dfff ffff | C,DC,Z | 1, 2 | ||
SWAPF f, d | Обменять полубайты f | 1 | 00 1110 dfff ffff | 1,2 | |||
XOFWF f, d | Исключающее "ИЛИ" (W or f-> d) | 1 | 00 0110 dfff ffff | Z | 1,2 | ||
БИТОВЫЕ КОМАНДЫ | |||||||
BCF f. b | Обнулить бит b в f | 1 | 01 00bb bfff ffff | 1,2 | |||
BSF f, b | Установить бит b в f | 1 | 01 0lbb bfff ffff | 1,2 | |||
BTFSC f, b | Тест бита b в f, пропуск если "0" | 1(2) | 01 l0bb bfff ffff | 3 | |||
BTFSS f, b | Тест бита b в f пропуск если "1" | 1(2) | 01 11bb bfff ffff | 3 | |||
КОМАНДЫ С КОНСТАНТАМИ И КОМАНДЫ УПРАВЛЕНИЯ
| |||||||
ADDLW к | Сложение (k + W — > W) | 1 | 11 111x kkkk kkkk | C,DC,Z | |||
ANDLW к | Логическое "И" (k and W -> W) | 1 | 11 1001 kkkk kkkk | Z | |||
CALL k | Вызов подпрограммы k | 2 | 10 0kkk kkkk kkkk | ||||
CLRWDT - | Обнулить WDT | 1 | 00 0000 0110 0100 | TO,PD | |||
GOTO k | Переход к адресу k | 2 | 10 1kkk kkkk kkkk | ||||
IORLW k | Логическое "ИЛИ" (К or W -> W) | 1 | 11 1000 kkkk kkkk | Z | |||
MOVLW k | Пересылка (k — > W) | 1 | 11 00xx kkkk kkkk | ||||
RETFIE - | Возврат из прерывания | 2 | 00 0000 0000 1001 | ||||
RETLW k | Возврат с константой | 2 | 11 01xx kkkk kkkk | ||||
RETURN - | Возврат из подпрограммы | 2 | 00 0000 0000 1000 | ||||
SLEEP - | Останов | 1 | 00 0000 0110 0011 | TO,PD | |||
SUBLW k | Вычитание (k - W -> W) | 1 | 11 110х kkkk kkkk | C,DC,Z | |||
XORLW k | Исключающее "ИЛИ" (k or W->W) | 1 | 11 1010 kkkk kkkk | Z |
Примечание
1: Если регистр ввода/вывода изменяется, то исходным значением будет величина, считанная
непосредственно с контактов.
2: Если команда модифицирует регистр TMR0, то предделитель будет обнулен.
3: Если в счетчик программ записывается адрес (т.е. условие проверки «истина»), то команда
выполняется за два цикла. Второй цикл выполняется как команда NOP.
Рекомендуемая структура программы
для микроконтроллера PIC16F877
list p=16f877 ; директива определения процессора
#include <p16f877.inc> ; подключение списока определений переменных
;процессора
__CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _RC_OSC & _WRT_ENABLE_ON & _LVP_ON & _DEBUG_OFF & _CPD_OFF
; '__CONFIG' - директива определения битов конфигурации процессора
;***** определение переменных
w_temp EQU 0x70 ; переменная для сохранения текущего состояния при
;обработке прерывания
status_temp EQU ; переменная для сохранения текущего состояния при
;обработке прерывания
;**********************************************************************
ORG 0x000 ; размещение команд по адресу сброса процессора
clrf PCLATH ; очистка старших бит счетчика команд
goto main ; переход на основную программу
ORG 0x004 ; размещение команд по вектору прерывания
;процессора
movwf w_temp ; сохранение текущего значения регистра W
movf STATUS,w ; сохранение текущего значения регистра
;STATUS
movwf status_temp
; прерывающая программа
movf status_temp,w; восстановление значения регистра STATUS
movwf STATUS
swapf w_temp,f
swapf w_temp,w ; восстановление значения регистра Ц
retfie ; возврат в основную программу
main
; основная программа
END ; директива конца программы