- 5.3. Система команд мікроконтролерів підгрупи PIC16F8X 5.3.1. Перелік і формати команд
- 5.3.2. Команди роботи з байтами
5.3. Система команд мікроконтролерів підгрупи PIC16F8X 5.3.1. Перелік і формати команд
Наши партнеры ArtmMisto
Мікроконтролери підгрупи PIC16F8X мають просту і ефективну систему команд, що складається всього з 35 команд.
Кожна команда МК підгрупи PIC16F8X є 14-бітове слово, розділене на код операції (OPCODE), і поле для одного і більше операндів, які можуть брати участь або не брати участь в цій команді. Система команд PIC16F8X є ортогональною і включає в себе команди роботи з байтами, команди роботи з бітами і операції з константами і команди управління. В таблиці 5.10 наведені описи полів команд.
Таблиця 5.10. Описи полів команд МК сімейства PIC16CXXX. Поле Опис f Адреса регістра w Робочий регістр b Номер біта в 8-розрядному регістрі k Константа x Не використовується. Асемблер формує код з x = 0 d
Регістр призначення:
d = 0 - результат в регістрі w
d = 1 - результат в регістрі f
За замовчуванням d = 1
label Ім'я мітки TOS Beршіна стека PC Лічильник команд PCLATH Регістр PCLATH GIE Біт дозволу всіх переривань WDT Сторожовий таймер / TO Тайм-аут / PD екранна dest Регістр призначення: робочий регістр w або регістр, заданий в команді [] Необов'язкові параметри () Зміст Присвоєння <> Поле номера біта з набору
Для команд роботи з байтами f позначає регістр, з яким проводиться дію; d - біт, що визначає, куди покласти результат. Якщо d = 0, то результат буде поміщений в регістр w, при d = 1 результат буде поміщений в регістр "f", згаданий в команді.
Для команд роботи з бітами b позначає номер біта, який бере участь в команді, а f - це регістр, в якому даний біт розташований.
Для команд передачі управління і операцій з константами, k позначає восьми- або одіннадцатібітную константу.
Майже всі команди виконуються протягом одного командного циклу. У двох випадках виконання команди займає два командних циклу:
- перевірка умови і перехід;
- зміна програмного лічильника як результат виконання команди.
Один командний цикл складається з чотирьох періодів генератора. Таким чином, для генератора з частотою 4 МГц час виконання командного циклу буде 1 мкс.
Основні формати команд МК зображені на Мал. 5.15 .
Система команд МК підгрупи PIC16F8X приведена в табл. 5.11 .
Мал.5.15.
Основні формати команд. Таблиця 5.11. Система команд МК підгрупи PIC16F8X. Мнемоніка Опис команди Цикли Біти стану Прим. ADDWF f, d Додавання W з f 1 C, DC, Z 1, 2 ANDWF f, d Логічне І W і f 1 Z 1, 2 CLRF f Скидання регістра f 1 Z 2 CLRW Скидання регістра W 1 Z COMF f, d Інверсія регістра f 1 Z 1, 2 DECF f, d Декремент регістра f 1 Z 1, 2 DECFSZ f, d Декремент f, пропустити команду, якщо 0 1 (2) 1, 2, 3 INCF f, d Інкремент регістра f 1 Z 1 , 2 INCFSZ f, d Інкремент f, пропустити команду, якщо 0 1 (2) 1, 2, 3 IORWF f, d Логічне АБО W і f 1 Z 1, 2 MOVF f, d Пересилання регістра f 1 Z 1, 2 MOVWF f Пересилання W в f 1 NOP - Холоста команда 1 RLF f, d Зсув f вліво через перенос 1 C 1, 2 RRF f, d Зсув f вправо через перенос 1 C 1, 2 SUBWF f, d Віднімання W з f 1 C, DC, Z 1, 2 SWAPF f, d Обмін місцями тетрад в f 1 1, 2 XORWF f, d Що виключає Або W і f 1 Z 1, 2 BCF f, b Скидання біта в регістрі f 1 1, 2 BSF f, b Установка біта в регістрі f 1 1, 2 BTFSC f, b Пропустити команду, якщо біт в f дорівнює нулю 1 (2) 3 BTFSS f, b Пропустити команду, якщо біт в f дорівнює одиниці 1 (2) 3 ADDLW k Додавання константи і W 1 C, DC, Z ANDLW k Логічне і константи і W 1 Z CALL k Виклик підпрограми 2 CLRWDT - Скидання сторожового таймера WDT 1 / TO, / P GOTO k Перехід за адресою 2 IORLW k Логічне АБО константи і W 1 Z MOVLW k Пересилання константи в W 1 RETFIE - Повернення з переривання 2 RETLW k Повернення з підпрограми з завантаженням константи в W 2 RETURN - Повернення з підпрограми 2 SLEEP - Перехід в режим SLEEP 1 / TO, / P SUBLW k Віднімання W з константи 1 C, DC, Z XORLW k виключає Або константи і W 1 Z
Примітки до таблиці:
- Якщо модифікується регістр вводу / виводу (наприклад, MOVF PORTB, 1), то використовується значення, прочитуване з висновків. Наприклад, якщо у вихідний засувці порту, включеного на введення, знаходиться "1", а зовнішній пристрій формує на цьому висновку "0", то в розряді даних буде записаний "0".
- Якщо операндом команди є вміст регістра TMRO (і, якщо допустимо, d = 1), то попередній дільник, якщо він підключений до TMRO, буде скинуто.
- Якщо в результаті виконання команди змінюється лічильник команд або виконується перехід з перевірки умови, то команда виконується за два цикли. Другий цикл виконується як NOP.
5.3.2. Команди роботи з байтами
Команди роботи з байтами використовуються в PIC МК для пересилання даних між регістрами і виконання математичних операцій над їх вмістом. Незважаючи на відносно невеликий набір команд, вони дозволяють реалізувати цілий ряд операцій. Це пов'язано, зокрема, з можливістю вказати в команді адреса розміщення результату операції.
Перевагою системи команд є також можливість використання різних способів звернення до регістрів. Адреса регістра може бути вказаний безпосередньо в команді відповідним 7- двійкового полем f. При цьому доступ можливий тільки до даних, розташованим в межах поточного банку даних. Адресація даних може здійснюватися і за допомогою індексного регістра FSR, шляхом звернення до регістру непрямої адресації INDF, розташованому за нульовим адресою.
Пересилання даних виконується за допомогою двох команд: MOVF і MOVWF, призначення яких істотно різниться. Команда MOVF використовується для установки біта нульового результату в залежності від вмісту певного регістра і може застосовуватися для його завантаження в регістр w. Команда MOVWF використовується для запису вмісту робочого регістра w в зазначений реєстр МК. Якщо в якості цього регістра вказується INDF, то адреса регістра призначення вибирається з регістра FSR. При виконанні даної команди біти стану не змінюються.
Спеціальні команди 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 складається з одних нулів, його легко ввести в пам'ять програм замість будь-якої іншої команди, не вдаючись до стирання і репрограммірованію всієї пам'яті програм.