
мпт лаб 3
.pdfЛабораторна робота № 3 Створення програмної затримки часу за допомогою циклів
Мета роботи: засвоїти метод створення затримок часу з використанням вкладених циклів
ТЕОРЕТИЧНІ ВІДОМОСТІ
Алгоритми управління і контролю, як правило, потребують використання затримок часу. Для цього мікроконтролерів використовують два способи:
1)програмну затримку за рахунок багатократного повторення команд з використанням вкладених циклів;
2)використання таймерів, вбудованих у мікросхему контролера.
При програмній затримці команди у вкладеному (внутрішньому) циклі повторюються стільки разів, скільки передбачено в його лічильнику. За цей час лічильник зовнішнього циклу змінюється тільки на одиницю. Тому для оцінки загального часу затримки треба множити час виконання внутрішнього циклу на число, занесене у лічильник зовнішнього циклу. У пропонованій нижче програмі для затримки часу використовується три цикли, вкладених один в інший.
ПОРЯДОК ВИКОНАННЯ ЛАБОРАТОРНОЇ РОБОТИ
1.Увійти у середовище MPLAB, обравши на робочому столі червоно-синю піктограму MPLAB
.
2.Створити новий проєкт, обравши з меню Project – Project Wizard – Далее. У вікні, що з'являється, вибрати мікросхему (Device) PIC16F877 – Далее – Далее. У пункті Create New Project File натиснути Browse – обрати папку D:\1Work і ввести ім'я проєкту, наприклад, 326.mcp, де 3 – номер лабораторної роботи, 2 – номер групи, 6 – номер студента за списком. Натиснути Далее – Далее – Готово.
3.Створити текстовий файл з тим же іменем і розширенням .asm. Для цього обрати мишкою меню File – Add New File to Project. Після появи з цим ім’ям задати вказане ім'я файлу (наприклад, 326.asm) і натиснути Save - Зберегти. У вікні .mcw (наприклад, 326.mcw) з’явиться ім’я створеного файлу.
4.Ввести текст програми на асемблері сімейства контролерів РІС16.
;****************************************************** ;ЛАБОРАТОРНА РОБОТА 3 ;Почергове включення світлодіодів
;******************************************************
LIST P=16F877
#INCLUDE "P16F877.INC"
;наступну директиву __CONFIG набрати в одному рядку, ;закінчуючи словом _LVP_OFF
__CONFIG _WDT_OFF & _BODEN_OFF & _XT_OSC & _LVP_OFF & _DEBUG_ON
HI |
EQU 0x20 |
;змінна зовнішнього циклу |
|
MID |
EQU 0x21 |
;змінна середнього циклу |
|
LO |
EQU 0x22 |
;змінна внутрішнього циклу |
|
COD |
EQU 1 ;тут замість слова БР слід ввести |
||
|
|
;в десятковій системі номер бригади! |
|
org 0x000 ; (РС)=0 |
|||
bsf |
STATUS,RP0 ;банк регістрів 1 |
||
;111111111111111111111111111111111111111 |
|||
movlw b'11101011' |
;PORTA - режим введення, |
||
movwf TRISA ; |
крім RA4, RA2 |
||
clrf |
TRISD ;PORTD - на виведення |
||
movlw b'10000110' |
; |
||
movwf ADCON1 |
;порт А дискретний |
||
bcf |
STATUS,RP0 ;банк регістрів 0 |
||
;000000000000000000000000000000000000000 |
|||
bsf |
PORTA,4 |
|
;встановити 1 у біті 4 порту A |
1
bcf |
PORTA,4 |
;встановити |
0 у біті 4 порту A |
clrf |
PORTD ;очистити порт D (вимкнути світлодіоди) |
||
bsf |
STATUS, C |
;встановити біт переносу С |
|
LOOP: rlf |
PORTD,f |
;зсув вліво |
вмісту PORTD |
call |
SEC |
;виклик підпрограми затримки |
|
goto |
LOOP |
;перехід на |
повторення дій |
;п/п затримки часу
;далі при оформленні написати коментар самостійно! ;У ньому вказати дію команд
SEC: movlw |
.42 |
movwf HI |
|
SEC1: movlw |
.46 |
movwf MID |
|
SEC2: movlw |
COD*.11 |
movwf LO |
|
SEC3: decfsz |
LO,f |
goto |
SEC3 |
decfsz |
MID,f |
goto |
SEC2 |
decfsz |
HI,f |
goto |
SEC1 |
return |
|
end |
|
5.Записати програму на диск (File – Save).
6.Виконати компіляцію програми Project – Make (F10 або відповідна піктограма) – Absolute. Після цього на екрані з'являється вікно результатів компіляції (Output).
7.Якщо з'явились повідомлення про помилки (Error), слід, ознайомившись з поясненням змісту помилки, двічі без паузи натиснути мишкою на цей рядок вікна Output. MPLAB зробить активним той рядок у тексті програми, де, ймовірно, зроблено помилку. Треба її виправити, далі так само й інші помилки. Потім повернутись до п. 7, поки не буде видано повідомлення "BUILD SUCCEEDED" ("Компіляція успішна"). При цьому створюється файл з тим же ім'ям і розширенням .hex. Закрити вікно Output.
8.Обрати режим симуляції: Debugger – Select Tool – MPLAB SYM.
9.Створити вікно спостереження (View – Watch). Занести до нього регістри PORTD, HI, MID, LO. Для цього у вікні Watch натиснути ліву чорну стрілку, обрати зі списку PORTD і натиснути кнопку Add SFR. У тому ж вікні натиснути праву стрілку та по-черзі обрати регістри LO, MID, HI, після кожного вибору натискати кнопку Add Symbol.
10.Встановити у програмі точки зупинки на командах:
call SEC, goto LOOP, goto SEC3, goto SEC2, goto SEC1.
Для цього на рядках цих команд зробити мишкою подвійний клік.
11.Задати частоту тактового генератора: Debugger – Settings – у закладці Osc / Trace позначити частоту 3,6864 MHz – Ok (така частота у лабораторного мікроконтролера).
12.Зробити скидання (F6) і пуск програми (F9). Виконання зупиниться на команді call SEC. Далі буде здійснено виклик підпрограми затримки часу. Щоб визначити цей час, слід вивести на екран вікно віртуального секундоміра (Debugger – StopWatch) і обнулити його (Zero). Записати в табл. 3.1 вміст регістрів PORTD, HI, MID, LO та секундоміру Stopwatch з графи Time у мікросекундах. У подальшому виконувати програму до чергової точки зупинки (F9) і заповнювати рядки таблиці після кожної зупинки.
13.Наближено розрахувати час виконання підпрограми затримки. Наприклад, для варіанта COD = 1:
Частота тактового генератора f = 3.6864 МГц.
Період тактового сигналу Тп = 1 / Тп = 1 / 3.6864 МГц = 0,27127 мкс. Час виконання команд без переходів і пропусків становить 4 такти
Тк = 4·0,27127 мкс = 1,085 мкс.
Команди з переходами виконуються вдвічі довше (2,170 мкс).
2

