Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Микроконтроллеры PIC фирмы Microchip для начинающих выпуск №4


РАССЫЛКА Микроконтроллеры PIC фирмы Microchip для начинающих
Ведущий: Алексей (wmstr@front.ru)


Приветствую Вас, мои подписчики!

Сегодняшний выпуск будет посвящен адресации данных в микроконтроллерах серии PIC18 и описанию инструкций ассемблерного кода! Огромный респект тем, кто попытался разобраться самостоятельно в командах!


 

Перед тем, как начнем разбираться в инструкциях, я хочу объяснить два основных принципа адресации в микроконтроллерах этой серии.

Открываем datasheet, который я просил Вас скачать на микроконтроллер PIC18F452. Обычно, это datasheet на семейство PIC18Fxx2, куда и входит наш микроконтроллер. Ищем закладку «Memory Organization» (организация памяти) – пункт 4.0. Память бывает двух типов: память программ и память данных. Нам нужна организация памяти данных. Далее, в этом пункте ищем закладку «Data Memory Organization» (организация памяти данных) – пункт 4.9.  Далее, читаем, что каждый регистр памяти данных имеет 12-битный адрес, т.е. максимально возможное количество данных может быть 212 =4096 байт.  Дальше, написано, что вся память делится на 16 банков по 256 байт.  И, что вся память данных состоит из двух типов регистров:

  • SFR Special Function Registers – регистры специального назначения, используются для управления ядром и периферийными модулями микроконтроллера;
  • GPR General Purpose Registers – регистры общего назначения, используются, как память для написанной программы.

В нашем микроконтроллере память данных имеет размер 1536 байт, т.е. 6 банков по 256 байт. Ниже, в datasheet приведен рисунок, который наглядно показывает организацию памяти данных:

организация памяти данных


Теперь, подробно остановимся на рисунке и разберемся в типах адресации.

Первый тип. Прямая адресация.

При прямой адресации используется специальный регистр BSR(Bank Select Register) – регистр выбора банка. Общий, 12-ти битный адрес ячейки памяти вычисляется, как, старшие 4 бита – регистр BSR, и младшие 8 бит – смещение, внутри выбранного банка, которое задается ядру в команде. Пример на рисунке, который есть в datasheet:

прямая адресация

Когда начнем писать программу на ассемблере, станет более понятен механизм данной адресации. В микроконтроллерах PIC есть банк, для работы с которым можно не использовать регистр BSR. Это Access Bank. Как видно по рисунку 1, он расположен в первой половине банка 0 микроконтроллера PIC18F452, также, все специальные регистры адресуются, как данные из этого банка. Адресация к этому банку идет только по смещению и специальному биту в командах ассемблера, по которому ядро определяет, использовать регистр BSR при вычислении адреса переменной или нет. В большинстве случаев, прямая адресация мало используется при написании программ. Обычно, для одиночных переменных хватает Access Bank’а, а остальные банки используются, как массивы данных. Как правило, обращение к массивам выполняется с использованием косвенной адресации.


Второй тип. Косвенная адресация.

Косвенная адресация – это такой режим адресации, при котором в команде не указывается адрес переменной. Существуют 3  группы специальных регистров,  с помощью которых происходит адресация переменных.  Это регистры: FSRxH, FSRxL, имеющие физический адрес. И регистры, не имеющие физический адрес: INDFx, POSTINCx, POSTDECx, PREINCx, PLUSWx.   Где, х=0,1,2.

Основной принцип адресации представлен на рисунке:

Косвенная адресация

Как видим по рисунку, чтобы обратиться к ячейке памяти, необходимо сначала загрузить в регистры FSRxH и FSRxL 12-ти битный адрес переменной, а потом, использовать значение этой переменной, посредством любого из остальных специальных регистров этой группы.

Например, нужно прочитать значение переменной по адресу 0x435.  Для этого мы заносим адрес этой переменной в регистры FSR0H=0x04; FSR0L=0x35. Дальше, можно читать значение переменной.

