SWAPF f, dЦя команда змінює місцями напівбайт в заданому регістрі. Як і для інших команд, при d = 0 результат записується в робочий регістр W, а при d = 1 заноситься в регістр, заміщаючи колишнє його вміст.
RRF f, d C FC RLF f, d CFC В Асемблері PIC є дві команди зсуву - зрушення вправо через ознака C будь-якого регістра f (RRF) і зрушення вліво через ознака C будь-якого регістра f (RLF). Як і для інших команд, при d = 0 результат зсуву записується в регістр W, а при d = 1 залишається в регістрі f. У всіх випадках біт, що висувається з 8-бітного регістру f, записується як ознака C в регістр STATUS і формує тим самим значення ознаки C (CARRY), а на місце звільняється при зсуві розряду регістра f записується значення ознаки C з регістра STATUS, яке було сформовано до моменту виконання даної команди. При зсуві вліво (RLF) значення ознаки C записується в молодший біт регістра, а при зсуві вправо (RRF) - в старший біт регістра. Інструкції зсуву використовуються для виконання операцій множення і ділення, для послідовної передачі даних і для інших цілей.
BCF f, b BSF f, b Команди очищення біта BCF і установки біта BSF використовуються для роботи з окремими бітами в регістрах. Параметр b означає номер біта, з яким проводиться операція, і може приймати значення від 0 до 7.
BTFSC f, b BTFSS f, b Команди умовних переходів BTFSC і BTFSS перевіряють стан заданого біта в будь-якому регістрі і залежно від результату пропускають чи ні наступну команду. Команда BTFSC пропускає команду, якщо заданий біт скинутий, а команда BTFSS - якщо встановлений.
CALL k RETURN
Ці дві команди призначені для роботи з підпрограмами.
Команда CALL використовується для переходу на підпрограму за адресою, що задається в команді, а команда RETURN - для повернення з підпрограми. Обидві команди виконуються за 2 циклу. Адреса команди, наступної після команди CALL, запам'ятовується в стеку. Стек недоступний для звернення і використовується тільки при викликах підпрограм і поверненнях з них. Глибина стека, тобто число спеціальних регістрів, що входять до його складу, дорівнює 8. Тому з основної програми можна зробити не більше 8 вкладених викликів підпрограм. Останньою командою підпрограми завжди є команда RETURN, при виконанні якої адресу з стека записується в РС, і таким чином після повернення з підпрограми виконання основної програми продовжується з наступного після CALL команди. Відзначимо особливо, що оскільки в більшості випадків регістр W і регістр STATUS можуть бути використані в підпрограмі, їх вміст на момент виклику підпрограми буде втрачено. Тому при виклику підпрограми їх вміст потрібно зберегти у вільних ячейках пам'яті, а перед командою RETURN помістити команди, що відновлюють їх вміст на момент виклику підпрограми.
RETLW k RETFIE Існують ще дві команди, призначені для повернення з підпрограм. Команда RETLW записує при поверненні в робочий регістр W константу, задану в цій команді, а команда RETFIE використовується при поверненні з переривання.
Спеціальні команди
Залишилося згадати про двох спеціальних командах - CLRWDT і SLEEP.
Команда CLRWDT призначена для програмного скидання сторожового таймера (WDT). Ця команда має бути присутня в таких ділянках програми, щоб час виконання програми між двома сусідніми командами CLRWDT не перевищувало періоду спрацьовування сторожового таймера, тобто інтервалу часу, протягом якого WDT проходить всі стани і повертається в початковий стан (апаратний скидання). Програмне скидання не впливає на роботу системи, виникнення апаратного скидання вказує на наявність збою в роботі системи, викликаного зацикленням програми. Обробка переривання, викликаного апаратним скиданням, передбачає дії, спрямовані на усунення наслідків від збою. Команда SLEEP призначена для перекладу процесора в режим зниженого енергоспоживання. Після виконання цієї команди тактовий генератор процесора вимикається, і назад в робочий режим процесор можна перевести або по входу скидання, або по спрацьовуванню сторожового таймера, або по перериванню. Система команд наведена в табл. П11.1. Більшість команд виконується за 1 цикл (4 такту, 200 нс при F = 20 МГц). Команди байтовой обробки включають звичайний набір арифметичних, логічних і зсувних операцій. При наявності двох операндів один з них завжди знаходиться в акумуляторі W. Для організації циклів і умовних переходів в програмі використовуються команди пропуску DECFSZ, INCFSZ, BTFSC, BTFSS, які в разі виконання заданої умови пропускають наступну команду - збільшують лічильник команд PC відразу на 2. При переходах по команді GOTO 11бітовий адресу переходу з коду команди завантажується в розряди PC.10-0, а два старших розряду беруться з 5бітового регістра PCLATH (PC.12-11 = PCLATH. 4-3), т. е. без переустановки PCLATH перехід можливий в межах 2 Кслов. Аналогічно формується адреса переходу командою CALL, проте вона попередньо рятує в стеку вміст PC. Апаратний стек глибиною 8 слів користувачеві недоступний, завантаження PC з стека здійснюється командами RETURN, RETFIE, RETLW, причому остання команда перед поверненням завантажує в W константу і використовується для організації таблиць даних в пам'яті програм. Формування ознак зазначено в останній графі табл. П11.1, самі ознаки фіксуються в молодших розрядах регістра STATUS (табл. П11.2). При запису програм на Асемблері ім'я команди можна вказувати малими або великими літерами, в імені змінних ці літери мають різні значення. Цілі числа можна задавати в двійковому, десятковому чи шістнадцятковому форматі в слідую щей формі:
MOVLW b'10100110 '; двійкове чісло11 MOVLW d'166 '; десяткове число MOVLFSRW 0A6; шестнадцатірічное число
Далі в основному використовується шестнадцатірічное форма представлення чисел. У звичайному тексті і поле коментаря ми будемо використовувати запис типу A6, однак на Асемблері слід записувати 0A6, так як шестнадцатірічное число повинно починатися з цифри. Для більшості команд байтовой обробки можливі 2 варіанти, наприклад: ADDWF Adr1, w; W = W + (Adr1) ADDWF Adr1, f; (Adr1) = W + (Adr1)
У першому випадку біт d в коді команди дорівнює 0 і сума залишається в акумуляторі W, у другому випадку d = 1 і сума залишається в осередку з адресою Adr1. Адреса Adr1 може бути визначений на початку програми як 8-розрядний, однак в код команди транслятор поміщає лише 7 молодших розрядів, а старший розряд адреси вибирається з 5го біта регістра STATUS (це біт реєстрового банку RP0). Якщо Adr1 = 20, то при RP0 = 0 повна адреса буде 20, а при RP0 = 1 повний адресу з ставить A0. Необхідність перемикання реєстрового банку RP0 створює певні незручності при складанні програм. Їх можна уникнути при використанні непрямої адресації, якщо попередньо завантажити 8-розрядний адресу в регістр непрямої адресації FSR:
MOVLW Adr1; W = Adr1 MOVWF FSR; (FSR) = W ADDWF INDF, f; ((FSR)) = ((FSR)) + W
Нульовий адресу INDF в коді команди ініціює вибірку повного 8-розрядної адреси з регістра FSR, тобто остання команда завжди працює з повною адресою 20. Непряму адресацію зазвичай використовують при необхідності модифікації адреси в програмі, для чого достатньо змінити вміст FSR. При виконанні роботи необхідно для заданого варіанта програми вказати в полі коментаря динаміку зміни вмісту акумулятора W і осередків 20, 21, 22, 23. Як приклад розглянемо наступний варіант програми: Title “Lab1.asm” ; list p=16c74; processor type errorlevel 1, (305)12 ; #include “p16c74.inc” ; Buf1 equ 20 Cnt equ 23 RxBufequ 24 org 0; стартовый переход movlw 0 movwf PCLATH goto Start org 100; программа пользователя Start; начальная установка call ConstInit Priem caLL Receiv movlw 2 xorwf PORTA,f movlw 3 movwf Cnt movlw Buf1 movwf FSR bsf STATUS,C movf RxBuf,w ; if (RfBuf)=21 ; W 20 W 20 21 W 20 21 22 23 Beg1 movwf INDF; 21 21 4 3 67 43 86 67 CF 86 rlf INDF,w; 43 21 86 67 43 0C 67 CF 86 addwf INDF,f; 43 64 86 67 C9 0C 67 CF 92 iorwf INDF,f; 43 67 86 67 CF 0C 67 CF 9E incf FSR,f decfsz Cnt,f End1 goto Beg1 ; W 20 21 22 23 movwf INDF; 0C 67 CF 9E 0C incf FSR,f movf STATUS,w movwf INDF movlw 513 movwf Cnt movlw Buf1 movwf FSR Tra movf INDF,w call Transm incf FSR,f decfsz Cnt,f goto Tra goto Priem ConstInit bsf STATUS,RP0 bcf TRISA,1; диод movlw b’10000011' movwf OPTION_REG movlw d’129' movwf SPBRG movlw b’00100100' movwf TXSTA bcf STATUS,RP0 clrf INTCON clrf PORTC movlw b’10010000' movwf RCSTA return Receiv; прием байта в RxBuf RecA btfss PIR1,RCIF; check for received data goto RecA RecB movf RCREG,w movwf RxBuf return Transm; выдача байта из W movwf TXREG; transmit byte to PC bcf PIR1,TXIF tr3 btfss PIR1,TXIF goto tr3 return end
На початку програми визначаються значення використовуваних змінних, тобто задається розподіл оперативної пам'яті. Оператор ORG фіксує початкова адреса розміщення кодів програми в постійній пам'яті. Як згадувалося раніше, завантажувальний модуль передає управління на мітку Start і підпрограма ConstInit виконує настройку асинхронного каналу на швидкість 9600 бод. На мітці Priem програма очікує приходу байта з ПЕОМ. Прийнятий підпрограмою Receiv байт записується в комірку RxBuf, перемикається світлодіод командою XORWF PORTA, f і початкова адреса Buf1 завантажується в Регистр FSR. Встановлюється біт переносу C в регістрі STATUS, і в лічильник циклу Cnt завантажується число 3. Ця частина програми ідентічна для всіх варіантів. З мітки Beg1 починається конкретний варіант програми. У акумулятор W завантажується початкове значення, і цикл з кількох команд повторюється 3 рази. Вміст акумулятора W і осередків ОЗУ при кожному проході циклу слід вказати в полі коментаря. У циклі виконуються зрушення, арифметичні і логічні команди. Слід враховувати, що біт перенесення формується арифметичними командами і включається в кільце зсуву при виконанні команд RLF, RRF. На закінчення зупинимося трохи докладніше на використовуваних підпрограмах. Для завантаження регістрів SPBRG і TXSTA в підпрограмі Init спочатку встановлюється перший регістровий банк. У регістрі TXSTA задається 8бітовий формат, дозвіл видачі, асинхронний режим і підвищена швидкість (табл. П11.2). При частоті кварцу 20 МГц і підвищеної швидкості завантаження десяткового числа d'129 'в регістр SPBRG забезпечує асинхронну передачу зі швидкістю 9600 бод. Потім встановлюється нульовий регістровий банк і в регістрі RCSTA задається дозвіл прийому та 8бітовий формат. Скидання регістра INTCON забороняє переривання. Прийом байта підпрограмою Receiv починається з циклу очікування готовності на мітці RecA до установки прапора готовності RCIF в регістрі PIR1. Потім байт листується з буфера прийому RCREG в клітинку RxBuf. При видачі байта підпрограмою Transm він спочатку завантажується в буфер видачі TXREG, потім скидається прапор видачі TXIF і програма входить в цикл очікування Tr3 до установки прапора TXIF після закінчення видачі байта з буфера TXREG.
|