PIC16C5XОбщие сведения. Система команд контроллеров 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.

рис. 6.4.1

Описание команд. Для компактного изложения выделим и рассмотрим четы­ре группы команд и представим материал в табличной форме.

Операции с байтами. В эту группу включено 18 операций (табл. 6.4.1), при этом назначению dest при d = 0 соответствует рабочий регистр W, а при d = 1 — адресуемый регистр f. Во всех командах за исключением TRIS f значение f в десятичных числах лежит в пределах 0 ≤ f 31.

табл. 6.4.1

Операции с битами. Во всех командах этой группы (табл. 6.4.2) значения адреса регистра f и номера бита b должны лежать в следующих пределах: 0 ≤ f ≤ 31, 0 ≤ b ≤ 7.

табл. 6.4.2

Операции с константами и команды передачи управления. Кон­станты должны быть расположены в памяти программ. Для работы с ними ис­пользуется непосредственная адресация (IMM). Контроллер оперирует с констан­тами двух форматов, для которых в мнемонике команды используется общая абб­ревиатура константы k (рис. 6.4.1).

В командах загрузки и логических операций используются 8–разрядные кон­станты (табл. 6.4.3), поскольку их разрядность должна совпадать с разрядностью второго операнда и регистра результата. Значение константы лежит в пределах 0 ≤ k ≤ 255. Кроме того, 8–разрядная константа k используется как адрес вызыва­емой подпрограммы и возврата в коде команд CALL и RETLW. Единственной ко­мандой, которая использует 9–разрядную константу в качестве абсолютного ад­реса первой команды вызываемой подпрограммы, является команда безусловно­го перехода GOTO k.

табл. 6.4.3

Безадресные команды. В командах этой группы (табл. 6.4.4) адресуемый объект и выполняемое действие задается мнемоникой, например, CLRWCLR (clearing — очистка) регистра W.

табл. 6.4.4

В табл. 6.4.5 приведено распределение команд по функциональному признаку.

табл. 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 или ADDWF 0,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 каждый.

В такте Q1 цикла выборки происходит увеличение содержимого счетчика, в последующих тактах — считывание команды из памяти программ, в такте Q4 — ее запись в регистр команд. Декодирование и выполнение команды осуществля­ется в тактах Q1 ...Q4,последующего цикла выполнения.

Использование двухступенчатого конвейера позволяет совместить во времени оба цикла, поэтому эффективное время выполнения для большинства команд со­ставляет один цикл (рис. 6.4.2).

рис. 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), чтобы напряжение на выводе успело стабилизироваться до начала исполнения следующей команды чтения.