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

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

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

Лабораторна робота № 6 Використання клавіатури з мікроконтролером

Мета роботи: засвоїти способи використання клавіатури в мікроконтролерній системі

ТЕОРЕТИЧНІ ВІДОМОСТІ

Як правило, для введення інформації вручну в системах управління використовують клавіатуру. Через те, що в лабораторному обладнанні відсутні клавіші, можна вважати, що

ввімкнення-вимкнення вимикачів імітує роботу клавіш.

У лабораторних роботах № 2, 5 при виконанні програми неодноразово використовувалось опитування стану вимикачів (можна вважати клавіш). Наприклад, опитування стану вимикача RA0, підключеного до біту 0 порту А, виконує фрагмент програми:

POVTOR: btfss PORTA, 0

; якщо RA0=1, пропустити наступну

 

 

; команду

goto

POVTOR ; якщо ні, – виконати перехід на мітку POVTOR

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

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

Спеціально для цього у PIC-контролерах передбачено переривання при зміні стану будь-якого з входів RB4–RB7. У такому разі апаратно встановлюється прапорець RBIF у регістрі INTCON (конфігурації переривань). Якщо попередньо були встановлені "1" в бітах RBIE (дозвіл переривань від зміни стану чотирьох старших бітів порту В) і GIE (глобальний дозвіл переривань), почне виконуватись підпрограма обробки переривання з адреси h'4'. Це переривання може вивести мікроконтролер з режиму SLEEP.

Іншим чином мікроконтролер вийде з режиму SLEEP, якщо буде встановлено RBIE =1, а GIE = 0. Тоді при натисканні на будь-яку клавішу програма буде виконуватись з наступної за SLEEP команди.

Якщо RBIE = 0, ні переривання, ні пробудження не відбудеться.

На рис. 6.1 зображено типову схему підключення клавіатури матричним способом.

Рис. 6.1 – Матричний спосіб приєднання клавіатури

1

Для забезпечення роботи схеми :

виводи RB0-RB3 встановлюють у режим виведення, RB4-RB7 – введення;

програмно підключають підтягувальні внутрішні резистори порту В (у регістрі OPTION_REG біт -RBPU = 0), щоб при відпущених клавішах на входи RB4-RB7 надходила "1";

на RB0-RB3 виводять "0". У регістрі INTCON встановлюють біт дозволу переривання при зміні сигналу на входах RB4-RB7 (RBIE = 1) і глобальний дозвіл переривання (GIE = 1). При замиканні будь-якої клавіші зміниться стан порту В. Наприклад, якщо замкнути контакт SB9, через нього з виходу RB2 на вхід RB6 надійде "0". Таким чином, зміниться стан порту В, встановиться прапор RBIF = 1 і буде здійснено виклик підпрограми обробки переривання. У ній потрібно передбачити:

1)читання PORTB, щоб усунути невідповідність попереднього та останнього кодів порту B;

2)скидання прапора RBIF в нуль.

Звичайно, також потрібно передбачити визначення натиснутої клавіші і реагування на цю дію згідно з алгоритмом розроблюваної програми. У лабораторній установці використовується інша схема підключення контактів (рис. 6.2). Тут замість клавіш використовуються чотири вимикачі SB1–SB4. При розімкнутих контактах на входи RB4–RB7 надходять сигнали низького рівня ("0").

Якщо замкнути контакт, наприклад SB1, на вхід RB4 надійде сигнал високого рівня ("1") через те, що співвідношення опорів дільника напруги R1 << R5. Світлодіоди, приєднані до порту D, призначені для відображення факту сприйняття контролером сигналу від натиснутої клавіші.

Відомо, що через пружні властивості контактів при їх замиканні за короткий час (до 10 мс) контакти один або декілька разів розмикаються і знову замикаються. Це явище називається "дренькіт контактів". При програмуванні слід його враховувати, зробивши затримку 10–20 мс після першого замикання контактів. Після затримки, коли дренькіт припиниться, можна програмно визначити, який контакт замкнутий, і здійснити відповідні до цього дії.

