Foreversoft.ru

IT Справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Pic косвенная адресация

Портирование приложений с PIC18 на PIC24F. 1. 2. Система команд

1.2. Набор инструкций

Набор инструкций ядра PIC24F значительно расширен по сравнению с набором инструкций микроконтроллеров PIC18. Так как величина слова инструкции PIC24F составляет 24 бита, увеличено как количество инструкций, так и методов адресации и поддерживаемых типов данных (двойное слово данных – 32 бита, слово данных – 16 бит, байт). Основные различия в наборах инструкций PIС18 и PIC24F приведены в табл. 2.

Табл. 2. Основные различия в наборах инструкций семейств PIC18 и PIC24F

Величина слова инструкции

Количество базовых инструкций

Поддерживаемая разрядность данных

Байт, слово, двойное слово

До двух (b = a + b)

До трех (c = a + b)

Прямая, косвенная (5 видов)

Прямая, косвенная (6 видов)

Используются регистры косвенной адресации FSR – максимум три указателя

Как указатель используется любой регистр общего назначения – до 16 указателей.

Адресация памяти данных

Прямая адресация – ограничено текущим банком. Вся память данных адресуется за несколько инструкций

Прямая адресация – ограничено областью ближней памяти*. Вся память данных – косвенная адресация

* Near Data Space – 8 кБайт

1.2.1. Изменение набора инструкций PIC24F по сравнению с PIC18

Набор инструкций ядра PIC24F предоставляет пользователю дополнительные возможности (табл. 3), увеличивающие скорость выполнения математических алгоритмов и обеспечивающие улучшенную поддержку языков программирования высокого уровня. Последнее связно с гибкой работой с указателями и использованием программного стека.

Таблица 3. Некоторые инструкции семейства PIC24F, увеличивающие скорость выполнения математических алгоритмов по сравнению с PIC18

Инструкции ядра PIC24F

Деление двух чисел, знаковое и беззнаковое, 32 бита на 16 бит и 16 бит на 16 бит

Фиксировать и освободить указатель стекового фрейма (W14)

Двоичный и арифметический сдвиг вправо (от 1 до 15 бит). Аргументом, определяющим величину сдвига, может являться константа или переменная

MUL.SS, MUL.SU, MUL.UU

Умножение (знаковое, смешанное, беззнаковое)

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

Повтор следующей инструкции определенное количество раз

Сдвиг влево (от 1 до 15 бит). Аргументом, определяющим величину сдвига, может являться константа или переменная

Однако некоторые инструкции ядра PIC18 не могут быть заменены атомарной инструкцией ядра PIC24F. Как правило, аналогичный (но не идентичный, вследствие различия флагов в STATUS регистре) результат можно получить, используя одну или две инструкции PIC24F. К таким инструкциям ядра PIC18 относятся:

· CPFSEQ
· CPFSGT
· CPFSLT
· MOVSF
· MOVSS
· INFSNZ
· DCFSNZ
· DECFSZ
· SUBULNK
· INCFSZ
· TSTFSZ
· PUSHL
· MOVFF (все режимы исключая перемещение с использованием косвенной адресации источника и приемника)
· SWAPF (все режимы за исключением использования с WREG)

За исключением перечисленных выше, все инструкции PIC18 имеют аналоги в наборе инструкций PIC24F. Более подробная информация приведена в приложении А .

1.2.2. Поддерживаемые типы данных

Кроме бит-ориентированных инструкций, инструкции ядра PIC18 поддерживают только работу с данными величиной 1 байт. Любые действия с данными разрядностью более 8 бит требуют корректной последовательности выполнения нескольких инструкций.

Ядро PIC24F имеет 16-битную шину данных, что определяет основной формат операндов как 16-битное слово (2 байта). Помимо этого большинство инструкций могут прозрачно использовать 8-битные и 32-битные операнды. При использовании ассемблера суффикс мнемоники .b указывает, что операция производится с 8-битными данными, а суффикс .d – что операция производится с двойным 32-битным словом. Выравнивание, определяемое разрядностью операнда производиться автоматически.

1.2.3. Операнды

В набор инструкций PIC18 входят команды, поддерживающие только унарные и бинарные операции. Унарная операция подразумевает, что результат сохраняется непосредственно в операнд (например, инкремент регистра WREG). Бинарная операция позволяет производить действия с двумя операндами (например, сложение) с последующим сохранением результата в один из операндов.

Набор инструкций PIC24F кроме унарных и бинарных операций поддерживает команды с тремя операндами. При этом результат операции с двумя операндами сохраняется в третий. Операции с тремя операндами могут выполнять большинство математических инструкций и инструкций сдвига.

1.2.4. Режимы адресации

