Методическое пособие 491
.pdfне существует. Он использует регистр выбора FSR для косвенной выборки одного из 64 возможных регистров. Любая команда,
использующая INDF, на самом деле обращается к регистру данных,
на который указывает FSR.
Регистр слова состояния (STATUS) похож на регистр PSW,
существующий в большинстве микропроцессоров. В нем находятся бит переноса, десятичного переноса и нуля, а также биты режима включения и биты страничной адресации.
Регистр таймеpа/счетчика TMR0 может быть записан и считан как и любой другой регистр. TMR0 может увеличиваться по внешнему сигналу, подаваемому на вывод RTCC, или по внутренней частоте, соответствующей частоте команд. Основное применение таймеpа/счетчика – подсчет числа внешних событий и измерение времени. Сигнал от внешнего или внутреннего источника также может быть предварительно поделен при помощи встроенного в PIC
программируемого делителя.
Программный счетчик (PC) используется для генерации последовательности адресов ячеек ПЗУ, содержащих 14-pазpядные команды. PC имеет разрядность 13 бит, что позволяет прямо адресовать 8К ячеек по 14 бит каждая (8K 14). Для PIC16С84 однако,
только 1К ячеек физически доступно. Младшие 8 разрядов PC могут быть записаны и считаны через регистр PCL, старшие 5 разрядов загружаются из регистра PCLATCH, имеющего адрес 0Ah.
Регистр прерываний INTCON (адрес 0Bh) служит для управления режимами прерывания и содержит биты разрешения прерываний от различных источников и флаги прерываний. Регистр режимов OPTION (адрес 81h) служит для задания источников сигнала для предварительного делителя и таймера/счетчика, а также для задания коэффициента деления предварительного делителя,
активного фронта сигнала для RTCC и входа прерывания. Кроме того
19
при помощи регистра OPTION могут быть включены нагрузочные резисторы для разрядов порта B, запрограммированных как входы.
Регистры вода/вывода PORTA, PORTB соответствуют двум портам ввода/вывода, имеющимся у PIC16C84. Порт A имеет 5
разрядов PA4-PA0, которые могут быть индивидуально запрограммированы как входы или выходы при помощи регистра
TRISA, имеющего адрес 85h. Порт B имеет 8 разрядов PortB 7 – PortB 0 и программируется при помощи регистра TRISB, имеющего адрес
86h. Задание единицы в разряде регистра TRIS программирует соответствующий разряд порта как вход. При чтении порта считывается непосредственное состояние вывода, при записи в порт запись происходит в буферный регистр.
3.2.2.2. Регистры общего назначения
Регистры общего назначения представляют собой статическое ОЗУ, расположенное по адресам 0Ch-2Fh. Всего в PIC16C84 можно использовать 36 ячеек ОЗУ. Эти регистры используются для хранения переменных по усмотрению пользователя. В
микроконтроллерах Р1С 16С84 существуют прямая и косвенная адресация всех регистров и ячеек памяти.
Микроконтроллеры Р1С 16С84 имеют ортогональную
(симметричную) систему команд, позволяющую выполнять любую операцию с любым регистром, используя любой метод адресации.
В микроконтроллерах Р1С16С84 имеется 8-разрядное арифметико-логическое устройство (ALU). ALU выполняет сложение, вычитание, сдвиг, битовые и логические операции.
PIC микроконтроллеры способны работать с различными типами тактовых генераторов:
– XT кварцевый резонатор
20
–HS высокочастотный кварцевый резонатор
–LP микропотребляющий кварцевый резонатор
–RC генератор.
Задание типа используемого тактового генератора осуществляется в процессе программирования микросхемы.
Входная тактовая частота, поступающая с вывода
OSC1/CLKIN, внутри делится на четыре и из нее формируются четыре циклические не перекрывающиеся тактовые последовательности Q1, Q2, Q3 и Q4. Счетчик команд увеличивается в такте Q1, команда считывается из памяти программы и защелкивается в регистре команд в такте Q4. Команда декодируется и выполняется в течение последующего цикла в тактах Q1...Q4.
Микроконтроллер PIC16C84 имеет аппаратный стек шириной 13
бит. Область стека не принадлежит ни к программной области, ни к области данных, а указатель стека пользователю недоступен.
Стек поддерживает до 8 уровней вложенности подпрограмм пользователя, включая обработку прерываний. В стеке сохраняется адрес возврата в основную программу. Стек не имеет отображения на память программ и память данных, нельзя записать или прочитать данные из стека. Значение счетчика команд заносится в вершину стека при выполнении инструкций перехода на подпрограмму
(CALL) или обработку прерываний. Чтение из стека и запись в счетчик команд PC происходит при выполнении инструкций возврата из подпрограмм или обработки прерываний (RETURN, RETLW, RETFIE), при этом значение регистра PCLATH не изменяется.
После 8 записей в стек, девятая запись запишется на место первой, а десятая запись заменит вторую и так далее (рис. 13).
Регистры могут быть адресованы прямо или косвенно, с
использованием регистра косвенной адресации FSR.
Непосредственная адресация поддерживается специальными
21
командами, загружающими данные из памяти программы в рабочий регистр WREG. Регистры общего назначения используются для хранения переменных по усмотрению пользователя.
Рис. 13. Пример последовательности записи в стек
3.2.3.Система команд
Вмикроконтроллерах среднего семейства, команда состоит из одного 14-разрядного слова, разделенного на код операции
(OPCODE), определяющий тип команды и один или несколько операндов, определяющих операцию команды.
Систему команд микроконтроллера PIC16С84 можно разделить на три основных группы (табл. 2):
байт ориентированные команды;
бит ориентированные команды;
команды управления и операций с константами.
Для байт ориентированных команд f является указателем регистра, а d указателем адресата результата. Указатель регистра определяет, какой регистр должен использоваться в команде.
Указатель адресата определяет, где будет сохранен результат. Если d = 0, результат сохраняется в регистре WREG. Если d = 1, результат сохраняется в регистре, который используется в команде.
22
Таблица 2
Синтаксис некоторых команд микроконтроллера PIC16С84
Мнемоника |
Описание |
Циклов |
14-разрядный код |
Изм. |
||
команды |
Бит 13 |
Бит 0 |
флаги |
|||
|
|
|||||
1 |
2 |
3 |
4 |
5 |
6 |
|
|
|
|
|
|
|
|
|
Байт ориентированные команды |
|
|
|||
|
|
|
|
|
||
ADDWF f, d |
Сложение WREG и f |
1 |
00 0111 |
dfff ffff |
C, DC, Z |
|
ANDWF f, d |
Побитное 'И' WREG и f |
1 |
00 0101 |
dfff ffff |
Z |
|
CLRW – |
Очистить WREG |
1 |
00 0001 |
0xxx xxxx |
Z |
|
CLRF f |
Очистить f |
1 |
00 0001 |
1fff ffff |
Z |
|
|
|
|
|
|
|
|
COMF f, d |
Инвертировать f |
1 |
00 1001 |
dfff ffff |
Z |
|
DECF f, d |
Вычесть 1 из f |
1 |
00 0011 |
dfff ffff |
Z |
|
|
|
|
|
|
|
|
INCF f, d |
Прибавить 1 к f |
1 |
00 1010 |
dfff ffff |
Z |
|
IORWF f, d |
Побитное 'ИЛИ' WREG и f 1 |
1 |
00 0100 |
dfff ffff |
Z |
|
MOVF f, d |
Переслать f |
1 |
00 1000 |
dfff ffff |
Z |
|
RLF f, d |
Циклический сдвиг f влево |
1 |
00 1101 |
dfff ffff |
С |
|
через перенос |
||||||
|
|
|
|
|
||
|
|
|
|
|
|
|
RRF f, d |
Циклический сдвиг f впра- |
1 |
00 1100 |
dfff ffff |
С |
|
|
во через перенос |
|
|
|
|
|
SUBWF f, d |
Вычесть WREG из f |
1 |
00 0010 |
dfff ffff |
C, DC, Z |
|
SWAPF f, d |
Поменять местами полу- |
1 |
00 1110 |
dfff ffff |
|
|
байты в регистре f |
|
|||||
|
|
|
|
|
||
|
|
|
|
|
|
|
XORWF f, d |
Побитное «исключающее |
1 |
00 0110 |
dfff ffff |
Z |
|
ИЛИ» WREG и f |
||||||
|
|
|
|
|
||
|
|
|
|
|
|
|
|
Команды управления и операций с константами |
|
||||
ADDLW k |
Сложить константу с |
1 |
11 111x |
kkkk kkkk |
C, DC, Z |
|
|
WREG |
|
|
|
|
|
|
|
|
|
|
|
|
ANDLW k |
Побитное И константы и |
1 |
11 1001 |
kkkk kkkk |
Z |
|
WREG |
||||||
|
|
|
|
|
||
|
|
|
|
|
|
|
BTFSC f, b |
Проверить бит b в регистре |
1(2) |
01 10bb |
bfff ffff |
|
|
|
f, пропустить если 0 |
|
|
|
|
|
CALL k |
Вызов подпрограммы |
1 |
10 0kkk |
kkkk kkkk |
|
|
BTFSS f, b |
Проверить бит b в регистре |
1(2) |
01 11bb |
bfff ffff |
|
|
|
f, пропустить если 1 |
|
|
|
|
23
Продолжение табл. 2
1 |
2 |
3 |
|
4 |
5 |
6 |
|
IORLW k |
Побитное ИЛИ константы |
1 |
11 |
1000 |
kkkk kkkk |
Z |
|
и WREG |
|||||||
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
RETFIE |
Возврат из подпрограммы с |
2 |
00 |
0000 |
0000 1001 |
|
|
разрешением прерываний |
|
||||||
|
|
|
|
|
|
|
|
|
Возврат из подпрограммы с |
|
|
|
|
|
|
RETLW k |
загрузкой константы в |
2 |
11 |
01xx |
kkkk kkkk |
|
|
|
WREG |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RETURN |
Возврат из подпрограммы |
2 |
00 |
0000 |
0000 1000 |
|
|
|
|
|
|
|
|
|
|
SUBLW k |
Вычесть W из константы |
1 |
11 |
110x |
kkkk kkkk |
C, DC, Z |
|
XORLW k |
Побитное исключающее |
1 |
11 |
1010 |
kkkk kkkk |
Z |
|
ИЛИ константы и WREG |
|||||||
|
|
|
|
|
|
||
|
|
|
|
|
|
||
|
Бит ориентированные команды |
|
|
||||
|
|
|
|
|
|
|
|
BCF f, b |
Очистить бит b в регистре f |
1 |
01 |
00bb |
bfff ffff |
|
|
BSF f, b |
Установить бит b в реги- |
1 |
01 |
01bb |
bfff ffff |
|
|
стре f |
|
||||||
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
BTFSC f, b |
Проверить бит b в регистре |
1(2) |
01 |
10bb |
bfff ffff |
|
|
f, пропустить |
|
||||||
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
BTFSS f, b |
Проверить бит b в регистре |
1(2) |
01 |
11bb |
bfff ffff |
|
|
|
f, пропустить если 1 |
|
|
|
|
|
Вбит ориентированных командах b определяет номер бита участвующего в операции, а f – указатель регистра, который содержит этот бит.
Вкомандах управления или операциях с константами, k
представляет восемь или одиннадцать бит константы или значения литералов.
Все команды выполняются за один машинный цикл, кроме команд условия, в которых получен истинный результат и инструкций изменяющих значение счетчика команд PC. В случае выполнения команды за два машинных цикла, во втором цикле выполняется инструкция NOP. Один машинный цикл состоит из
24
четырех тактов генератора. Так, например, для тактового генератора с частотой 4 МГц все команды выполняются за 1 мкс, если условие истинно или изменяется счетчик команд PC, команда выполняется за
2мкс.
Рис. 14. Общий формат команд микроконтроллера PIC16C84
На рис. 14 показан формат трех групп команд. Код команды может быть от 3 до 6 бит, что позволяет реализовать 35 команд.
Синтаксис некоторых команд микроконтроллера PIC16С84
приведен в табл. 2.
Примечание: Во всех примерах используется следующий формат шестнадцатеричных чисел: 0xhh, где h – шестнадцатеричная цифра.
Представление двоичного числа: 00000100b, где b – указатель двоичного числа.
25
3.3. Правила записи программ на языке Ассемблера
Исходный текст программы на языке ассемблера имеет определенный формат. Каждая команда (и псевдокоманда)
представляет собой строку четырехзвенной конструкции:
МЕТКА ОПЕРАЦИЯ ОПЕРАНД(Ы) КОММЕНТАРИЙ
Звенья (поля) могут отделяться друг от друга произвольным числом пробелов. Порядок и позиция полей важны. Так, метки должны начинаться в первом столбце. Операция (мнемоника команды) может начинаться во втором столбце или вне его.
Операнды следуют за мнемоникой команды. Комментарии могут следовать за операндами, мнемоникой или метками, и могут начинаться в любом столбце. Максимальная ширина столбца – 255
символов. Один или большее количество пробелов должен отделить метку и мнемонику команды, и мнемонику и операнд(ы). Операнды должны отделяться запятой
Например:
; Пример фрагмента исходной программы “Инициализация МК“
BEGIN
MOVLW INITA ; Загрузка в рабочий регистр WREG
; значения, присвоенного имени INITA (значение (константа, число) ;должно быть присвоено; ранее в предыдущих; фрагментах программы!)
MOVWF |
TRISA |
; Загрузка значения из рабочего |
; регистра W в регистр управления конфигурацией порта А |
||
MOVLW |
INITB |
; Загрузка в рабочий регистр WREG |
; значения, присвоенного имени INITB |
||
MOVWF |
TRISB |
; Загрузка значения из рабочего WREG |
; в регистр управления конфигурацией порта В
26
Метки. В поле метки размещается символическое имя ячейки памяти, в которой хранится отмеченная команда или операнд. Метка представляет собой буквенно-цифровую комбинацию,
начинающуюся с буквы. Используются только буквы латинского алфавита. Ассемблер допускает использование в метках символа подчеркивания(_). Длина метки может быть от 6 до 32 (например для
MPASM) символов. Метки могут сопровождаться двоеточием (:),
пробелом, табуляцией или концом строки.
В качестве символических имен и меток не могут быть использованы мнемокоды команд, псевдокоманд и операторов ассемблера, а также мнемонические обозначения регистров и других внутренних блоков микроконтроллера.
Операция. В поле операции записывается мнемоническое обозначение команды микроконтроллера или псевдокоманды ассемблера, которое является сокращением (аббревиатурой) полного английского наименования выполняемого действия. Если имеется метка на той же самой строке, то мнемоника команды ассемблера,
директивы ассемблера и макрообращения должны отделяться от этой метки двоеточием или одним или большим количеством пробелов или меток табуляции.
Операнды. В этом поле помещаются операнды (или операнд),
участвующие в операции. Операнды должны отделяться от мнемоники одним или более пробелов или меток табуляции. Списки операндов (операнды) должны отделяться запятыми.
Команды могут быть без-, одно-, или двухоперандными.
Операнд может быть задан непосредственно или в виде его адреса (прямого или косвенного). Непосредственный операнд представляется числом (MOVLW 0FFh, где символ 0 для Ассемблера означает, что это число FFh, а не метка! Или, MOVLW B'01010011',
где В - обозначает двоичное число) или символическим именем
27
(MOVWF, DATAPORT).
Используемые в качестве операндов символические имена и метки должны быть определены, а числа представлены с указанием системы счисления, для чего используется префикс (буква, стоящая перед числом): В – для двоичной, Q – для восьмеричной, D – для десятичной, Н – для шестнадцатеричной. Число без префикса по умолчанию считается десятичным.
Псевдокоманды ассемблера. Ассемблирующая программа транслирует исходную программу в объектные коды. Хотя транслирующая программа берет на себя многие из рутинных задач программиста, такие как присвоение действительных адресов,
преобразование чисел, присвоение действительных значений символьным переменным и т. п. , программист все же должен указать ей некоторые параметры: начальный адрес рабочей программы, конец ассемблируемой программы, форматы данных и т.п. Всю эту информацию программист вставляет в исходный текст своей прикладной программы в виде псевдокоманд (директив) ассемблера,
которые только управляют процессом трансляции и не преобразуются в коды обьектной программы.
Псевдокоманда ORG 100H задает ассемблеру адрес ячейки памяти (100Н), в которой должна быть расположена следующая за ней команда прикладной программы.
Псевдокомандой EQU можно любому символическому имени,
используемому в программе, поставить в соответствие определенный операнд.
Например, запись
TMRO EQU 01h
приводит к тому, что в процессе ассемблирования всюду, где встретится символическое имя TMRO, оно будет заменено числом 1.
28