Общие сведения.
Система команд контроллеров PIC16C5X состоит из 33 инструкций. Использование RISC архитектуры обеспечивает выполнение:
? 26 команд за один цикл;
? 4 условных команд (DECFSZ, INCFSZ, BTFSC, BTFSS) за один цикл, если результат проверки условия не равен нулю, и за два цикла в противном случае;
? 3 команд (CALL, GOTO, RETLW) за два цикла.
Форматы команд.
Каждая команда представляет собой 12–разрядный двоичный код (слово). В коде команды выделяются поля (разряды), в которых указываются выполняемая операция, адреса ячеек памяти операндов–источников и приемника (результата). Совокупность полей образует формат команды. В зависимости от количества полей в формате команды можно выделить три группы команд (рис. 6.4.1):
? команды, формат которых содержит три поля:
• OPCODE— код операции;
• f— адрес регистра с требуемым операндом (или битом). Другой операнд в двуместных операциях всегда находится в регистре W;
• d— регистр назначения (destination): при d= 0 результат операции помещается в рабочий регистр W, при d= 1 — в регистр f, заданный в команде;
• b— номер бита, участвующего в операции;
? команды, формат которых содержит два поля:
• OPCODE— код операции;
• f— адрес регистра общего назначения (в операциях загрузки);
• к — 8– или 9–битная константа (в операциях с константами и передачи управления);
? безадресные команды, формат которых состоит из одного поля — кода операции OPCODE.
Описание команд
Для компактного изложения выделим и рассмотрим четыре группы команд и представим материал в табличной форме.
Операции с байтами
В эту группу включено 18 операций (табл. 6.4.1), при этом назначению dest при d= 0 соответствует рабочий регистр W, а при d= 1 — адресуемый регистр f. Во всех командах за исключением TRIS f значение f в десятичных числах лежит в пределах 0 ≤ f ≤ 31.
Операции с битами
Во всех командах этой группы (табл. 6.4.2) значения адреса регистра f и номера бита b должны лежать в следующих пределах: 0 ≤ f≤ 31, 0 ≤ b≤ 7.
Операции с константами и команды передачи управления
Константы должны быть расположены в памяти программ. Для работы с ними используется непосредственная адресация (IMM). Контроллер оперирует с константами двух форматов, для которых в мнемонике команды используется общая аббревиатура константы k (рис. 6.4.1).
В командах загрузки и логических операций используются 8–разрядные константы (табл. 6.4.3), поскольку их разрядность должна совпадать с разрядностью второго операнда и регистра результата. Значение константы лежит в пределах 0 ≤ k≤ 255. Кроме того, 8–разрядная константа k используется как адрес вызываемой подпрограммы и возврата в коде команд CALL и RETLW. Единственной командой, которая использует 9–разрядную константу в качестве абсолютного адреса первой команды вызываемой подпрограммы, является команда безусловного перехода GOTO k.
Безадресные команды
В командах этой группы (табл. 6.4.4) адресуемый объект и выполняемое действие задается мнемоникой, например, CLRW— CLR (clearing— очистка) регистра W.
В табл. 6.4.5 приведено распределение команд по функциональному признаку.
В командах с байтами (табл. 6.4.1) и битами (табл. 6.4.2) для обращения к регистрам специальных функций и общего назначения используется прямая (DIR) и косвенная (INDIR) адресация (рис. 6.3.1).
В мнемонике команд с прямой адресацией OPCODE f, d эти регистры обозначаются символом f, в качестве которого может фигурировать 16–ричный адресный код или обозначение регистра, например:
ADDWF 04h, d или ADDWF FSR, d.
При косвенной адресации используется дополнительный регистр FSR, в котором хранится адрес вызываемых данных. Биты 6 и 5 FSR служат для выбора банка, а пять младших бит (4–0) адресуют ячейку памяти в пределах банка (адреса ячеек 00h… 1Fh). Обращение к требуемому байту данных осуществляется через псевдо–регистр INDF, для чего в мнемонике команды указывается наименование (INDF) или адрес (00h) псевдорегистра, например, ADDWF
INDF, d или ADDWF0, d. Отметим, что чтение косвенным способом самого регистра INDF даст результат 00h (т е. FSR= 0), а запись в регистр INDF не приведет к изменению его содержимого (хотя биты состояния в регистре
STATUS могут быть изменены).
При написании программ необходимо иметь в виду, что разряды 6 и 5 регистра косвенной адресации FSR определяет адрес ячейки памяти не только при использовании косвенной адресации, но и при прямой адресации, так как непосредственно в коде команды с прямой адресацией указывается лишь 5–разрядный адрес ячейки.
Регистры W, OPTION и TRIS не имеют собственных адресов в карте памяти, поэтому для работы с ними используются специальные команды с неявной адресацией (команды MOVWF f, MOVLW k, OPTION и TRIS f). Для очистки регистров также используется команда CLRF f с неявной адресацией.
Для работы с константами (табл. 6.4.3) используется непосредственная адресация (IMM), так как константа k представляет собой непосредственный операнд, участвующий в логической операции или предназначенный для загрузки в регистр–приемник. Все команды используют 8–разрядные константы, кроме команды безусловного перехода GOTO к, в которой (0 ≤ k≤ 511).
Особенности выполнения команд
Организация циклов. Из входных импульсов с частотой fOSC= 1/TOSC. поступающих с вывода OSC1/CLKIN микроконтроллера на внутренний преобразователь, формируются четыре циклические неперекрывающиеся тактовые последовательности Q1, Q2, Q3 и Q4 с частотой следования fOSC/4. Процесс выполнения команды включает два цикла: цикл выборки и цикл выполнения команды. Цикл состоит из четырех тактов Q1…Q4 длительностью TOSC каждый.
В такте Q 1 цикла выборки происходит увеличение содержимого счетчика, в последующих тактах — считывание команды из памяти программ, в такте Q4 — ее запись в регистр команд. Декодирование и выполнение команды осуществляется в тактах Q1 …Q4,последующего цикла выполнения.
Использование двухступенчатого конвейера позволяет совместить во времени оба цикла, поэтому эффективное время выполнения для большинства команд составляет один цикл (рис. 6.4.2).
Если команда изменяет содержимое счетчика команд (например, команда GOTO), то для ее выполнения потребуется два цикла. В цикле выборки новый адрес заносится в счетчик команд.
В такте Q1 цикла выполнения команды выбранная команда защелкивается в регистр команд. В течение тактов Q2, Q3 и Q4 происходит декодирование и выполнение команды (в такте Q2 чтение операнда из памяти данных, в такте
Q4 запись результата в память). Команды, изменяющие содержимое PC. К таким командам, помимо команд CALL, GOTO, относятся все команды, в которых регистром f является счетчик команд PC. При выполнении команд модификации счетчика, например, MOVWF PC (рис. 6.3.2):
? в младший байт PCL счетчика команд загружается содержимое рабочего регистра W;
? бит 8 сбрасывается в 0;
? в разряды 9, 10 записываются значения бит РА0, РА1 из регистра состояния STATUS.
Наличие 0 в разряде 8 свидетельствует о том, что доступны только первые 256 адресов каждой страницы памяти программ.
Так как команда CALL k(k = 0…255) предписывает использование только 8–разрядного адреса, начальный адрес вызываемой подпрограммы также располагается в первых 256 ячейках памяти программ текущей страницы. Команда
GOTO k(k= 0…511) может передать управление только в пределах текущей страницы памяти программ.
При достижении границы страницы счетчик команд автоматически переходит на начало следующей страницы. Однако биты выбора страницы в регистре состояния STATUS не изменяются автоматически. Поэтому, если биты РА1, РА0 не будут изменены программно, последующие команды MOVWF PC, CALL, GOTO возвратят управление к предыдущей странице.
После сброса контроллера:
? регистр STATUS находится в состоянии 0001 1ФФФ (Ф = 0 или 1), поэтому биты РА1, РА0 выбора страницы указывают на страницу 0;
? старший байт PCL счетчика команд находится в состоянии 1111 1111.
Следовательно, после сброса счетчик команд PC содержит код 001 1111 1111, что соответствует странице 0 (00) и последней ячейке памяти последней страницы (для PIC16C54 состояние после сброса равно 1FFh = 1 1111 1111). Поэтому, если по стартовому адресу будет расположена команда GOTO к, управление будет передано на следующую нулевую страницу.
Команды BCF и BSF
Команды сброса (BCF) и установки (BSF) бита в регистре f считывают байт целиком, модифицируют один бит и выводят результат в приемник, т. е. выполняются в режиме чтение–модификация–запись. При обращениях к портам команды BCF и BSF могут вызвать ошибочный результат, так как с помощью команды TPIS одни выводы порта запрограммированы как входы, другие — как выходы.
Пример.
Пусть к биту 3 регистра PORTB обращается команда BSF, которая сначала считывает все восемь бит, затем выполняет установку бита 3 в 1, после чего модифицированный байт целиком записывается в выходную защелку порта. Если другой бит (например, бит 4) регистра PORTB в данный момент определен как вход, входной сигнал на этом выводе будет считан и записан обратно в выходную защелку этого же вывода, затирая ее предыдущее состояние. Если позднее линия 4 переключится в режим выхода, ее состояние может оказаться ошибочным.
Возможность такой ситуации должна быть учтена при программировании порта. Другая особенность, которая должна учитываться при программировании: запись в порт вывода происходит в конце цикла выполнения команды, а чтение в начале.
При чтении данные должны быть стабильны в начале цикла выполнения команды. Поэтому при операциях чтения, следующих сразу же за записью в тот же порт необходимо учитывать инерционность установления напряжения на выводах. Может потребоваться программная задержка (команда NOP), чтобы напряжение на выводе успело стабилизироваться до начала исполнения следующей команды чтения.