
мпт лаб 5
.pdfЛабораторна робота № 5
Використання енергонезалежної пам'яті даних Мета роботи: засвоїти використання енергонезалежної пам'яті даних
ТЕОРЕТИЧНІ ВІДОМОСТІ
Досягненням сучасних електронних технологій є EEPROM (Electrically Erasable Programmable Read-Only Memory) пам'ять даних, що зберігає інформацію при вимкнутому живленні. При цьому є можливість не тільки читати вміст EEPROM, а й записувати туди дані як при прошиванні, так і під час роботи контролера. У мікросхемах PIC16F877 вбудовано 256 байтів такого виду пам'яті.
Для роботи з EEPROM пам'яттю в мікроконтролерах PIC16FXXX використовуються регістри оперативної пам'яті:
|
|
EEDATA – регістр обміну даними з EEPROM пам'яттю; |
|
|
|||||
|
|
EEADR – визначає адресу комірки EEPROM, до якої здійснюється звертання; |
|||||||
|
|
EECON1 – регістр керування обміном з EEPROM пам'яттю; |
|
|
|||||
|
|
EECON2 – фізично відсутній регістр, що використовується виключно як |
|||||||
|
службовий при запису в EEPROM. |
|
|
|
|
||||
У регістрі EECON1 розміщені такі біти керування: |
|
|
|
|
|||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
|
EE |
X |
|
X |
X |
WR |
W |
W |
RD |
|
PRD |
|
|
|
|
ERR |
REN |
R |
|
|
Біти 4-6 не використовуються;
біт 7 EEPRD – біт вибору роботи з EEPROM пам'яттю даних або з областю пам'яті програм: 1 – флеш пам'ять програм для запису/читання з неї даних,
0 – EEPROM пам'ять даних;
біт 3 WRERR – ознака помилки запису в EEPROM: 1 – запис попередньо перервано, 0 – запис завершено успішно;
біт 2 WREN – дозвіл запису даних в пам'ять програм та EEPROM: 1 – запис дозволений, 0 – запис заборонений;
біт 1 WR – біт керування записом в EEPROM:
1 – почати процес запису в пам'ять програм або EEPROM (встановлюється програмно, скидається тільки апаратно по завершенні запису),
0 – запис закінчено;
біт 0 RD – біт керування читанням з пам'яті програм або EEPROM:
1 – здійснити читання (встановлюється програмно, скидається тільки апаратно по завершенні читання),
0 – читання завершено.
Перед записом в EEPROM у регістр EEADR слід занести адресу потрібної комірки EEPROM, а в EEDATA – байт даних. Щоб не допустити випадковий запис у EEPROM передбачено здійснювати його після встановлення біта EEPRG = 0, WREN = 1 і послідовного надсилання в EECON2 коду h'55', потім h'AA' (що нагадує пароль, без якого запис не виконається). Далі слід встановити WR = 1. Починається запис в EEPROM, який триває 4-8 мс. По завершенні запису біт WR автоматично скидається в 0 (одночасно встановлюється прапорець переривання – біт EEIF = 1). Не можна починати запис нового байта поки WR = 1.
Читання з EEPROM пам'яті виконується простіше. В EEADR слід занести адресу комірки EEPROM, з якої треба отримати значення, і встановити в EECON1 біт RD = 1. Дані одразу після цього можуть бути використані з регістра EEDATA.
На рис. 5.1 зображено алгоритм програми, який передбачає опитування вимикачів RA0, RA1. Якщо включити на мить RA0, програма отримає з EEPROM задану кількість чисел, виконає підрахунок їх суми, обчислить середнє з округленням результату до цілого та запише його в EEPROM. Воно буде збережене і при вимкнутому живленні.
Якщо після подачі живлення ввімкнути на мить вимикач RA1, середнє значення, записане в EEPROM, читається в оперативну пам'ять, порівнюється з двійковим числом, попередньо набраним
1
вимикачами порту В. Якщо значення збігаються, засвітиться світлодіод RD3, якщо ні – RD1 (тоді треба знайти та виправити помилки).
ПОРЯДОК ВИКОНАННЯ ЛАБОРАТОРНОЇ РОБОТИ
1.Увійти в середовище MPLAB, обравши на робочому столі піктограму MPLAB
.
2.Створити новий проєкт, обравши з меню Project – Project Wizard – Далее. У вікні, що з'являється, вибрати мікросхему (Device) PIC16F877 – Далее – Далее. У пункті Create New Project File натиснути Browse – обрати папку D:\1Work і ввести ім'я проєкту, наприклад, 5214.mcp, де 5 – номер лабораторної роботи, 2 – номер групи, 14 – номер студента за списком. Натиснути Далее – Далее – Готово.
3.Створити текстовий файл з тим же іменем і розширенням .asm. Для цього обрати мишкою меню File – Add New File to Project. Після появи з цим ім’ям задати вказане ім'я файлу (наприклад, 5214.asm) і натиснути Save - Зберегти. У вікні .mcw (наприклад, 5214.mcw) з’явиться ім’я створеного файлу.
4.Ввести текст програми. Зверніть увагу на те, що в мікроконтролері PIC16F877 регістри
EEDATA, EEADR розташовані в банку пам'яті 2, а EECON1, EECON2 – в банку 3. Регістр лічильника COUNT розташовано у "рентгенівській" області пам'яті 0x70…0x7F, до якої є доступ з будь-якого банку пам'яті.
Текст програми:
LIST P=16F877
#INCLUDE "P16F877.INC"
;директиву __CONFIG набрати в одному рядку, ;закінчуючи словом _LVP_OFF
__CONFIG _WDT_OFF & _BODEN_OFF & _XT_OSC & _LVP_OFF &_DEBUG_ON
HI |
EQU |
h'110' ;старший байт суми |
|||
LO |
EQU |
h'112' ;молодший |
байт |
суми |
|
FIRST EQU |
h'12' ;адреса початку |
масиву даних в EEPROM |
|||
COUNT EQU |
h'70' |
;лічильник |
в області рентгенівської пам'яті |
||
_N |
EQU |
h'08' |
;кількість |
даних |
|
org h'2100'+FIRST |
;область EEPROM пам'яті |
|
radix dec |
;директива встановлення десяткової |
;системи за замовчуванням
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; далі у директиві DE (запис в EEPROM при програмуванні) ;ввести у десятковій системі 8 чисел
;розрахованих за формулами:
;для і=1...7 х(і)=2*і*№бригади - №групи, ;Примітка: якщо число перевищує 127, відкинути старшу цифру ;для і=8 х(8)=125 – 10*№бригади ;замінити наведені далі числа даними свого варіанту
;Приклад для варіанту 1:
;для і=1...7 х(і)=2*і*№бригади - №групи = 2*і*1–6 =2*і–6
;х(1)=2*1*1–6=-4 ;х(2)=2*2*1–6=-2 ;х(3)=2*3*1–6=0
;х(4)=2*4*1–6=2
2
;х(5)=2*5*1–6=4 ;х(6)=2*6*1–6=6 ;х(7)=2*7*1–6=8 ;х(8)=125–10*1=115
;сума масиву S = -4-2+0+2+4+6+8+115=129 ;середнє M = 129/8 = 16,125
;заокруглене середнє A = 16 = h'10' = b'00010000'
;У директиві DE занести в десятковій системі дані,
;розраховані за власним варіантом
DE -4,-2,0,2,4,6,8,115 ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
radix hex |
;далі шістнадцяткова система за |
||||
|
|
|
; замовчуванням |
||
org |
h'000' ;Після включення живлення і скидання(РС)=0 |
||||
nop |
|
|
|
|
|
clrf |
|
PORTA |
;очистити порт А |
||
clrf |
PORTD |
|
|
|
|
bsf |
STATUS,RP0 ;банк регістрів 1 |
||||
;111111111111111111111111111111111111111 |
|||||
movlw b'11100011' |
;PORTA - режим введення, |
||||
movwf TRISA |
|
; крім RA2, RA3, RA4 |
|||
movlw b'11111111' ;PORTB - |
|||||
movwf TRISB |
; режим введення, |
||||
clrf |
|
TRISD ;PORTD – режим виведення |
|||
movlw b'10000110' |
; |
|
|||
movwf ADCON1 |
|
;порт А дискретний |
|||
bcf |
STATUS,RP0 ;банк регістрів 0 |
||||
;000000000000000000000000000000000000000 |
|||||
Main: |
|
|
|
|
|
bsf |
PORTA,4 |
|
;встановити 1 у біті 4 порту A |
||
bcf |
PORTA,4 |
|
;встановити 0 у біті 4 порту A |
||
OPYTTUMB: btfsc |
PORTA, 1 ;якщо RA1 = 0, пропустити команду |
||||
goto |
|
PEREVREZ |
|
;інакше перейти на мітку PEREVREZ |
|
btfss PORTA, 0 |
;якщо RA0 = 0, пропустити команду |
||||
goto |
|
OPYTTUMB |
|
;інакше – повторити опитування |
|
bsf |
|
STATUS, RP1 |
; Обрати банк регістрів 2 |
||
;2222222222222222222222222222222222222222 |
|||||
clrf |
|
LO |
|
;очищення |
|
clrf |
|
HI |
|
;накопичувача суми |
|
movlw _N |
|
;кількість елементів масиву - |
|||
movwf COUNT |
;в лічильник COUNT |
||||
movlw FIRST |
;адреса першого |
||||
movwf EEADR |
; доданка - в EEADR |
||||
Next: bsf |
|
STATUS, RP0 |
|||
bsf |
|
STATUS, RP0 |
;банк регістрів 3 |
||
;33333333333333333333333333333333333333 |
|||||
bsf |
|
EECON1, RD ;команда читання з EEPROM |
|||
bcf |
|
STATUS, RP0 |
;банк регістрів 2 |
||
;22222222222222222222222222222222222222 |
|||||
movf |
|
EEDATA, w |
|
;отримане число – в W |
|
addwf LO, f |
;\ Накопичення |
3
clrw |
|
|
|
|
|
|
btfsc EEDATA, 7 |
|
|
|
|
||
movlw h'FF' |
|
|
|
|
|
|
btfsc STATUS, C |
;\ |
|
|
|
||
incf |
|
HI, f ;\ суми в HI:LO |
|
|||
addwf HI,f |
|
|
|
|
|
|
incf |
EEADR, f ;перейти до наступної комірки EEPROM |
|||||
decfsz |
COUNT, f |
;якщо додано всі дані, пропустити |
||||
goto |
|
Next |
;інакше – перейти до наступного доданка |
|||
rrf |
HI, f |
|
;/ Зсув суми в HI:LO |
|||
rrf |
LO, f |
|
;/ |
|
|
|
rrf |
HI, f |
|
;/ на 3 розряди вправо |
|||
rrf |
LO, f |
|
;/ |
|
|
|
rrf |
HI, f |
|
;/ |
|
|
|
rrf |
LO, f |
|
;/ (тобто ділення на 8) |
|||
btfsc STATUS, C |
|
|
;округлення |
|||
incf |
LO, f |
|
|
|
;до цілого |
|
movf |
LO, W |
|
|
;підготовка |
||
movwf EEDATA |
|
;до запису |
|
|||
bsf |
|
STATUS, RP0 |
;банк регістрів 3 |
|||
;33333333333333333333333333333333333333 |
||||||
bsf |
EECON1, WREN |
|
; |
|
||
bcf |
INTCON, GIE |
|
;середнього |
|||
movlw h'55' |
|
; |
|
|
|
|
movwf EECON2 |
|
; значення |
|
|||
movlw h'AA' |
|
; |
|
|
|
|
movwf EECON2 |
|
;в EEPROM |
|
|||
bsf |
EECON1, WR ;команда запису в EEPROM |
|||||
bsf |
INTCON, GIE ; глобальний дозвіл переривань |
|||||
bcf |
STATUS, RP1 |
|
|
|
||
bcf |
STATUS, RP0 |
; Обрати банк регістрів 0 |
||||
;00000000000000000000000000000000000000 |
||||||
bsf |
PORTD,2 |
;сигналізація запису в EEPROM |
||||
Stop2: goto |
Stop2 |
|
; зациклення |
|||
PEREVREZ: bsf |
STATUS, RP1 |
; Обрати банк регістрів 2 |
||||
;22222222222222222222222222222222222222 |
||||||
movlw FIRST + _N |
;/адресу розміщення середнього |
|||||
movwf EEADR |
;/в EEPROM занести в EEADR |
|||||
bsf |
STATUS, RP0 |
; Обрати банк регістрів 3 |
||||
;33333333333333333333333333333333333333 |
||||||
bsf |
EECON1, RD ;команда читання з EEPROM |
|||||
bcf |
STATUS, RP0 |
; Обрати банк регістрів 2 |
||||
;22222222222222222222222222222222222222 |
||||||
movf |
EEDATA, w |
|
|
;отримане значення – в W |
||
bcf |
STATUS, RP1 |
; Обрати банк регістрів 0 |
||||
;00000000000000000000000000000000000000 |
||||||
xorwf PORTB, w |
;порівняння коду вимикачів з W |
|||||
btfss STATUS, Z |
;якщо вони однакові, пропустити |
|||||
goto |
false |
;якщо ні - перейти до сигналізації помилки |
||||
true: bsf |
PORTD, 3 |
;сигнал про вірний результат |
||||
Stop3: goto |
Stop3 |
|
; зациклення |
|||
false: bsf |
PORTD, 1 |
; сигнал про помилку |
||||
Stop1: goto |
Stop1 |
|
; зациклення |
end
4