Час виконання команд тіла внутрішнього циклу (decfsz |
LO,f та goto SEC3) становить Ттв = 1,085 |
|||||||
+2,170 = 3,255 мкс. |
|
|
|
|
|
|
|
|
Час виконання внутрішнього циклу |
|
|
|
|
|
|
||
Твн = 11·COD·Ттв = 11·1·3,255 = 35,8 мкс. |
|
|
|
|
||||
Час виконання середнього циклу |
|
|
|
|
|
|
||
Тс = 46·Твн = 46·35,8 = 1646,8 мкс. |
|
|
|
|
|
|
||
Час виконання зовнішнього циклу (всієї підпрограми затримки) |
||||||||
Тз = 42·Тс = 42·1646,8 = 69166 мкс = 0,069166 с. |
|
|
|
|
||||
|
|
22.1. Результати аналізу програми |
||||||
Команда, на якій |
Вміст регістрів у 16-й системі |
Час за віртуальним |
|
|
||||
здійснено зупинку |
PORTD |
HI |
MID |
|
LO |
секундоміром, мкс |
|
|
call SEC |
0x01 |
0x00 |
0x00 |
|
0x00 |
0 |
|
|
goto SEC3 |
0x01 |
0x2E |
0x2E |
|
0x0A |
10 |
|
|
goto SEC3 |
0x01 |
0x2A |
0x2E |
|
0x09 |
13 |
|
|
goto SEC3 |
0x01 |
0x2A |
0x2E |
|
0x08 |
16 |
|
|
goto SEC3 |
0x01 |
0x2A |
0x2E |
|
0x07 |
20 |
|
|
Зняти точку зупинки з команди goto SEC3 (зняття здійснюється так само, як і її встановлення) та продовжити виконання програми (F9)
goto SEC2 |
0x01 |
0x00 |
0x00 |
0x00 |
|
44 |
goto SEC2 |
0x01 |
0x2A |
0x2D |
0x00 |
|
85 |
goto SEC2 |
0x01 |
0x2A |
0x2C |
0x00 |
|
125 |
goto SEC2 |
0x01 |
0x2A |
0x2B |
0x00 |
|
165 |
|
Зняти |
точку зупинки з команди goto SEC2 |
|
|||
|
і продовжити виконання програми (F9) |
|
||||
goto SEC1 |
0x01 |
0x2A |
0x2B |
0x00 |
|
1853 |
goto SEC1 |
0x01 |
0x29 |
0x00 |
0x00 |
|
3704 |
goto SEC1 |
0x01 |
0x28 |
0x00 |
0x00 |
|
5556 |
goto SEC1 |
0x01 |
0x27 |
0x00 |
0x00 |
|
7407 |
|
Зняти |
точку зупинки з команди goto SEC1 |
|
|||
|
і продовжити виконання програми (F9) |
|
||||
goto LOOP |
0x01 |
0x00 |
0x00 |
0x00 |
|
77753 |
call SEC |
0x02 |
0x00 |
0x00 |
0x00 |
|
77756=Tрс |
goto LOOP |
0x02 |
0x00 |
0x00 |
0x00 |
|
155509 |
call SEC |
0x04 |
0x00 |
0x00 |
0x00 |
|
155512 |
goto LOOP |
0x04 |
0x00 |
0x00 |
0x00 |
|
233265 |
call SEC |
0x08 |
0x00 |
0x00 |
0x00 |
|
233268 |
14.З таблиці визначити час Tpc у момент першої зміни стану PORTD. Вважаючи точним час перемикання світлодіодів порта В за віртуальним секундоміром комп'ютера Трс, обчислити відносну похибку для розрахункового часу затримки Тз:
=11%
15.Приєднати програматор PICkit2 або PICkit3 до входу USB комп'ютера (до плати мікроконтролера він теж має бути приєднаний). Увімкнути живлення демоплати. У середовищі MPLAB обрати Debugger–Select Tool–PICkit 2 (або PICkit 3 – залежно від розташованого на робочому місці програматора). Якщо з'являється віконце з інформацією про небезпеку, що може статись, коли мікроконтролер розрахований на живлення 3,3 В, обрати OK. Прошити мікроконтролер,
натиснувши піктограму або в меню Debugger–Program. З комп'ютера виконати старт програми мікроконтролера
або F9.
16.Візуально визначити час Твіз перемикання сусідніх світлодіодів, визначивши час значної кількості перемикань та поділивши цей час на їх кількість. Обчислити відносну похибку
3
17.Твіз=0.08
18.Похибка = 0,028 = 2,8%
=2,8%
ЗМІСТ ЗВІТУ Звіт має містити: назву та мету лабораторної роботи, скорочений порядок виконання
лабораторної роботи, блок-схему алгоритму, програму з коментарем, перелік імен регістрів спеціального призначення, що використовуються у досліджуваній програмі, формат та опис дії кожного виду команд, що вперше зустрічаються у дослідженій програмі мікроконтролера, таблицю та результати розрахунків, відповіді на контрольні запитання.
КОНТРОЛЬНІ ЗАПИТАННЯ
1.Як створюються затримки часу?
2.Як виконуються команди call k і return?
3.Як створити звичайний цикл?
4.Як скласти вкладені цикли?
5.Як встановити точку зупинки на заданій команді?
6.Як у середовищі MРLAB можна визначати точний час виконання програми або її фрагментів?
7.Які недоліки програмної затримки часу?
4