
мпт 07 6 16 Скудря
.pdfЛабораторна робота № 7 Виведення цифрової інформації на семисегментні індикатори
Мета роботи: вивчити способи налагодження систем на базі РІС-контролерів, засвоїти методи виведення інформації на семисегментні індикатори за допомогою регістрів зсуву
ТЕОРЕТИЧНІ ВІДОМОСТІ
У середовище MPLAB є можливість здійснювати програмну імітацію (симуляцію) виконання команд, введення і зміну зовнішніх сигналів та інші можливості налагодження.
Однак, якщо під симулятором MPLAB програма імітує роботу системи вірно, а в режимі реального часу мікроконтролерний пристрій працює неправильно, виникають значні труднощі у пошуку та виправленні апаратних і програмних помилок.
Щоб виправити подібні помилки, використовують пристрої, які називають емулятори. Вони дозволяють спільно налагодити апаратне та програмне забезпечення реальної мікроконтролерної системи. Але емулятор дорого коштує. Схожими за призначенням та значно дешевшими з є налагоджувачі-програматори MPLAB-ICD (In-Circuit Debugger), PICKIT 2, PICKIT 3. Ці пристрої є програматорами і водночас внутрішньосхемними налагоджувачем.
PICKIT 2, PICKIT 3 забезпечують:
●виконання коду в реальному масштабі часу;
●покрокове виконання коду
●точки зупинки;
●внутрішньосхемне налагодження;
●вбудоване програмування;
●роботу від джерела живлення налагоджуваної системи;
Часто при створенні мікроконтролерних систем управління і контролю необхідно передбачати виведення інформації на індикатори.
Типові схеми спряження мікроконтролерів з індикаторами використовують велику кількість зовнішніх виводів. Навіть для малопровідної динамічної індикації потрібно використати n + 8 виводів мікроконтролера, де n – кількість відображуваних цифр.
Раціональніше використовувати послідовну передачу інформації за двопровідною схемою з використанням регістрів зсуву (рис. 7.1). У такому випадку незалежно від кількості індикаторів потрібно використати два виводи мікроконтролера: один – для передачі даних (RC5), другий – для передачі сигналу синхронізації (RC3). Іще один вивід використовується лише для скидання регістрів
(RA2).
Алгоритм передачі інформації такий: у циклі, що повторюється 8·n разів (для двох індикаторів 16 разів), здійснюється послідовне в часі виведення бітів семисегментних кодів цифр на вивід RC5. Як тільки черговий біт з'являється на RC5, мікроконтролер виводить тактовий імпульс на RC3.
При цьому інформація на виходах 0-7 регістрів зсувається вниз, а біт з виходу RC5 запам'ятовується на виході 0 верхнього регістра. Після завершення циклу коди регістрів лишаються незмінними до наступного подібного циклу. А на індикаторах через обмежувальні опори засвічуються сегменти потрібних цифр.
ПОРЯДОК ВИКОНАННЯ ЛАБОРАТОРНОЇ РОБОТИ
1.Увійти у середовище MPLAB, обравши на робочому столі червоно-синю піктограму MPLAB
.
2.Створити новий проєкт, обравши з меню Project – Project Wizard – Далее. У вікні, що з'являється, вибрати мікросхему (Device) PIC16F877 – Далее – Далее. У пункті Create New Project File натиснути Browse – обрати папку D:\1Work і ввести ім'я проєкту, наприклад, 726.mcp, де 7 – номер лабораторної роботи, 2 – номер групи, 6 – номер студента за списком. Натиснути Далее – Далее – Готово.
3.Створити текстовий файл з тим же іменем і розширенням .asm. Для цього обрати мишкою меню File – Add New File to Project. Після появи з цим ім’ям задати вказане ім'я файлу (наприклад, 726.asm) і натиснути Save - Зберегти. У вікні .mcw (наприклад, 726.mcw) з’явиться ім’я створеного файлу.
4.Ввести текст програми на асемблері сімейства контролерів РІС-16 фірми Microchip.
Текст програми:
1

