Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МЕТОДИЧНІ РЕКОМЕНДАЦІЇ ДО ВИКОНАННЯ ЛАБОРАТОРНИХ РОБІТ Компьютерная электроника.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.12 Mб
Скачать

Питання і завдання для повторення:

1. Що таке АЦП прямого перетворення, в яких пристроях його доцільно застосовувати?

Лабораторна робота № 15 Система команд микроконтроллера pic16fxх

Мета роботи: вивчення системи команд мікроконтролера (МК) PIC16F7Х; отримання навичок програмування МК на мові Ассемблер.

Програмне забезпечення: програмне забезпечення комп'ютерного моделювання електронних схем (програма Proteus (ISIS), MPLAB IDE).

Короткі теоретичні відомості і методичні вказівки

PIC16CXX - це 8-розрядні МК з RISCархітектурой, вироблені фірмою Microchiр Technology. Це сімейство МК відрізняється низькою ціною, низьким енергоспоживанням і високою швидкістю.

Мікроконтролери мають вбудовані ЕППЗУ програми, ОЗУ даних і випускаються в 18 і 28 вивідних корпусах.

PIC OTP - це одноразово програмовані користувачем контролери, призначені для повністю протестованих і закінчених виробів, в яких не буде відбуватися подальших змін коду. Ці контролери випускаються в дешевих пластикових корпусах із заздалегідь заданими типом зовнішнього генератора - кварцовим або RC. Для налагодження програм і макетування випускається варіант контролерів з ультрафіолетовим стиранням.

Ці контролери допускають велике число циклів запису / стирання і мають дуже малий час стирання (звичайно 1-2 хв). Проте ціна таких контролерів істотно вище, ніж однократно програмувальних, тому їх невигідно встановлювати в серійну продукції.

Для виробів, програма яких може мінятися або містить будь-змінні частини, таблиці, параметри калібрування, ключі і т. д., випускається електрично стирається і перепрограмувальний контролер PIC16F84. Він також містить електрично перепрограммируемое ПЗУ даних.

Основним призначенням МК PIC16/17, як випливає з абревіатури PIC (Periрheral Interface Controller), є виконання інтерфейсних функцій. Цим пояснюються особливості їх архітектури:

        • RISC-система команд, що характеризується малим набором одноадресних інструкцій (33, 35 або 55), кожна з яких має довжину в одне слово (12, 14 або 16 біт) і більшість виконується за один машинний цикл. В системі команд відсутні складні арифметичні команди (множення, ділення), гранично скорочений набір умовних переходів;

        • Висока швидкість виконання команд: при тактовій частоті 20 МГц час машинного циклу складає 200 нс (швидкодія дорівнює 5 млн операцій / с);

        • Наявність потужних драйверів (до 24 мА) на лініях портів введення / виводу;

        • Низька споживана потужність;

        • Орієнтація на цінову нішу гранично низької вартості, яка визначає використання дешевих корпусів з малою кількістю виводів (8, 14, 18, 28), відмова від зовнішніх шин адреси і даних (крім PIC17C4X), використання спрощеного механізму переривань і апаратного (програмно недоступного) стека.

Аналіз архітектури МК PIC з точки зору їх програмування і налагодження систем дозволяє зробити наступні висновки.

RISC-система команд забезпечує високу швидкість виконання інструкцій, але викликає труднощі і зниження продуктивності при програмуванні нетривіальних алгоритмів. Оскільки всі інструкції в системі команд є одноадресних, завантаження константи в будь-який з регістрів вимагає двох інструкцій. Спочатку потрібно завантажити константу в робочий регістр W, а потім переслати його вміст в потрібну комірку пам'яті даних:

movw 12h

movwf REG

Аналогічно, всі бінарні арифметико-логічні операції доводиться виконувати із залученням робочого регістра W.

Висока швидкодія в значній мірі досягається за рахунок використання конвеєра команд.

