
мпт 04 6 16 Скудря
.pdf
Лабораторна робота № 4
Створення затримки часу за допомогою переривань від таймера Мета роботи: засвоїти метод створення затримок часу з використанням таймера TMR0
ТЕОРЕТИЧНІ ВІДОМОСТІ
У мікроконтролерів PIC16хххх на кристалі кремнію, крім ядра мікропроцесора, передбачено розташування різних допоміжних модулів. Їх використання значно спрощує програмування, підвищує продуктивність роботи, скорочує розмір програм. До таких модулів відносяться таймери, що дозволяють отримувати затримки часу або підраховувати зовнішні події, сигнал про які надходить на вхід контролера.
Контролер PIC16F877 має 3 модулі таймерів: восьмирозрядний таймер/лічильник TMR0, шістнадцятирозрядний таймер TMR1 та восьмирозрядний таймер TMR2. Вони можуть використовуватись як окремо, так і для забезпечення роботи інших модулів, наприклад, модуля ССР (захоплення/порівняння/широтно-імпульсної модуляції).
Створення затримок часу іншим способом, за рахунок багаторазового виконання вкладених циклів (див. лабораторну роботу № 3), завантажує процесор пустими операціями, тоді як часто в цей час необхідно реалізовувати важливі операції, передбачені алгоритмом контролю, управління та ін.
Значно ефективніше використовувати для затримок таймери. Тоді процесор виконує декілька команд, які програмують таймер на задану затримку. Далі робота таймера і процесора протікає паралельно. Процесор виконує передбачені алгоритмом команди, а таймер одночасно з цим відраховує задану затримку. Після її завершення (переповнення таймера з h'FF' до h'00') автоматично встановлюється в "1" прапорець T0IF, який може бути перевірений програмно. А встановивши попередньо "1" в біті дозволу переривання T0IE, можна після відрахованої таймером затримки автоматично перейти до підпрограми обробки переривання. Функціональну схему таймера подано на рис. 4.1, а регістри, пов'язані з його роботою, у табл. 4.1.
4.1. Регістри, пов'язані з роботою таймера TMR0
Адреса |
Назва |
|
Біт 7 |
|
|
Біт 6 |
Біт 5 |
|
Біт 4 |
|
|
Біт 3 |
|
Біт 2 |
|
Біт 1 |
|
Біт 0 |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
0x81 |
OPTION_REG |
|
|
|
|
|
|
|
|
T0CS |
T0SE |
|
|
PSA |
|
PS2 |
|
PS1 |
|
PS0 |
|||
RBPU |
INTEDG |
||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
0x0B |
INTCON |
|
GIE |
|
|
|
|
T0IE |
|
|
|
|
|
|
T0IF |
|
|
|
|
|
|
||
|
PEIE |
INTE |
RBIE |
INTF |
RBIF |
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1

Переддільник може бути під'єднаний до TMR0, якщо встановити PSA = 0, або до сторожового таймера WDT (PSA = 1). Коефіцієнт ділення переддільника Кп задається бітами PS2…PS0 (табл. 4.2).
Коли біт T0CS = 0, TMR0 працює від внутрішнього тактового генератора, збільшуючи свій вміст на одиницю після кожних Кп машинних циклів.
Якщо біт T0CS = 1, джерелом імпульсів стає пристрій, підключений ззовні до входу мікроконтролера RA4. Активний фронт цього сигналу визначає біт T0SЕ.
4.2. Варіанти задання коефіцієнтів ділення переддільника
|
PS2 |
|
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
|
PS1 |
|
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
|
PS0 |
|
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
Коефіцієнт ділення |
PSA=0 |
TMR0 |
2 |
4 |
8 |
16 |
32 |
64 |
128 |
256 |
переддільника Kп |
PSA=1 |
WDT |
1 |
2 |
4 |
8 |
16 |
32 |
64 |
128 |
Використання переддільника дозволяє значно розширити діапазон можливих затримок таймера
TMR0.
Алгоритм програми (рис. 4.2) передбачає підключення переддільника до таймера TMR0 з коефіцієнтом ділення частоти Кп = 256. Таймер починає рахунок з числа N = 10·Br=10*13=130, де Br
– номер бригади. Оскільки при частоті генератора 3,6864 МГц машинний цикл триває Тмц=1,085 мкс,
переповнення таймера настає через |
|
ТTMR0 = Кп (256 – N) Тмц мкс = 256 (256 – 10·Br) 1,085 мкс. = |
=278 (256 – |
130)=35028 мкс |
(4.1) |
Зовнішній лічильник COUNT після кожного переривання зменшується на одиницю. Коли після трьох переривань він дораховує до нуля, відновлюється його початкове значення і за допомогою команди зсуву засвічується наступний світлодіод. Це відбувається через час
2