Способы чтения или записи:

  • Значение ячейки можно читать и модифицировать, используя регистр INDF0. Адрес текущей ячейки не изменяется автоматически.
  • Значение ячейки можно читать и модифицировать, используя регистр POSTINC0. После обращения к ячейке через этот регистр (запись или чтение), адрес, автоматически, увеличится на 1. Т.е. FSR0 будет уже  указывать на ячейку с адресом 0x436.
  • Значение ячейки можно читать и модифицировать, используя регистр POSTDEC0. После обращения к ячейке через этот регистр (запись или чтение), адрес, автоматически, уменьшится на 1. Т.е. FSR0 будет уже  указывать на ячейку с адресом 0x434.
  • Значение ячейки можно читать и модифицировать, используя регистр PREINC0. Перед обращением к ячейке через этот регистр (запись или чтение), адрес, автоматически, увеличится на 1. Т.е. перед чтением или записью, FSR0 будет уже  указывать на ячейку с адресом 0x436. Т.е. реально работа будет с ячейкой с адресом 0x436.
  • Значение ячейки можно читать и модифицировать, используя регистр PLUSW0. Значение специального регистра – аккумулятора WREG используется, как смещение относительно адреса переменной, указанного в регистрах FSR0. Т.е., перед работой с  регистром PLUSW0, необходимо в аккумулятор занести смещение.  После записи/чтения значение WREG и адрес текущей ячейки не изменяется. В нашем примере, перед обращением к ячейке, в специальные регистры заносим: WREG=0; FSR0=0x435.

На этом с адресацией закончим!


 Еще, что необходимо Вам знать! Практически, вся работа ядра идет через регистры: аккумулятор (WREG или W) и регистр статуса (STATUS). Это основные регистры микроконтроллера. Поэтому, в микроконтроллере есть много инструкций, которые используют эти регистры.  Регистр – аккумулятор WREG представляет собой обычный 8-битный регистр данных. Используется, как один из операндов, при вычислении чего-либо.  Регистр статуса содержит результирующие флаги выполнения команды ассемблера и имеет следующую структуру:

регистр статуса

Где: N – признак отрицательного результата (7-ой знаковый бит переменной результата=1), OV – признак переполнения разрядности (7-ой знаковый бит результата изменился после переполнения), Z – признак нулевого результата, DC – флаг десятичного переноса/заема, С – флаг переноса/заема.


 

Теперь остановимся конкретно на командах!

Находим в закладках пункт 20.0 INSTRUCTION SET SUMMARY. В этом пункте рассматриваются все команды ассемблера, поддерживаемые данным микроконтроллером.  Первое, что необходимо учесть, что каждая команда выполняется за 4 импульса тактового генератора (командный цикл). Например, если у нас стоит кварц на частоту 20МГц, то за секунду будет выполняться 5 миллионов командных циклов. Одна команда за 200 наносекунд. Но, есть команды, которые выполняются за несколько циклов. Это команды, проверяющие различные условия, изменяющие программный счетчик или операции чтения/записи таблиц. В этом случае выполнение команды растягивается на два командных цикла. Команда выполняется за 3 цикла, если по условию, необходимо пропускать команду, состоящую из 2-х слов.

Все команды подразделяются на:

  • байт-ориентированные (например, ADDWF FREG, d, a);
  • бит-ориентированные (например, BSF FREG, bit, a);
  • символьные (например, ADDLW  k);
  • табличные (например, TBLRD*);
  • команды управления (например, GOTO kkk).

Здесь и дальше:

Обозначение

Описание

FREG

любой регистр данных

d

указатель на регистр, куда будет записываться результат

0 – результат будет записываться в аккумулятор WREG

1 – результат будет записываться в регистр FREG

а

Признак, использовать при вычислении адреса регистр BSR или нет

0 – FREG расположен в Access Bank или это специальный регистр

1 – вычислять адрес FREG, используя регистр  BSR

bit

Номер бита в байте от 0 до 7

k

Байтовая константа

kkk

Абсолютный 20-ти битный адрес перехода

Теперь сами команды! По порядку, как они расположены в datasheet.

Мнемоника и операнды

Описание команды

Кол-во циклов

Флаги

Байт-ориентированные команды

ADDWF FREG, d, a

Сложение WREG и FREG.  Например: ADDWF temp,1,0 – результат сложения помещается в переменную temp,  при вычислении адреса переменной регистр BSR не используется

1

C,DC,Z,OV,N

ADDWFС FREG, d, a

Сложение WREG, FREG и значения флага С до выполнения инструкции.  Например: ADDWFС temp,1,0 – результат сложения помещается в переменную temp,  при вычислении адреса переменной регистр BSR не используется.

1

C,DC,Z,OV,N

ANDWF FREG, d, a

Поразрядная операция «логическое И» регистров WREG и FREG. Например,            ANDWF temp,0,0 – результат помещается в регистр WREG, при вычислении адреса переменной temp регистр BSR не используется.

1

Z, N

CLRF FREG, a

Обнуление регистра FREG. Например: CLRF temp,1 – обнуление переменной temp. Для вычисления адреса переменной temp используется регистр BSR.