;********************************************************* ; Лабораторна робота № 7 ;Індикація чисел на семисегментних індикаторах
;*********************************************************
list p=16f877 ; директива задає тип процесора
#include <p16f877.inc> ;включення файлу стандартних імен
__CONFIG _WDT_OFF & _BODEN_OFF & _XT_OSC & _LVP_OFF & _DEBUG_ON
Br |
equ 16 |
;тут замість БР вставити номер своєї бригади |
|
|
CBLOCK |
20H |
;директива задає блок регістрів |
|
T_C |
; буфер даних для відображення |
|
|
_N |
|
; Змінна для установки затримок |
|
LOOP3 |
; Змінні |
|
|
LOOP2 |
|
; для |
|
LOOP1 |
; підпрограм |
|
|
LOOP0 |
; затримок |
|
|
LSD |
|
; Молодша цифра числа |
|
MSD |
|
; Старша цифра числа |
|
L7 |
|
;7-сегментний код молодшої цифри |
|
M7 |
|
;7-сегментний код старшої цифри |
|
ENDC |
|
|
;****************************************************** ; Основна програма
;******************************************************
ORG 000H |
|
|
nop |
|
|
goto main |
|
|
org |
4 |
|
goto |
int |
|
main: |
|
|
clrf |
PORTA |
; Обнулити порт А |
2
|
bsf |
PORTA,2 |
|
;відмінити скидання регістрів зсуву |
|
|
clrf |
PORTC |
|
|
|
|
clrf |
PORTD |
|
|
|
|
bsf |
STATUS,RP0 |
|
; банк пам'яті 1 |
|
;111111111111111111111111111111 |
|||||
|
movlw b'11111011' |
; Встановити порт А на введення, |
|||
|
movwf TRISA |
|
; лише біт 2 на виведення |
||
|
movlw b'11010101' |
; Встановити RC5, RC3, RC1 на |
|||
|
movwf TRISC |
|
;виведення, інші - на введення |
||
|
clrf |
|
TRISD |
|
;PORTD – на виведення |
|
bcf |
STATUS,RP0 |
|
; банк пам'яті 0 |
|
;00000000000000000000000000000000000 |
|||||
main_0: movlw |
d'100' |
|
|||
|
MOVWF |
|
T_C |
|
|
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
|||||
main_1: |
|
|
|
|
|
|
movlw Br ;тут складіть фрагмент, що від вмісту комірки Т_С |
||||
|
subwf T_C,f |
;віднімає ваш номер за списком. Результат в Т_С |
|||
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
|||||
|
btfss STATUS,C |
;якщо > 0, пропустити |
|||
|
goto main_0 |
;інакше, - знову почати з більшого числа |
|||
|
call |
BINBCD |
; перетворення BIN=(Т_С) у BCD=(MSD, LSD) |
||
|
call |
BCD_7 |
;перетв. BCD-коду у код індикаторів |
||
disp: |
CALL |
DISPLAY |
; Результат - на індикацію |
||
;----------------------------------------------- |
|||||
|
movlw |
4 |
|
;затримка на 1 с |
|
|
movwf LOOP3 |
|
; |
|
|
|
call |
DELAY |
|
; затримка 250 мс |
|
|
decfsz |
LOOP3,f |
; |
||
|
goto |
main_1 |
|
;повторити для наступного числа |
|
;----------------------------------------------- |
|||||
;п/п зсуву регістрів M7, L7 молодшими розрядами |
|||||
;в 2 регістри зсуву |
|
|
|||
DISPLAY: |
|
|
|
|
|
|
movlw d'16' ;лічильник в _N |
||||
|
movwf _N |
|
|
|
|
NastBit: rrf |
M7,f |
|
;зсув вправо пари регістрів M7, L7 |
||
|
rrf |
L7,f |
|
|
|
|
bcf |
PORTC,5 |
; |
|
|
|
btfsc STATUS,C |
;якщо висунутий біт=0, RC5=0, |
|||
|
bsf |
PORTC,5 |
|
; інакше - RC5=1 |
|
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
|||||
|
bsf PORTC,3 |
|
;тут складіть фрагмент, що формує |
||
|
bcf PORTC,3 |
|
;тактовий імпульс у біті 3 порта С |
||
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
|||||
|
decfsz |
_N,f |
|
;лічильник - 1, і пропустити, якщо 0 |
|
|
goto |
NastBit |
|
;зсув повторюється 16 разів |
|
|
return |
|
|
|
|
;--------------------------------------- |
|||||
DELAY: |
|
|
|
|
|
|
MOVLW |
|
.250 |
|
; Затримка 250 мс |
|
MOVWF |
|
LOOP1 |
|
|
DELAY_N_MS: |
|
|
|
3
OUTTER: |
|
|
|
MOVLW |
|
.102 |
; Затримка 1 мс |
MOVWF |
|
LOOP2 |
|
INNER: |
|
|
|
movlw d'15' |
|
||
movwf LOOP0 |
|
||
ININNER: |
|
|
|
DECFSZ |
LOOP0,F |
|
|
goto |
ININNER |
|
|
DECFSZ |
LOOP2, F |
|
|
GOTO |
INNER |
|
|
DECFSZ |
LOOP1, F |
|
|
GOTO |
OUTTER |
|
RETURN ;********************************************
;Стандартні процедури роботи з дисплеєм
;********************************************
;коментар до цієї підпрограми написати самостійно
BINBCD:
CLRF |
MSD |
; |
MOVF |
T_C,w |
; |
MOVWF LSD |
; |
|
GTENTH: |
|
|
movlw d'10' ; |
|
|
subwf LSD,W ; |
|
|
btfss STATUS,C |
; |
|
|
|
; |
|
|
; |
retlw 0 |
; |
|
|
|
; |
movwf LSD |
; |
|
incf |
MSD,F |
; |
goto |
GTENTH |
; |
;------------------------------------
;п/п перетворення BCD (MSD, LSD)
;в 7-сегментні коди двох цифр (M7, L7)
BCD_7: |
movf |
MSD,W |
|
call |
tab7s |
;п/п перетв. цифри (W) в 7-сегментний код |
|
movwf M7 |
;7-сегм. код старшої цифри – в M7 |
||
movf |
LSD,W |
|
|
call |
tab7s |
|
|
movwf L7 |
;7-сегм. код молодшої цифри – в L7 |
||
return |
|
|
|
;------------------------------------ |
|||
tab7s: |
addwf PCL,f ;п/п перетвор. цифри (W)=0..9 |
||
;сегменти: |
|
abcdefgh |
; у 7-сегментний код в W |
|
|
||
retlw b'11111100' |
;0 |
||
retlw b'01100000' |
;1 |
||
retlw b'11011010' |
;2 |
||
retlw b'11110010' |
;3 |
||
retlw b'01100110' |
;4 |
||
retlw b'10110110' |
;5 |
||
retlw b'10111110' |
;6 |
||
retlw b'11100000' |
;7 |
||
retlw b'11111110' |
;8 |
||
retlw b'11110110' |
;9 |
;*************************************************
4
int: |
retfie |
|
|
END |
|
|
У програмі застосовуються такі види команд: |
|
Команда |
Коментар |
|
movlw |
k |
;переслати число (літерал) у робочий регістр W |
movwf |
f |
; переслати вміст робочого регістра W у регістр f |
bcf |
f, b |
;занести 0 у біт номер b регістра f (b 0, 1… 7) |
bsf |
f, b |
; занести 1 у біт номер b регістра f (b 0, 1… 7) |
goto |
k |
;безумовний перехід на адресу k |
clrw |
|
;очистити робочий регістр W |
btfss |
f, b |
;якщо у регістрі f вказаний біт b = 1, пропустити наступну команду |
|
|
|
btfsc |
f, b |
;якщо у регістрі f вказаний біт b = 0, пропустити наступну команду |
|
|
|
iorwf |
f,d |
;побітне "ВКЛЮЧНЕ АБО" з регістрами W i f |
|
|
|
andwf |
f,d |
; побітне "І" з регістрами W i f |
|
|
|
xorwf |
f,d |
; побітне "ВИКЛЮЧНЕ АБО" з регістрами W i f |
|
|
|
5.Записати програму на диск (File – Save).
6.Виконати компіляцію програми (F10 або відповідна піктограма). Після цього на екрані з'являється вікно результатів компіляції (Output).
7.Якщо з'явилось повідомлення про помилки (error), слід, ознайомившись з поясненням змісту помилки, натиснути мишею на цей рядок вікна Output. MPLAB зробить активним той рядок у тексті програми, де, ймовірно, зроблено помилку. Слід виправити її і далі так само й інші помилки. Потім повернутись до п. 5, поки не буде видано повідомлення "Build completed successfully" (Компіляцію завершено успішно). При цьому створюється файл з тим же ім'ям і розширенням .hex.
8.Обрати режим симуляції: Debugger – Select Tool – 3 MPLAB SYM.
9.Створити вікно спостереження (View – Watch) Занести до нього імена регістрів Т_С, MSD, LSD, M7, L7. Натиснути правою кнопкою мишки на Value і в контекстному меню обрати Binary. Розширити вікно Watch, щоб бачити двійкові значення.
10.Встановити точки зупинки, зробивши подвійний клік на командах:
|
call |
BINBCD |
; перетворення BIN=(Т_С) у BCD=(MSD, LSD) |
|
call |
BCD_7 |
;перетв. BCD-коду у код індикаторів |
disp: |
call |
DISPLAY |
; Результат - на індикацію |
11.Виконати програму F9 до точки зупинки. Занести в таблицю 7.1 стан регістрів T_C, MSD, LSD в десятковій системі, а M7, L7 – у двійковій. Іще двічі виконувати програму F9, записуючи дані
|
після кожної зупинки. Подвійним кліком |
зняти точки зупинки |
з команд |
call BINBCD та |
||||||||
|
call BCD_7. Далі |
виконувати |
програму F9 |
і записувати вміст |
регістрів, |
поки не з’ясуєте |
||||||
|
закономірності в даних. |
|
|
|
|
|
|
|
||||
12. Визначте, яке найменше число виведеться на індикатор. Запишіть його. Число 9 |
||||||||||||
|
|
|
|
Таблиця 7.1 – Результати експериментальних досліджень |
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
№ |
|
|
|
|
|
Вміст регістрів |
|
|
|
||
|
|
T_C |
|
MSD |
|
LSD |
|
M7 |
|
|
L7 |
|
|
|
decimal |
|
decimal |
|
decimal |
|
binary |
|
binary |
|
|
|
1 |
87 |
|
0 |
|
0 |
|
00000000 |
|
00000000 |
|
|
|
2 |
87 |
|
8 |
|
7 |
|
00000000 |
|
00000000 |
|
|
|
3 |
87 |
|
8 |
|
7 |
|
11100110 |
|
11100110 |
|
|
|
|
|
|
Подвійним кліком зняти точки зупинки з команд |
|
|
||||||
|
|
|
|
|
|
call BINBCD |
та call BCD_7 |
|
|
|
||
|
4 |
74 |
|
7 |
|
4 |
|
11100110 |
|
11010011 |
|
5