Рис. 6.2 – Схема лабораторної установки

Алгоритм взаємодії мікроконтролера з клавіатурою наведено на рис. 6.3, 6.4.

2

ПОРЯДОК ВИКОНАННЯ ЛАБОРАТОРНОЇ РОБОТИ

1.Увійти в середовище MPLAB, обравши на робочому столі піктограму MPLAB .

2.Створити новий проєкт, обравши з меню Project – Project Wizard – Далее. У вікні, що з'являється, вибрати мікросхему (Device) PIC16F877 – Далее Далее. У пункті Create New Project File натиснути Browse – обрати папку D:\1Work і ввести ім'я проєкту, наприклад, 696.mcp, де 6 – номер лабораторної роботи, 9 – номер групи, 6 – номер студента за списком. Натиснути Далее Далее Готово.

Рис. 6.3 – Алгоритм взаємодії мікроконтролера з клавіатурою.

3

Основна програма і підпрограма обробки переривань

3.Створити текстовий файл з тим же іменем і розширенням .asm. Для цього обрати мишкою меню File – Add New File to Project. У вікні з цим ім’ям задати вказане ім'я файлу (наприклад, 696.asm) і натиснути Save –

Зберегти. У вікні .mcw (наприклад, 696.mcw) з’явиться ім’я створеного файлу.

4.Ввести текст програми на асемблері з вставкою власного фрагмента виведення інформації на світлодіоди згідно із заданим варіантом (див. коментар до програми).

Текст програми:

;Лабораторна робота 6 ;Взаємодія контролера з клавіатурою

LIST P=16F877

INCLUDE "P16F877.INC";підключення файла стандартних імен

;директиву __CONFIG набрати в одному рядку, ;закінчуючи словом _LVP_OFF

__CONFIG _WDT_OFF & _BODEN_OFF & _XT_OSC & _LVP_OFF & _DEBUG_ON TEMP EQU h'20' ;регістр для тимчасового зберігання і

;обробки інформації

org

0

 

goto

start

 

org

h'4'

 

goto

ServiceInt ;підпрограма обробки переривань

;основна програма

 

start:

call init

;виклик підпрограми ініціалізації

loop: sleep ; встановити режим енергозбереження

nop

 

 

goto

loop

 

ServiceInt: btfsc INTCON,RBIF ;переривання від зміни

 

 

;стану клавіатури?

goto

ServiceWakUp

;якщо так, тоді обслуговування

bcf

INTCON, T0IE

;якщо ні, заборонити переривання

 

 

;від таймера

bcf

INTCON, T0IF

;скинути прапор таймера TMR0

return

;визначення натиснутої клавіші, ;увімкнення відповідних світлодіодів ;і очікування відпускання всіх клавіш

ServiceWakUp:

bcf

INTCON, RBIE ;заборонити переривання

 

 

 

;від порту В

movf

PORTB, w

;прочитати порт В

bcf

INTCON, RBIF

;скинути прапор зміни стану порту В

call

delay16

;затримка 16 мс для завершення

movf

PORTB, w

;дренькоту контактів

 

andlw b'11110000'

;виділити і запам'ятати

movwf

 

TEMP

; код контактів

;управління світлодіодами:

btfsc TEMP, 7

;якщо замкнуто контакт RB7,

goto

variant ;перейти до виконання власного фрагмента

clrf

PORTA

 

;якщо замкнуто інший контакт,

4

swapf TEMP, w

;вивести інформацію

movwf PORTD

;на RD0-RD3.

ochik:

call KeyRelease ;виклик п/п очікування

 

 

;відпускання контактів

retfie

;вертання з п/п переривання

variant:

 

movlw

b'10001000'

 

movwf

PORTD

 

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;тут зробити вставку власного фрагмента програми, ;який у двійковій формі виводить на світлодіоди десяткове

;число БГ, де Б – номер бригади, Г – групи.

 

 

 

;Використати світлодіоди RD7-RD0, приєднані до

 

 

 

;порту D. Вважати RD7 старшим, RD0 молодшим розрядом

 