5.Записати програму на диск (File – Save).
6.Виконати компіляцію програми Project – Build All (Ctrl+F10 або відповідна піктограма) – Absolute. Після цього на екрані з'являється вікно результатів компіляції (Output).
7.Якщо з'явились повідомлення про помилки (error), слід, ознайомившись з поясненням змісту помилки, двічі без паузи натиснути мишкою на цей рядок вікна Output. MPLAB зробить активним той рядок у тексті програми, де, ймовірно, зроблено помилку. Треба її виправити і далі так само й інші помилки. Потім повернутись до п. 6, поки не буде видано повідомлення "BUILD SUCCEEDED" ("Компіляція успішна").
8.Розрахувати в зошиті суму масиву, заданого в директиві DE, його середнє значення, заокруглити середнє до найближчого цілого і перевести його у шістнадцяткову систему.
9.Обрати режим симуляції: Debugger – Select Tool – MPLAB SYM.
10.Створити вікно спостереження (View – Watch) Занести до нього імена зовнішніх портів PORTA, PORTB, PORTD.
11.Відкрити вікно імітації зовнішніх пристроїв (меню: Debugger – Stimulus – New Workbook). У закладці Asynch у колонці Pin/ SFR додати імена зовнішніх пінів портів PORTA: RA0, RA1. Для кожного з них у стовпчику Action задати початковий стан Set Low, натискаючи при цьому у стовпчику Fire на відповідний символ «>» – виконати. У закладці Pin / Register Actions натиснути на підказку Click here to Add Signal. У новому вікні зліва вибрати ім’я PORTB, натиснути кнопку Add => – OK. У вікні Stimulus з’явився стовпчик PORTB, нижче в ньому ввести у шістнадцятковій системі розраховане середнє значення масиву і в цьому ж рядку стовпчика Time вказати 0. Натиснути внизу вікна кнопку Apply.
12.Виконати симуляцію проєкту F9. Задати у закладці Async вікна Stimulus стан RА0 =
Set High – «>». Зупинити програму: Debugger – Halt (F5 або іконка ). У PORTD біт 2 став дорівнювати «1». Це сигналізує, що програма прочитала масив чисел з EEPROM, порахувала середнє, заокруглила та занесла його в EEPROM.
13.Скинути на початок F6. Задати у закладці Async стан RА0 = Set Low – «>», RA1 = Set High – «>». Знову виконати проєкт F9 та зупинити F5. Якщо у вікні Watch у PORTD біт 3 = 1, розрахункове значення збіглося з отриманим мікроконтролером. Якщо ж одиниця встановилась у біті 1 PORTD, це означає, що зроблено помилку. Потрібно перевірити власні розрахунки, текст програми, виправити помилки і повторити дії п.п. 6-13.
14.Приєднати програматор PICkit2 або PICkit3 до входу USB комп'ютера (до плати мікроконтролера він теж має бути приєднаний). Увімкнути живлення демоплати. У середовищі MPLAB обрати Debugger–Select Tool–PICkit 2 (або PICkit 3 – залежно від розташованого на робочому місці програматора). Якщо з'являється віконце з інформацією про небезпеку, що може статись, коли мікроконтролер розрахований на живлення 3,3 В, обрати OK. Прошити
мікроконтролер, натиснувши піктограму або в меню Debugger–Program. З комп'ютера
виконати старт програми мікроконтролера або F9. На мить увімкнути вимикач RA0. Має засвітитись світлодіод RD2. Це свідчить, що елементи масиву по черзі читались з EEPROM у оперативну пам'ять, пораховано їх середнє, заокруглене значення та записано в EEPROM.
15. Скинути програму на початок і знову виконати старт програми F9. Вимикачами RB7…RB0 встановити двійковий код середнього значення. На мить увімкнути вимикач RA1. Виконається частина програми, що порівнює середнє значення, записане в EEPROM, з набраним вимикачами порту B. Якщо воно збігаються, світиться світлодіод RD3. Якщо ж була допущена помилка, горить світлодіод RD1. Тоді слід її виправити, виконати компіляцію, прошивку та повторити експеримент.
ЗМІСТ ЗВІТУ Звіт має містити: назву та мету лабораторної роботи, скорочений порядок виконання
лабораторної роботи, алгоритм і програму з коментарем, перелік імен регістрів спеціального призначення, що використовуються у дослідженій програмі, формат та опис дії кожного виду команд, що вперше зустрічаються у дослідженій програмі мікроконтролера, розрахунки і результати спостережень, відповіді на контрольні запитання.
5
КОНТРОЛЬНІ ЗАПИТАННЯ
1.Які особливості EEPROM пам'яті?
2.Які регістри спеціального призначення необхідно використати при обміні даними з
EEPROM ?
3.У чому особливості запису даних в EEPROM ?
4.Як виконати читання даних з EEPROM ?
5.Як створюються цикли ?
6.В якому банку знаходяться регістри, що обслуговують обмін з EEPROM пам'яттю?
6