5 |
61 |
6 |
1 |
10101110 |
10011110 |
6 |
48 |
4 |
8 |
10000110 |
11010100 |
7 |
35 |
3 |
5 |
11100101 |
11100111 |
8 |
22 |
2 |
2 |
10101110 |
10010101 |
13.Приєднати програматор PICkit2 або PICkit3 до входу USB комп'ютера (до плати мікроконтролера він теж має бути приєднаний). Увімкнути живлення демоплати. У середовищі MPLAB обрати Debugger–Select Tool–PICkit 2 (або PICkit 3 – залежно від розташованого на робочому місці програматора). Якщо з'являється віконце з інформацією про небезпеку, що може статись, коли мікроконтролер розрахований на живлення 3,3 В, обрати OK. Прошити мікроконтролер,
натиснувши піктограму або в меню Debugger–Program.
14.З комп'ютера виконати старт програми мікроконтролера або F9.
Програма виводить на цифровий індикатор визначену послідовність чисел. У разі відхилення фактичного виконання програми від передбаченого виявити та усунути причину помилки.
ЗМІСТ ЗВІТУ Звіт має містити: назву та мету лабораторної роботи, скорочений порядок виконання
лабораторної роботи, програму з коментарем, заповнену таблицю 7.1, копію екрану MPLAB після першої та останньої зупинки в режимі симуляції.
КОНТРОЛЬНІ ЗАПИТАННЯ
1.Які недоліки має симулятор MPLAB ?
2.Які основні можливості налагоджувача ?
3.Які є способи приєднання семисегментних індикаторів до мікроконтролерів?
4.Які переваги і недоліки приєднання семисегментних індикаторів до мікроконтролерів за допомогою регістрів зсуву ?
5.Які основні етапи перетворення двійкового числа на семисегментний код відповідних десяткових цифр ?
6.Що потрібно змінити у дослідженій програмі, щоб числа на індикаторі з'являлись вдвічі швидше, щоб числа змінювались з вдвічі більшим кроком ?
6