Основное отличие в системах команд PIC18 и PIC24F заключается в количестве способов адресации данных и реализации этих способов. PIC18 и PIC24F поддерживают одни и те же методы адресаций (за исключением отсутствия в PIC18 косвенной адресации с пре-декрементом).

1.2.4.1. Прямая адресация

Архитектура PIC18 позволяет адресовать любой байт из памяти данных. Однако так как для прямой адресации в большинстве инструкций в качестве операнда используется 8-битная константа, память данных PIC18 условно разделена на 16 банков. Текущий банк определяется значением служебного регистра BSR.

Набор инструкций PIC24F разработан таким образом, чтобы любая команда, использующая прямую адресацию, имела доступ к первым 8 кБ памяти данных (NDS — Near Data Space: 0x0000 – 0x1FFF), то есть для прямой адресации используется 13-битная константа. Это позволяет использовать прямую адресацию регистров специального назначения (которые все расположены в NDS). Память данных, расположенная выше NDS (адреса, превышающие 0x1FFF) адресуется косвенно.

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

В ядре PIC18 для косвенной адресации используется набор регистров специального назначения (указателей) и набор виртуальных регистров. При этом в три указателя FSR0, FSR1 и FSR2 может быть загружена 12-битная константа. Для выполнения косвенной адресации, в качестве операнда используется один из виртуальных регистров. В зависимости от того, какой из виртуальных регистров является операндом, может быть выполнена дополнительная операция над указателем, например инкремент или декремент. Таким образом, только три указателя и соответствующие им виртуальные регистры могут быть использованы для косвенной адресации.

Читать еще:  Перевод текста в браузере

В PIC24F в качестве указателя может использоваться любой из 16-и регистров общего назначения W0-W15. Ассемблер предусматривает специальный синтаксис записи косвенной адресации, в том числе и операции над указателем (адресация со смещением, инкремент и декремент указателя). Помимо пре-инкремента, пре-декремента, пост-инкремента указателя, возможен пре-декремент, недоступный в архитектуре PIC18 (табл. 4).

Следует заметить, что при использовании косвенной адресации с изменением указателя, для байтовых инструкций указатель будет изменен на 1. Для инструкций, оперирующих со словом, указатель будет изменен на 2, что обеспечивает корректное выравнивание указателя.

Сравнение режимов косвенной адресации и их реализации приведены в табл. 4. В Примере 1 приведена типовая операция копирования массива для архитектур PIC18 и PIC24F.

Табл. 4. Сравнение режимов косвенной адресации семейств PIC18 и PIC24F

Виртуальный регистр PIC18, используемый в качестве операнда

Аппаратные средства микроконтроллеров серии PIC

5.2.7. Счетчик команд

Счетчик команд PCL и PCLATH имеет разрядность 13 бит. Младший байт счетчика ( PCL ) доступен для чтения и записи и находится в регистре 02h . Старший байт счетчика команд не может быть напрямую записан или считан и берется из регистра PCLATH (PC latch high), адрес которого 0Ah . Содержимое PCLATH передается в старший байт счетчика команд , когда он загружается новым значением.

В зависимости от того, загружается ли в счетчик команд новое значение во время выполнения команд CALL , GOTO , или в младший байт счетчика команд ( PCL ) производится запись, – старшие биты счетчика команд загружаются из PCLATH разными способами, как показано на рис. 5.6.

Команды CALL и GOTO оперируют 11-разрядным адресным диапазоном, достаточным для смещения в пределах страницы программной памяти объемом 2К слов. Для МК подгруппы PIC16F8X этого хватает. С целью обеспечения возможности расширения памяти команд для будущих моделей МК предусмотрена загрузка двух старших бит счетчика команд из регистра PCLATH . При использовании команд CALL и GOTO пользователь должен убедиться в том, что эти страничные биты запрограммированы для выхода на нужную страницу. При выполнении команды CALL или выполнении прерывания весь 13-битный счетчик команд помещается в стек, поэтому для возвращения из подпрограммы не нужны манипуляции с разрядами PCLATH .

Микроконтроллеры подгруппы PIC16F8X игнорируют значения бит PCLATH , которые используются для обращения к страницам 1, 2 и 3 программной памяти. Однако применять биты PCLATH в качестве ячеек памяти общего назначения не рекомендуется, так как это может повлиять на совместимость с будущими поколениями изделий.

Возможность выполнять арифметические операции непосредственно над счетчиком команд позволяет очень быстро и эффективно осуществлять табличные преобразования в PIC -контроллерах.

Микроконтроллеры подгруппы PIC16F8X имеют восьмиуровневый аппаратный стек шириной 13 бит (см. рис. 5.4). Область стека не принадлежит ни к программной области, ни к области данных, а указатель стека пользователю недоступен. Текущее значение счетчика команд посылается в стек, когда выполняется команда CALL или производится обработка прерывания . При выполнении процедуры возврата из подпрограммы (команды RETLW , RETFIE или RETURN ) содержимое счетчика команд восстанавливается из стека. Регистр PCLATH при операциях со стеком не изменяется.