1

Z

COMF FREG, d, a

Инверсия содержимого регистра FREG

1

Z, N

CPFSEQ FREG, a

Операция сравнения FREG с WREG. Пропускается следующая по коду команда, если FREG=WREG

1или 2,3

Не изменяет

CPFSGT FREG, a

Операция сравнения FREG с WREG. Пропускается следующая по коду команда, если FREG>WREG

1или 2,3

Не изменяет

CPFSLT FREG, a

Операция сравнения FREG с WREG. Пропускается следующая по коду команда, если FREG<WREG

1или 2,3

Не изменяет

DECF FREG, d, a

Декремент (вычитание единицы) регистра FREG.

1

C,DC,Z,OV,N

DECFSZ  FREG, d, a

Декремент регистра FREG. Если результат 0, то пропускается следующая по коду команда. Команда, очень удобная для организации циклов.

1или 2,3

Не изменяет

DCFSNZ FREG, d, a

Декремент регистра FREG. Если результат не 0, то пропускается следующая по коду команда.

1или 2,3

Не изменяет

INCF FREG, d, a

Инкремент (прибавление единицы) регистра FREG.

1

C,DC,Z,OV,N

INCFSZ FREG, d, a

Инкремент регистра FREG. Если результат 0 (переполнение разрядности регистра), то пропускается следующая по коду команда.

1или 2,3

Не изменяет

INFSNZ FREG, d, a

Инкремент регистра FREG. Если результат не 0, то пропускается следующая по коду команда.

1или 2,3

Не изменяет

IORWF FREG, d, a

Поразрядная операция «логическое ИЛИ» регистров WREG и FREG.

1

Z, N

MOVF FREG, d, a

Пересылка регистра FREG в регистр, определяемый параметром d. Например, MOVF temp,0,0 – пересылка значения переменной temp в регистр WREG.

1

Z, N

MOVFF FREG1, FREG2

Выполняет действие: FREG2=FREG1. Для этой команды FREG1 и FREG2 могут находиться в  любой области данных, без учета банков памяти.

2

Не изменяет

MOVWF FREG, a

Выполняет действие: FREG=WREG

1

Не изменяет

MULWF FREG, a

Умножение регистра FREG на регистр WREG, результат помещается в пару регистров: PRODH, PRODL

1

Не изменяет

NEGF FREG, a

Перевод в обратную форму представления двоичного числа регистра FREG (инвертирование значения регистра FREG, а потом к результату прибавляется 1). Т.е. выполняется действие:  FREG= -FREG   

1

C,DC,Z,OV,N

RLCF FREG, d, a

Сдвиг влево регистра FREG, через перенос (флаг С). Выполняется действие: C<FREG<C

1

C,Z,N

RLNCF FREG, d, a

Сдвиг влево регистра FREG, без переноса. Выполняется действие: FREG<FREG[7]. Т.е., значение старшего бита заносится в  младший бит.

1

Z,N

RRCF FREG, d, a

Сдвиг вправо регистра FREG, через перенос (флаг С). Выполняется действие: C>FREG>C

1

C,Z,N

RRNCF FREG, d, a

Сдвиг вправо регистра FREG, без переноса. Выполняется действие: FREG[0]>FREG. Т.е., значение младшего бита заносится в  старший бит.

1

Z,N

SETF FREG, a

Выполняется действие: FREG=0xFF

1

Не изменяет

SUBFWB FREG, d, a

Вычитается из регистра WREG: значение регистра FREG и инвертированное значение флага переноса С.

1

C,DC,Z,OV,N

SUBWF FREG, d, a

Вычитается из регистра FREG значение регистра WREG

1

C,DC,Z,OV,N

SUBWFB FREG, d, a

Вычитается из регистра FREG: значение регистра WREG и инвертированное значение флага переноса С.

1

C,DC,Z,OV,N

SWAPF FREG, d, a

Меняются местами тетрады регистра FREG (тетрада – младшие или старшие 4 бита в байте)

1

Не изменяет

TSTFSZ FREG, a

Пропуск следующей команды по коду, если FREG=0

1или 2,3

Не изменяет

XORWF FREG, d, a

Поразрядная операция «логическое исключающее ИЛИ» регистров WREG и FREG.

1

Z,N

 


Чтобы сильно не перегружать Вас, думаю, сегодня остановимся! В следующем выпуске закончим с командами и перейдем к битам конфигурации!

Желаю Вам удачи! До скорой встречи!


С уважением, Алексей wmstr@front.ru
Cайт разработчиков 2AplusA http://2aplusa.ru


В избранное