НОУ ІНТУІТ, Лекція, Спеціальні функції та система команд мікроконтролерів серії PIC
5.3. Система команд мікроконтролерів підгрупи PIC16F8X
5.3.1. Перелік та формати команд
Мікроконтролери підгрупи PIC16F8X мають просту та ефективну систему команд, що складається всього з 35 команд.
Кожна команда МК підгрупи PIC16F8X являє собою 14-бітове слово, поділене на код операції (OPCODE), і поле для одного і більше операндів, які можуть брати участь або не брати участь у цій команді. Система команд PIC16F8X є ортогональною і включає команди роботи з байтами, команди роботи з бітами і операції з константами і команди управління. У таблиці 5.10 наведено описи полів команд.
d=0 – результат у регістрі w
d=1 – результат у регістрі f
Типово d=1
Для команд роботи з байтами f позначає регістр, з яким провадиться дія; d – біт, визначальний, куди покласти результат. Якщо d =0 , то результат буде поміщений в регістр w при d=1 результат буде поміщений в регістр " f ", згаданий у команді.
Для команд роботи з бітами b позначає номер біта, що у команді, а f – це регістр, у якому даний біт розташований.
Для команд передачі управління та операцій з константами, k позначає восьми-або одинадцятибітну константу.
Майже всі команди виконуються протягом одного циклу. У двох випадках виконання команди займає два командні цикли:
- перевірка умови та перехід;
- зміна програмного лічильника як результат виконання команди.
Один командний цикл складається з чотирьох періодів генератора. Таким чином, для генератора із частотою 4 МГц час виконання командного циклу буде 1 мкс.
Основні формати команд МКзображені на рис. 5.15.
Система команд МК підгрупи PIC16F8X наведена у табл. 5.11.

Примітки до таблиці:
- Якщо модифікується регістр введення/виводу (наприклад, MOVF PORTB,1 ), використовується значення, що зчитується з висновків. Наприклад, якщо у вихідній клямці порту, включеного на введення, знаходиться "1", а зовнішній пристрій формує на цьому виводі "0", то в розряді даних буде записано "0".
- Якщо операндом команди є вміст регістру TMRO (і, якщо припустимо, d=1 ), то попередній дільник, якщо він підключений до TMRO буде скинутий.
- Якщо в результаті виконання команди змінюється лічильник команд або переходить по перевірці умови, то команда виконується за два цикли. Другий цикл виконується як NOP.
5.3.2. Команди роботи з байтами
Спеціальні команди CLRF f та CLRW застосовуються для очищення регістрів МК. Команда CLRF f записує нуль у вказаний регістр, а команда CLRW – у робочий регістр. При цьому необхідно пам'ятати, що вони встановлюють відповідне значення біта нуля.
Найчастіше використовуваною арифметичною операцією є додавання, яке виконується командою ADDWF f,d. Ця операція може змінювати всі біти стану. Біт нуля встановлюється 1, якщо при виконанні логічної операції "І" над отриманим результатом і числом 0x0FF (255) виходить нуль. Біт перенесення встановлюється 1, якщо результат перевищує число 0x0FF. Біт десяткового перенесення встановлюється 1, якщо сума чотирьох молодших бітів результату перевищує 0x0F (15).
При використанні операції віднімання SUBWF f, d слід пам'ятати, що у PIC МК вона виконує операцію додавання з негативним числом. Тобто замість операції d = f - w насправді виконується d =f + (-w). Негативне значення вмісту w обчислюється за формулою Negw = (Posw ^ 0x0FF) + 1 .
Команди логічних операцій ANDWF f, d, IORWF f, d та XORWF f, d дозволяють виконувати основні логічні операції над відповідними бітами вмісту зазначеного регістра та регістра w. Біт нуля в регістрі STATUS встановлюється 1 або скидається в 0 залежно від значення отриманого результату. Команду XORWF f, d зручно використовуватиме перевірки вмісту деякого регістру. Для цього необхідно завантажити задане число в регістр w і виконати операцію XORWF f, d над вмістом регістру, що перевіряється, і w . Якщо вміст регістру дорівнює вмісту w , то результат операції дорівнюватиме нулю, і біт нуля встановиться в 1.
Команда COMF f, d використовується для інвертування значень всіх бітів у регістрі джерела. Слід зазначити, що ця команда робить число негативним, тобто не переводить їх у додатковий код . Негативне число Neg може бути отримано з позитивного Pos наступним чином: Neg = (Pos ^ 0x0FF) + 1 .
Команда SWAPF f, d змінює місцями зошити у регістрі. Як і інших командах цієї групи, результат виконання може бути записаний як у регістрі w , і у регістрі-джерелі. Ця команда не змінює значення якогось із бітів стану, що може використовуватися для відновлення вмісту контекстних регістрів перед поверненням з переривання. Команду SWAPF f, d можна застосовувати, зокрема, для зберігання двох цифр в одному регістрі, переставляючи їх в залежності від того, яку ви хочете використовувати. За допомогою команди SWAPF f, d зручно розділити байт на два зошити для подальшого відображення на дисплеї.
Основною функцією команд циклічного зсуву RLF f, d і RRF f, d є зсуввмісту регістра ліворуч або праворуч на один біт із записом на місце молодшого значущого біта значення біта переносу або, відповідно, встановлення біта переносу відповідно до значення старшого біта. Команди циклічного зсуву можуть використовуватися для множення та поділу на число 2 у ступені n. Вони також служать реалізації послідовного введення чи виведення даних і позиціонування байта у тому, щоб можна було тестувати значення окремих бітів.
Команди інкременту INCF f, d та декременту DECF f, d використовуються для зміни вмісту регістру на 1. Після виконання команд інкременту та декременту може змінитися лише біт нуля. Зміни біта перенесення, якщо результат перевищить значення 0x0FF при інкременті або виявиться менше 0 при декременті, не відбувається.
Для реалізації умовних переходів у програмі існують команди інкременту та декременту з пропуском команди при нульовому результаті: INCFSZ f, d та DECFSZ f, d . З погляду обробки даних вони працюють аналогічно командам INCF f, d і DECF f, d. Основна відмінність від цих команд полягає в тому, що при нульовому результаті виконання команди INCFSZ f, d або DECFSZ f, d пропускається наступна команда. Це означає, що команди INCFSZ f, d та DECFSZ f, d можуть використовуватися для організації програмних циклів. Інша особливість цих команд у тому, що де вони впливають вміст бітів стану регістру STATUS .
NOP означає відсутність операції. Традиційно вона використовується для двох цілей. Перша – забезпечення синхронізації програми з часовими характеристиками різних пристроїв системи. Другим можливим варіантом є використання команди NOP видалення частини програмного коду. Внаслідок того, що код команди NOP складається зодних нулів, його легко ввести в пам'ять програм замість будь-якої іншої команди, не вдаючись до стирання та репрограмування всієї пам'яті програм.