Добавил:
Макакаревич шатав Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

мпт 04 6 16 Скудря

.pdf
Скачиваний:
0
Добавлен:
14.07.2025
Размер:
273.08 Кб
Скачать

Лабораторна робота № 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