;двійкового числа. Наприклад, число

d'136' в двійковій системі

;записується так:

RD7

RD6

RD5

RD4

RD3

RD2

RD1

RD0

;вагові коефіцієнти: 128

64

32

16

8

4

2

1

;двійкові цифри:

1

0

0

0

1

0

0

0

;

 

 

 

 

(стан світлодіодів)

 

 

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

goto

ochik

 

 

 

 

 

 

 

 

;підпрограма

очікування відпускання всіх клавіш

 

 

KeyRelease:

call

delay16

; затримка, щоб завершився

 

 

 

 

 

;дренькіт

 

 

 

 

movf

PORTB, w

 

;читання з порту В

 

 

 

bcf

INTCON, RBIF

;скинути прапор порту В

 

 

bsf

INTCON, RBIE

;дозвіл переривань при зміні

 

 

 

 

 

;стану порту В

 

 

 

 

andlw b'11110000'

 

;виділити біти, до яких

 

 

 

 

 

 

 

;підключені контакти

btfsc STATUS, Z

 

;контакти іще замкнуті?

 

 

return

 

 

 

;ні – вертання з підпрограми

sleep

 

;якщо так, – перейти в режим енергозбереження

bcf

INTCON, RBIE

;після пробудження заборонити

 

 

 

 

 

;переривання від зміни стану порту В

movf

PORTB, w

 

;прочитати порт В

 

 

 

bcf

INTCON, RBIF

;скинути прапор порту В

 

 

goto

KeyRelease

 

;повторити очікування

 

 

;підпрограма ініціалізації

 

 

 

 

 

 

init:

;/вивести у защіпки

 

 

 

 

 

 

 

 

 

 

 

 

 

clrf

PORTB

;/портів А і В нулі

 

 

 

 

bsf

STATUS, RP0

;обрати банк регістрів 1

 

 

;111111111111111111111111111111111111

 

 

 

 

clrf

TRISD

 

;порт D – на виведення

 

 

movlw b'11111111'

;\ порт B –

 

 

 

 

movwf TRISB

;\ на введення

 

 

 

 

 

bcf

STATUS, RP0

;обрати банк регістрів 0

 

 

;00000000000000000000000000000000000

 

 

 

 

 

bcf

INTCON, RBIE

 

;заборонити переривання від

 

 

 

 

 

;зміни стану порту В

 

movf

PORTB, w

 

;прочитати порт В

 

 

 

bcf

INTCON, RBIF

;скинути прапор порту В

 

 

bsf

INTCON, RBIE

;дозволити переривання від зміни

5

retfie

;стану порту В

 

 

; підпрограма затримки 16 мс

 

delay16: bsf STATUS, RP0

 

;обрати банк регістрів 1

;111111111111111111111111111111111111

movlw

b'10000101' ;\приєднати переддільник до TMR0

movwf OPTION_REG ;\з коефіцієнтом 1/64

bcf STATUS, RP0

;обрати банк регістрів 0

;00000000000000000000000000000000000

clrf

TMR0

;скидання таймера

bcf

INTCON, T0IF

;скинути прапор таймера TMR0

bsf

INTCON, T0IE

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

 

 

;таймера TMR0

CheckAgain: btfss INTCON, T0IF

;/очікування переповнення

goto

CheckAgain

;/таймера TMR0

bcf

INTCON, T0IE

;заборонити переривання від

 

 

;таймера TMR0

bcf

INTCON, RBIF

;;скинути прапор таймера TMR0

return

 

 

end

5.Записати програму на диск (File – Save).

6.Виконати компіляцію програми Project – Build All (Ctrl+F10 або відповідна піктограма) – Absolute. На екрані з'являється вікно результатів компіляції (Output).

7.Якщо є повідомлення про помилки (error), слід, ознайомившись з поясненням змісту помилки, двічі без паузи натиснути мишкою на цей рядок вікна Output. MPLAB зробить активним той рядок у тексті програми, де, ймовірно, зроблено помилку. Треба її виправити і далі так само й інші помилки. Потім повернутись до п. 6, поки не буде видано повідомлення "BUILD SUCCEEDED" ("Компіляція успішна").