Стек работает как циклический буфер. Следовательно, после того как стек был загружен 8 раз, девятая загрузка перепишет значение первой. Десятая загрузка перепишет вторую и т.д. Если стек был выгружен 9 раз, счетчик команд становится таким же, как после первой выгрузки.

Признаков положения стека в контроллере не предусмотрено, поэтому пользователь должен самостоятельно следить за уровнем вложения подпрограмм.

5.2.8. Прямая и косвенная адресации

Когда производится прямая 9-битная адресация , младшие 7 бит берутся как прямой адрес из кода операции , а два бита указателя страниц ( RP1 , RP0 ) из регистра статуса, как показано на рис. 5.7.

Признаком косвенной адресации является обращение к регистру INDF . Любая команда, которая использует INDF (адрес 00h ) в качестве регистра фактически обращается к указателю, который хранится в FSR (адрес 04h ). Чтение косвенным образом самого регистра INDF даст результат 00h . Запись в регистр INDF косвенным образом будет выглядеть как NOP , но биты статуса могут быть изменены. Необходимый 9-битный адрес формируется объединением содержимого 8-битного FSR регистра и бита IRP из регистра статуса (см. рис. 5.7).

Обратите внимание, что некоторые регистры специальных функций располагаются в банке 1. Чтобы адресоваться к ним, нужно дополнительно установить в единицу бит RP0 в регистре статуса.

5.2.9. Порты ввода/вывода

Контроллеры подгруппы PIC16F8X имеют два порта : PORTA (5 бит) и PORTB (8 бит) с побитовой индивидуальной настройкой на ввод или на вывод.

Порт A ( PORTA ) представляет собой 5-битовый фиксатор, соответствующий выводам контроллера RA . Линия RA4 имеет вход триггера Шмитта и выход с открытым стоком . Все остальные линии порта имеют ТТЛ входные уровни и КМОП выходные буферы. Адрес регистра порта А – 05h .

Каждой линии порта поставлен в соответствие бит направления передачи данных, который хранится в управляющем регистре TRISA , расположенном по адресу 85h . Если бит управляющего TRISA регистра имеет значение 1, то соответствующая линия будет устанавливаться на ввод. Ноль переключает линию на вывод и одновременно выводит на нее содержимое соответствующего регистра -фиксатора порта . При включении питания все линии порта по умолчанию настроены на ввод.

На рис. 5.8 дана схема линий RA порта A .

Порт В ( PORTB ) – это двунаправленный 8-битовый порт , соответствующий выводам RB контроллера и расположенный по адресу 06h . Относящийся к порту В управляющий регистр TRISB расположен на первой странице регистров по адресу 86h . Если бит управляющего TRISB регистра имеет значение 1, то соответствующая линия будет устанавливаться на ввод. Ноль переключает линию на вывод и одновременно выводит на нее содержимое соответствующего регистра защелки. При включении питания все линии порта по умолчанию настроены на ввод.

Читать еще:  Скачать браузер для слабых ноутбуков

У каждой ножки порта В имеется небольшая активная нагрузка (около 100мкА) на линию питания ( pull -up). Она автоматически отключается, если эта ножка запрограммирована как вывод. Более того, управляющий бит /RBPU регистра OPTION может отключить (при RBPU=1 ) все нагрузки. Сброс при включении питания также отключает все нагрузки.

Четыре линии порта В ( RB ) могут вызвать прерывание при изменении значения сигнала на любой из них. Если эти линии настроены на ввод, то они опрашиваются и защелкиваются в цикле чтения Q1 . Новая величина входного сигнала сравнивается со старой в каждом командном цикле. При несовпадении значения сигнала на ножке и в фиксаторе генерируется высокий уровень. Выходы детекторов «несовпадений» RB4 , RB5 , RB6 , RB7 объединяются по ИЛИ и генерируют прерывание RBIF (запоминаемое в регистре INTCON ). Любая линия, настроенная как вывод, в этом сравнении не участвует. Прерывание может вывести кристалл из режима SLEEP . В подпрограмме обработки прерывания следует сбросить запрос прерывания одним из следующих способов:

  • прочитать (или записать в) порт В . Это завершит состояние сравнения;
  • обнулить бит RBIF регистра INTCON .

При этом необходимо иметь в виду, что условие «несовпадения» будет продолжать устанавливать признак RBIF . Только чтение порта В может устранить «несовпадение» и позволит обнулить бит RBIF .