Тп = 3 ТTMR0=3*35028=105084мкс .
(4.2)
Рис. 4.2 – Алгоритм управління світлодіодами з затримкою від таймера TMR0
ПОРЯДОК ВИКОНАННЯ ЛАБОРАТОРНОЇ РОБОТИ
1.Увійти у середовище MPLAB, обравши на робочому столі піктограму MPLAB .
2.Створити новий проєкт, обравши з меню Project – Project Wizard – Далее. У вікні, що з'являється, вибрати мікросхему (Device) PIC16F877 – Далее – Далее. У пункті Create New Project File натиснути Browse – обрати папку D:\1Work і ввести ім'я проєкту, наприклад, 426.mcp, де 4 – номер лабораторної роботи, 2 – номер групи, 6 – номер студента за списком. Натиснути Далее – Далее – Готово.
3.Створити текстовий файл з тим же іменем і розширенням .asm. Для цього обрати мишкою меню File – Add New File to Project. Після появи з цим ім’ям задати вказане ім'я файлу (наприклад, 426.asm) і натиснути Save - Зберегти. У вікні .mcw (наприклад, 426.mcw) з’явиться ім’я створеного файлу.
4.Ввести текст програми.
Текст програми:
;******************************************************
;ЛАБОРАТОРНА РОБОТА 4
;Затримка часу з використанням переривання від таймера TMR0 ;******************************************************
LIST P=16F877 ;тип мікропроцесора
3
#INCLUDE "P16F877.INC" |
;підключення файла |
||||
|
|
|
|
|
;стандартних імен |
;директиву |
__CONFIG набрати в одному рядку, |
||||
;закінчуючи словом _LVP_OFF |
|||||
__CONFIG _WDT_OFF & _BODEN_OFF & _XT_OSC & _LVP_OFF &_DEBUG_ON |
|||||
COUNT |
EQU |
|
0x24 |
|
|
Br EQU 16 ;тут замість БР введіть номер бригади |
|||||
org |
0x0 |
|
; (РС) = 0 |
||
nop |
|
|
|
|
|
goto |
main |
|
;Безумовний перехід |
||
org |
h'4' |
|
|
|
|
inttmr: movlw |
.10*Br |
;початок п/п переривання |
|||
movwf TMR0 |
|
; 10*Br --> TMR0 |
|||
bcf |
INTCON,T0IF |
;0 --> T0IF |
|||
decfsz |
COUNT,f |
;(COUNT)-1 і пропустити, якщо = 0 |
|||
vert: retfie |
|
|
;вертання з п/п переривань (GIE = 0) |
||
movlw |
.3 |
|
|
|
|
movwf COUNT ;відновити лічильник COUNT |
|||||
rrf |
PORTD,f |
|
;зсув вправо порта D |
||
switch: retfie |
|
|
;вертання з п/п переривань (GIE = 0) |
||
main: |
|
|
|
;ініціалізація: |
|
bsf |
STATUS,RP0 ;банк регістрів 1 |
||||
;111111111111111111111111111111111111111 |
|||||
movlw b'11101011' |
;PORTA - режим введення, |
||||
movwf TRISA ; |
крім RA4, RA2 |
||||
clrf |
TRISD ;PORTD - на виведення |
||||
movlw b'10000110' |
; |
|
|||
movwf ADCON1 |
;порт А дискретний |
||||
movlw b'00000111' ;включити до таймера TMR0 |
|||||
;переддільник та встановити |
|||||
movwf |
OPTION_REG ; його коефіцієнт ділення Кп = 256 |
||||
bcf |
STATUS,RP0 ;банк регістрів 0 |
||||
;000000000000000000000000000000000000000 |
|||||
bsf |
PORTA,4 |
|
;встановити 1 у біті 4 порту A |
||
bcf |
PORTA,4 |
|
;встановити 0 у біті 4 порту A |
movlw b'10000000'
movwf PORTD ;вивести байт у зачіпку порту D
bcf |
STATUS, RP0 |
;Обрати банк регістрів 0 |
||
movlw .10*Br |
|
|
||
movwf TMR0 |
; 10*Br --> TMR0 |
|||
movlw .3 |
|
|
|
|
movwf COUNT ;3 --> COUNT |
|
|||
pochat: bsf INTCON,T0IE |
;дозвіл переривання таймера 0 |
|||
bsf |
INTCON,GIE ;глобальний дозвіл переривань |
|||
bcf |
STATUS,C |
; 0 --> C |
||
loop: goto |
loop |
;зациклення |
||
end |
|
|
|
|
5.Записати програму на диск (File – Save).
6.Виконати компіляцію програми Project – Make (F10 або відповідна піктограма) – Absolute. Після цього на екрані з'являється вікно результатів компіляції (Output).
7.Якщо з'явились повідомлення про помилки (Error), слід, ознайомившись з поясненням змісту помилки, двічі без паузи натиснути мишкою на цей рядок вікна Output. MPLAB зробить активним той рядок у тексті програми, де, ймовірно, зроблено помилку. Треба її виправити, далі так само й інші помилки. Потім повернутись до п. 7, поки не буде видано повідомлення "BUILD SUCCEEDED" ("Компіляція успішна"). При цьому створюється файл з тим же ім'ям і розширенням .hex. Закрити вікно Output.
4