8.Обрати режим симуляції: Debugger – Select Tool – MPLAB SYM.

9.Створити вікно спостереження (View – Watch) Занести до нього імена зовнішніх портів PORTB, PORTD.

10.Відкрити вікно імітації зовнішніх пристроїв (меню: Debugger – Stimulus – New Workbook). У закладці Asynch у колонці Pin/SFR додати імена зовнішніх пінів порту PORTB: RB7… RB4. Для кожного з них у стовпчику Action задати початковий стан Set Low, натискаючи при цьому у стовпчику Fire на відповідний символ «>» – виконати. Задано початковий стан вимикачів згідно таблиці 6.1. Low імітує вимкнутий стан вимикачів. У таблиці слід позначити його «0», а High – «1» – увімкнуто.

11.Виконати програму F9. Зупинити її F5. Занести в таблицю стан бітів порту D (до них у лабораторних пристроях приєднано світлодіоди).

12.Задати згідно таблиці у закладці Async вікна Stimulus стан «1» біту RB4 = Set High – «>». Виконати F9 і зупинити проєкт F5. Занести в другий рядок таблиці стан бітів порту D. Далі вимикачами RB7…RB4 задавати визначені в таблиці стани і кожний раз, виконуючи та зупиняючи програму, заповнити таблицю.

6.1– Таблиця результатів тестування

 

Стан тумблерів

 

 

 

 

Стан світлодіодів

 

 

 

RB4

RB5

RB6

RB7

RD7

RD6

RD5

 

RD4

RD3

 

RD2

RD1

RD0

0

0

0

0

0

0

0

 

0

0

 

0

0

0

1

0

0

0

0

0

0

 

0

0

 

0

0

1

0

0

0

0

0

0

0

 

0

0

 

0

0

0

0

0

0

1

1

0

0

 

0

1

 

0

0

0

0

0

1

1

1

0

0

 

0

1

 

0

0

0

0

0

1

0

1

0

0

 

0

1

 

0

0

0

0

0

0

0

1

0

0

 

0

1

 

0

0

0

0

1

0

0

0

0

0

 

0

0

 

0

1

0

0

0

0

0

0

0

0

 

0

0

 

0

1

0

6

0

0

1

0

0

0

0

0

0

1

0

0

13.Приєднати програматор PICkit2 або PICkit3 до входу USB комп'ютера (до плати мікроконтролера він теж має бути приєднаний). Увімкнути живлення демоплати. У середовищі MPLAB обрати Debugger–Select Tool–PICkit 2 (або PICkit 3 – залежно від розташованого на робочому місці програматора). Якщо з'являється віконце з інформацією про небезпеку, що може статись, коли мікроконтролер розрахований на живлення 3,3 В, обрати OK. Прошити мікроконтролер,

натиснувши піктограму або в меню Debugger–Program.

14.З комп'ютера виконати старт програми мікроконтролера або F9. Відповідно до таблиці 6.1 встановлювати тумблерами заданий стан бітів RB4…RB7 та порівняти стан світлодіодів RD7…RD0 зі значеннями в таблиці. Якщо вони не збігаються, виявити причину.

ЗМІСТ ЗВІТУ Зміст має містити: назву та мету лабораторної роботи, схеми підключення клавіатури до

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

КОНТРОЛЬНІ ЗАПИТАННЯ

1.Як позбутися "висячих" (непідключених до "0" або "1") входів мікроконтролера від контактних пристроїв введення інформації?

2.Чим шкідливе явище дренькоту контактів?

3.Як при програмуванні усунути вплив дренькоту контактів?

4.У чому суть алгоритму переривання, пов'язаного зі зміною стану порту В?

5.У чому перевага матричного способу підключення клавіатури?

6.За яким алгоритмом здійснюється опитування клавіатури, підключеної матричним способом?

7

Соседние файлы в предмете Основи електроніки та Мікропроцесорної техніки