Прерывание по несовпадению и программно устанавливаемые внутренние активные нагрузки на этих четырех линиях могут обеспечить простой интерфейс, например, с клавиатурой, с выходом из режима SLEEP по нажатию клавиш.

Схемы линий порта B приведены на рис. 5.10 и 5.11.

На ножку, работающую в режиме вывода , не должны нагружаться внешние источники токов («монтажное И», «монтажное ИЛИ»). Большие результирующие токи могут повредить кристалл.

Необходимо выдерживать определенную последовательность обращения к портам ввода/вывода. Запись в порт вывода происходит в конце командного цикла. Но при чтении данные должны быть стабильны в начале командного цикла. Будьте внимательны в операциях чтения, следующих сразу за записью в тот же порт . Здесь надо учитывать инерционность установления напряжения на выводах. Может потребоваться программная задержка, чтобы напряжение на ножке (которое зависит от нагрузки) успело стабилизироваться до начала исполнения следующей команды чтения.

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

Косвенная адресация очень удобная штука, когда необходимо оперировать с большим количеством регистров, о ней я упоминал еще в первой статье, здесь же покажу, как можно применить данный вид адресации.
Для работы с косвенной адресацией используется регистр специального назначения FSR и физически не реализованный регистр INDF. Принцип работы простой, в регистр FSR записываем адрес какого-либо регистра, пусть это будет регистр с названием temp (то есть адресу этого регистра присвоено название temp с помощью директивы equ), после чего содержимое регистра temp “условно” оказывается в регистре INDF. Теперь все операции, проделанные над регистром INDF, будут выполнены и для регистра temp, на самом же деле обращение к регистру INDF вызовет действие непосредственно с регистром temp, поэтому я и употребил термин “условно”.

Рассмотрим следующую задачу: необходимо получить 10 байт данных от какого-либо устройства по интерфейсу SPI (тут возможен не только SPI, например I2C, UART и т.д.) и разместить их в памяти данных (ОЗУ). В “шапке” программы необходимо присвоить название одному регистру, начиная с которого будут располагаться остальные регистры, в них будет происходить запись принятых байтов, пусть это будет регистр с названием data. Понадобиться еще один регистр (назовем его shet), который будет выступать в качестве счетчика принятых байтов. Код программы представлен ниже:

Первым делом записываем число 10 в регистр shet, чтобы вести отчет принятых байтов, далее записываем адрес первого регистра (регистр data по адресу 0х21, который будет использоваться для хранения принятых данных) в регистр FSR. Вызываем подпрограмму spi для получения одного байта данных, при этом байт записывается в аккумулятор при выходе из подпрограммы. По возвращении из подпрограммы записываем принятый байт в регистр INDF, на самом деле этот байт записывается в регистр data, расположенный по адресу 0х21 в памяти данных. Теперь производим инкремент регистра FSR, тем самым подготавливая следующий регистр памяти данных для записи очередного принятого байта. После инкремента в регистре FSR будет лежать число 0х22, то есть это адрес следующего регистра в памяти данных после регистра data. Далее декрементируем регистр shet, если он не равен нулю, переходим на метку s1, получаем новый байт и записываем в регистр INDF, только теперь этот байт запишется в регистр с адресом 0х22. Тем самым после выполнения кода (когда регистр shet обнулится), все 10 принятых байт запишутся в регистры расположенные последовательно по адресам 0х21 – 0х2A.

Конечно, можно поступить просто и прямолинейно, присвоить названия всем 10-ти регистрам, и написать линейный код: вызов подпрограммы spi, далее запись полученного байта в первый регистр, очередной вызов подпрограммы с записью в следующий регистр, и так 10 раз подряд. В итоге получим код размером в 20 строчек (слов памяти программ). Но это будет неоптимизированный код, занимающий много места в памяти программ, а если нам надо принять 20, 40, 60 байт?

Читать еще:  Не запускается браузер гугл

Косвенную адресацию можно использовать не только для приема данных, но и в других целях, например выполнение однотипных операций с большим количеством регистров ОЗУ, в частности для реализации динамической индикации и т.д., короче это очень полезная вещь.

При использовании косвенной адресации следует помнить о банках памяти.
Но тут все проще, нежели при непосредственной адресации. Банк указывается одним битом IRP регистра STATUS, если этот бит сброшен, можно обращаться к регистрам расположенным сразу в двух банках, в 0-ом и 1-ом, если бит установлен, обращение идет к регистрам 2-го и 3-го банка.

Pic косвенная адресация

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Например, нужно прочитать значение переменной по адресу 0 x 435. Для этого мы заносим адрес этой переменной в регистры FSR 0 H =0 x 04; FSR 0 L =0 x 35. Дальше, можно читать значение переменной.

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

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

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

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

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

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

Ссылка на основную публикацию
Adblock
detector