8.Обрати режим симуляції: Debugger – Select Tool – MPLAB SYM.
9.Створити вікно спостереження (View – Watch). Занести до нього регістри COUNT, TMR0, PORTD: у вікні Watch натиснути справа чорний трикутник, обрати зі списку COUNT і натиснути кнопку Add Symbol. У тому ж вікні натиснути лівий трикутник та почергово обрати регістри TMR0, PORTD, після кожного вибору натискати кнопку Add SFR.
10.Встановити у програмі точки зупинки на командах з мітками:
inttmr, vert, switch, pochat.
Для цього на рядках команд, перед якими стоять ці мітки, зробити мишкою подвійний клік.
11.Задати частоту тактового генератора: Debugger – Settings – у закладці Osc / Trace позначити частоту 3,6864 MHz – Ok (така частота в лабораторних приладах).
12.Зробити скидання (F6) і пуск програми (F9). Виконання зупиниться на мітці pochat.
13.Визначити точний час між викликами підпрограми переривання і переключеннями світлодіодів (тобто зміною стану порту D). Для цього відкрити вікно секундоміру: Debugger – Stopwatch. Скинути його лічильник (клавіша Zero). Записати в табл. 4.3 в рядку мітки зупинки, значення регістрів з вікна Watch і секундоміру (значення Time зліва в мікросекундах). Далі продовжувати виконання програми (F9) і після кожної зупинки заповнювати табл. 4.3. Визначити за даними
таблиці час між викликами підпрограми переривання ТTMR0 та між моментами переключення світлодіодів Трс.
4.3.Результати аналізу програми
Мітка, на якій |
Вміст регістрів у 16-й системі |
Час за віртуальним |
||
здійснено зупинку |
COUNT |
TMR0 |
PORTD |
секундоміром, мкс |
pochat |
03 |
BE |
80 |
0 |
inttmr |
03 |
00 |
80 |
18335 |
vert |
02 |
BE |
80 |
18240 |
inttmr |
02 |
00 |
80 |
36675 |
vert |
01 |
BE |
80 |
36680 |
inttmr |
01 |
00 |
80 |
55015 |
switch |
03 |
BE |
40 |
55024=TPC |
inttmr |
03 |
00 |
40 |
73355 |
vert |
02 |
BE |
40 |
73359 |
inttmr |
02 |
00 |
40 |
91694 |
vert |
01 |
BE |
40 |
91699 |
inttmr |
01 |
00 |
40 |
110035 |
switch |
03 |
BE |
20 |
110043 |
14.Розрахувати за зразком при описі алгоритму час між моментами переключення світлодіодів Тп і обчислити відносну похибку:
=((105084-55024)/55024)*100%=0.90978*100=90.978
15.Приєднати програматор PICkit2 або PICkit3 до входу USB комп'ютера (до плати мікроконтролера він теж має бути приєднаний). Увімкнути живлення демоплати. У середовищі MPLAB обрати Debugger–Select Tool–PICkit 2 (або PICkit 3 – залежно від розташованого на робочому місці програматора). Якщо з'являється віконце з інформацією про небезпеку, що може статись, коли мікроконтролер розрахований на живлення 3,3 В, обрати OK. Прошити мікроконтролер,
натиснувши піктограму або в меню Debugger–Program. З комп'ютера виконати старт програми мікроконтролера
або F9.
5
16.Візуально визначити час Твіз перемикання сусідніх світлодіодів, визначивши час значної кількості перемикань та поділивши цей час на їх кількість. Обчислити відносну похибку
.
.
ЗМІСТ ЗВІТУ Звіт має містити: назву та мету лабораторної роботи, скорочений порядок виконання
лабораторної роботи, функціональну схему таймера, алгоритм і програму з коментарем, таблицю аналізу програми, передбачені розрахунки, перелік імен регістрів спеціального призначення, що використовуються у дослідженій програмі, формат та опис дії кожного виду команд, що вперше зустрічаються у дослідженій програмі мікроконтролера, відповіді на контрольні запитання.
КОНТРОЛЬНІ ЗАПИТАННЯ
1.Як створити затримку часу, використовуючи переривання від таймера ?
2.Як підключити переддільник до таймера із заданим коефіцієнтом ділення ?
3.Як розрахувати за заданою затримкою числове значення, що заноситься в таймер TMR0 ?
4.Як виконується команда retfie?
5.Що потрібно змінити у дослідженій програмі, щоб затримка часу становила 10 с. ?
6