Мікроконтролери сімейства PIC мають дуже ефективну систему команд, що складається всього з 35 інструкцій. Всі інструкції виконуються за один цикл, за винятком умовних переходів і команд, що змінюють програмний лічильник, які виконуються за 2 циклу. Один цикл виконання інструкції складається з 4 періодів тактової частоти. Таким чином, при частоті 4 МГц час виконання інструкції складає 1 мкс. Кожна інструкція складається з 14 біт, які поділяються на 2 поля: код операції та операнд (можлива маніпуляція з регістрами, осередками пам'яті і безпосередніми даними).

Висока швидкість виконання команд в PIC досягається за рахунок використання двохшинної гарвардської архітектури замість традиційної одношинної фоннеймановской. Гарвардська архітектура грунтується на наборі регістрів з розділеними шинами і адресним простором для команд і для даних. Hабор регістрів означає, що всі програмні об'єкти, такі як порти вводу / виводу, осередки пам'яті і таймер, являють собою фізично реалізовані апаратні регістри.

Пам'ять даних (ОЗУ) для PIC16CXX має розрядність 8 біт, пам'ять програм (ЕППЗУ) має розрядність 12 біт для PIC16C5X і 14 біт для PIC16C7X. Використання гарвардської архітектури дозволяє досягти високої швидкості виконання бітових, байтових і реєстрових операцій. Крім того, Гарвадської архітектура допускає конвеєрне виконання інструкцій, коли одночасно виконується поточна інструкція і зчитується наступна.

У традиційній же фоннеймановской архітектурі команди і дані передаються послідовно в часі через одну поділювану або мультиплексируемость шину, тим самим знижуючи швидкодію МК.

Набір команд PIC

Перейдемо до опису всього набору команд МК сімейства PIC. Попередньо Зробити деякі зауваження.

По-перше, синтаксис написання команди передбачає зазначення двох полів: мнемонічне позначення коду операції та операнд, для якого використовується узагальнене позначення у вигляді символу f. Це означає, що залежно від способу адресації в поле операнда може перебувати:

  1. адреса операнда (пряма адресація); дуже часто замість адреси вказується символічне ім'я операнда, однак у цьому випадку за допомогою псевдокоманди equ цьому імені ставиться у відповідність адреса вільної комірки пам'яті, наприклад: Cnt equ 20h;

  2. ім'я регістра INDF (непряма адресація); в цьому випадку адреса операнда знаходиться в спеціальному регістрі непрямої адресації FSR;

  3. операнд (безпосередня адресація).

По-друге, в командах, в яких передбачена операція з двома операндами, перший операнд знаходиться в комірці пам'яті, зазначеної за допомогою символу f, другий операнд завжди міститься в робочому регістрі W.

По-третє, в ряді команд крім результату формуються ознаки результату, які записуються в спеціальний регістр

STATUS. Ознака С (CARRY) встановлюється в 1 при виникненні переносу зі старшого (знакового) розряду при додаванні і при відсутності позички при відніманні. Ознака DC (DIGIT CARRY) встановлюється в 1 при виникненні перенесення з молодшої тетради в старшу при додаванні. Ознака Z (ZERO) встановлюється в 1, якщо результат операції дорівнює 0.

Нарешті, в ряді команд після символу f через кому знаходиться символ d, званий бітом напряму. Він вказує місце, куди буде поміщений результат операції, виконаної в команді: якщо d = 0 (або W), результат записується в робочий регістр W (без зміни вмісту комірки пам'яті), якщо d = 1 (або f), результат записується в комірку пам'яті.

NOP

Не виконується ніяких дій. Ця інструкція зазвичай використовується в циклах тимчасової затримки або для точного налаштування часу виконання певної ділянки програми.

CLRW

Ця команда очищує робочий регістр W.

CLRF f

CLRF робить для будь-якого регістра те саме, що CLRW робить для робочого регістра W.

SUBWF f, d

Відняти вміст робочого регістра W з вмісту регістра f. Ця команда встановлює ознаки CARRY, DIGIT CARRY і ZERO в регістрі STATUS. Символ d (біт напрямку) після коми вказує адресу, куди буде поміщений результат виконання команди. Якщо d = 0, то результат поміщається в робочий регістр W, а якщо d = 1, то результат записується у вказаний в команді регістр f. Допускається замість значень 0 або 1 символу d вказати w і f відповідно.

ADDWF f, d

Скласти вміст робочого регістра W і регістра f. Ця команда встановлює ознаки CARRY, DIGIT CARRY і ZERO в регістрі STATUS. Символ d після коми означає адресу, куди буде поміщений результат виконання команди (див. попередню команду) .

SUBLW k

ADDLW k

Ці дві команди працюють абсолютно аналогічно вищеописаним, за тим винятком, що операція проводиться між робочим регістром W і байтовой константою, заданої в команді. Команда SUBLW віднімає вміст робочого регістра W з константи k, а команда ADDLW додає вміст робочого регістра W до константи k. Ці команди також встановлюють ознаки CARRY, DIGIT CARRY і ZERO. Результат виконання команди поміщається в робочий регістр W.

DECF f, d

INCF f, d

Команда DECF зменшує вміст заданого регістру на 1, а INCF збільшує вміст заданого регістру на 1. Результат може бути поміщений назад в заданий регістр (при d = 1) або в робочий регістр W (при d = 0). В результаті виконання цих команд може встановитися ознака ZERO в регістрі STATUS.

IORWF f, d

ANDWF f, d

XORWF f, d

Ці три команди виконують логічні дії АБО, І та ВИКЛЮЧАЮЧЕ АБО. Операція логічного складання АБО найчастіше використовується для установки окремих бітів в регістрах; операція логічного множення І використовується для скидання бітів. Коли над однаковими бітами виконується операція ВИКЛЮЧАЮЧЕ АБО, результат дорівнює 0. Тому операція ВИКЛЮЧАЮЧЕ АБО часто використовується для порівняння вмісту операндів.

IORLW k

ANDLW k

XORLW k

Ці три команди виконують ті ж дії, що і їх вищеописані аналоги, за тим винятком, що операція проводиться між робочим регістром W і константою, заданої в команді. Результат виконання команди поміщається в робочий регістр W.

MOVF f, d

Ця команда в основному використовується для пересилання вмісту регістра в робочий регістр W (d = 0). Якщо ж встановити d = 1, то ця команда завантажить регістр сам в себе, але при цьому біт ZERO в регістрі STATUS встановиться відповідно до вмістом регістра.

COMF f, d

Ця команда інвертує вміст заданого регістру. При d = 0 результат заноситься в робочий регістр W (вміст заданого регістру зберігається колишнім), а при d = 1 результат заміщає колишнє вміст заданого регістру.

DECFSZ f, d

INCFSZ f, d

При d = 1 команда DECFSZ зменшує на одиницю, а INCFZ збільшує на одиницю вміст заданого регістру і пропускає наступну команду, якщо вміст регістра стало рівним нулю.

При d = 0 результат записується в регістр W і наступна команда пропускається, якщо вміст робочого регістра W стало рівним нулю. Ці команди використовуються для формування тимчасових затримок, умов виходу з циклу і т. д.

SWAPF f, d

Ця команда змінює місцями напівбайт в заданому регістрі. Як і для інших команд, при d = 0 результат записується в робочий регістр W, а при d = 1 заноситься в регістр, заміщаючи колишнє його вміст.

RRF f, d C F C

RLF f, d C F C

В Асемблері 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 призначена для перекладу процесора в режим зниженого енергоспоживання. Після виконання цієї команди тактовий генератор процесора вимикається, і назад в робочий режим процесор можна перевести або по входу скидання, або по спрацьовуванню сторожового таймера, або по перериванню.

Система команд наведена в табл. П15.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 константу і використовується для організації таблиць даних в пам'яті програм. Формування ознак зазначено в останній графі табл. П15.1, самі ознаки фіксуються в молодших розрядах регістра STATUS (табл. П15.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. Після виходу з циклу вміст W і регістра STATUS записується в осередку 23, 24 і в поле коментаря відзначаються заключні значення всіх змінних. Далі для контролю ці значення в циклі Tra передаються в ПЕОМ по послідовному каналу і відображаються на екрані дисплея. Управління повертається на мітку Priem.

На закінчення зупинимося трохи докладніше на використовуваних підпрограмах. Для завантаження регістрів SPBRG і TXSTA в підпрограмі Init спочатку встановлюється перший регістровий банк. У регістрі TXSTA задається 8бітовий формат, дозвіл видачі, асинхронний режим і підвищена швидкість (табл. П15.2). При частоті кварцу 20 МГц і підвищеної швидкості завантаження десяткового числа d'129 'в регістр SPBRG забезпечує асинхронну передачу зі швидкістю 9600 бод. Потім встановлюється нульовий регістровий банк і в регістрі RCSTA задається дозвіл прийому та 8бітовий формат. Скидання регістра INTCON забороняє переривання.

Прийом байта підпрограмою Receiv починається з циклу очікування готовності на мітці RecA до установки прапора готовності RCIF в регістрі PIR1. Потім байт листується з буфера прийому RCREG в клітинку RxBuf. При видачі байта підпрограмою Transm він спочатку завантажується в буфер видачі TXREG, потім скидається прапор видачі TXIF і програма входить в цикл очікування Tr3 до установки прапора TXIF після закінчення видачі байта з буфера TXREG.