МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ
“КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ”
КАФЕДРА КОНСТРУЮВАННЯ ЕЛЕКТРОННО-ОБЧИСЛЮВАЛЬНОЇ АПАРАТУРИ
КУРСОВА РОБОТА
по курсу: «Електронно-обчислювальніпристрої та системи‒ 1»
Виконав:
студентгрупи ДК-11
Рожківський О.І.
Керівник: проф. Лисенко О.М.
Захищено з оцінкою _____________
Дата «____»____________2014 р.
Київ – 2014
ЗАВДАННЯ
на курсову роботу з дисципліни "Периферійні пристрої"
для студентів спеціальності "Виробництво електронних засобів"
Вихідні дані:
Існує мікропроцесорна вимірювальна система на основі 8-розрядного RISC-мікроконтролеру (МК) типу AVRAT90S8535 фірми Atmel, структурна схема якої має наступний вигляд:
Три віддалені цифрові сенсори відносного тиску повітря S1–S3 підключені до входів мультиплексоруMUX. При тиску 100 даПа значення на виході сенсора становить 0016, при 1000даПа –FF16.
Вихід мультиплексоруMUX підключено до входів PА0-РА7 порту МК. Адресний вхід мультиплексору підключено до виходів РВ1 та PВ2 порту МК. По адресному входу числом задається, який із сенсорів буде підключено до виходу мультиплексору: від "01" для S1 до "11" для S3.
Клавіша К підключена до входу РВ0 порту МК. Якщо клавішу натиснуто, то на вхід МК надходить сигнал логічної 1, якщо відпущено – логічного 0.
До виходів РD1–PD7 порту МК підключено 7-розрядний вхід демультиплексоруDMUX. До виходів РС3 та РС4 МК підключено 2-розрядний адресний вхід демультиплексору. По адресному входу числом задається, який з 7-розрядних виходів демультиплексора буде з'єднано зі входом: від "01" для першого входу (до якого підключено індикатор Інд1), до "10" для останнього (до якого підключено індикатор Інд2). При підключенні сегменти індикатора (від A до F) послідовно з'єднуються зі входами портаD (від PD1 до PD7).
Два семисегментні цифрові індикатори Інд1-Інд2 підключені до виходів демультиплексору. При цьому, якщо на будь-який вхід індикатора подати рівень логічної 1, то відповідний сегмент підсвічується, а якщо рівень логічного 0 – гасне.
Три світлодіоди СД1–СД3 підключені до виходів РС0–РС2 порту МК відповідно. Якщо на вхід світлодіода подати рівень логічної 1, то він засвітиться, а якщо логічного 0 – погасне.
Завдання:
Розробити на мові Асемблер МК робочу програму функціонування мікропроцесорної вимірювальної системи, яка повинна:
- зчитувати значення з сенсорів S1 або S2 або S3, через мультиплексор, в залежності від того, який із сенсорів у даний момент часу вважається поточним;
-при цьому вважати, що одне натискання клавіші К вибирає наступний по номеру сенсор поточним (починаючи з S1); після S3 поточним знову стане S1;
- перетворювати отриманий результат вимірювання у шістнадцятковий код;
- виводити отриманий код на цифрові індикатори Інд1-Інд2 у вигляді шістнадцяткового числа через демультиплексор послідовно керуючи цифровими індикаторами Інд1–Інд2;
- засвітити світлодіод СД1, якщо поточним є сенсор S1, СД2 – якщо S2, та СД3 – якщо S3;
- реалізувати RESET.
Зміст
Стор.
Вступ 5
1. Аналіз завдання 6
2. Блок-схема 7
2.1. Блок-схема основної програми 7
2.2. Блок-схема підпрограми затримки 10
2.3. Блок схема підпрограми декодування 11
3. Текст програми 12
4. Перелік змінних та периферії 16
5. Опис програми 17
6. Моделювання пристрою 20
Висновок 26
Список використаної літератури 27
Вступ
Завдання курсового проекту – розробити пристрій, який являє собою мікропроцесорну систему контролю на основі 8-розрядного RISC-мікроконтролеру (МК) типу AVRAT90S8535 фірми Atmel.
Пристрій необхідний для використання на промислових об’єктах, де присутні три датчика, дані з яких мають почергово відображатись на семисегментному індикаторі.
Головною вимогою до пристрою являється обов’язкова індикація даних з обраного датчику. Також необхідно забезпечити затримку зчитування клавіші, щоб одне натискання клавіші не викликало подвійного спрацювання системи.
1. Аналіз завдання
Для реалізації пристрою було обрано мікроконтролерМК AT90S8535.Цей мікроконтроллерповністю забезпечує вимоги, представлені в завданні, а саме має достатню кількість портів. Так якпристрій не передбачає якихось складних початкових налаштувань чи ініціалізацій, для скидання МК не потрібно вводити додаткових переривань. В даному випадку буде достатньо схеми скидання яка буде керувати виводом МК.
Також прилад передбачає елементи індикації. В якості індикаторів використовуються семи сегментні індикатори. При використанні семи сегментних індикаторів необхідно передбачати обмеження струму, який через них протікатиме.
МК має виводити дані з датчиків на 2 індикатори, які почергово вибираються за допомогою демультиплексора.
2. Блок-схема алгоритму
Структура алгоритму –основна програма та підпрограми затримки на переключення длякоректного отримання вхідних сигналів
2.1. Блок-схема основної програми
2.2. Блок-схема підпрограми затримки
2.3. Блок-схема підпрограми вибору каналу мультиплексору
2.4. Блок-схема підпрограми декодування
3. Текст програми
3.1. Текст основної програми
;* Segmentindicatorsareconnectedtoport
;* usingcommoncathodeprincipleasfollows:
;* bit7-> |G|F|E|D|C|B|A|DP| <-bit0
;* decodedvaluesare sym_0 ... sym_F
.equ DEBUG=1
.equ DELAY=255 ;Delays 2+8*(DELAY) cycles. const = [1..255]
.def temp=r16 ;use r16 astemporaryregister
.def temp2=r17 ;use r17 astemporaryregister
.def cnt=r18 ;use r18 ascountervaluestoringregister
.def leds=r19 ;use r19 tostoreLEDsand DEMUX outputvalue
.macropw ;portwritemacro. Usetemp
lditemp, @1 ;load 2nd argvaluetotemp
out @0, temp ;writetempto 1st argport
.endm
.macrosti ;storeindirectimmediatemacro. Usetemp
lditemp, @1 ;load 2nd argvaluetotemp
st @0, temp ;writetempto 1st argport
.endm
;* SRAM segment
.dseg
decode: .bytesymbols_total
;* FLASH segment
.cseg
;* Initinterruptvectorswithroutineaddresses
.org $0 rjmp MAIN ;ResetHandler
.org $011 ;Jumpover INT vectors. Codestartsbelow
MAIN:
;* Initstack. Pointstotheendof SRAM
pw SPH, HIGH(RAMEND)
pw SPL, LOW(RAMEND)
;* Putsegmentdecodervaluesto SRAM
ldi ZL, LOW(decode)
ldi ZH, HIGH(decode)
;cycleunrolledtoimproveperformance
sti Z+, sym_0
sti Z+, sym_1
sti Z+, sym_2
sti Z+, sym_3
sti Z+, sym_4
sti Z+, sym_5
sti Z+, sym_6
sti Z+, sym_7
sti Z+, sym_8
sti Z+, sym_9
sti Z+, sym_A
sti Z+, sym_B
sti Z+, sym_C
sti Z+, sym_D
sti Z+, sym_E
sti Z+, sym_F
;* END Put
;* Configureports
pw DDRA, 0 ;Set PORTA toinput
pw DDRB, (0<<PB0)+(1<<PB1)+(1<<PB2) ;Set PB1,2 toout, PB0 toin
pw DDRC, (1<<PC0)+(1<<PC1)+(1<<PC2)+(1<<PC3)+(1<<PC4) ;Set PC0..PC4 toout
pw DDRD, ~(1<<PD0) ;Set PD1..PD7 toout
;* Setinitialvalues
clrcnt ;Set 1st sensorasactive
ldileds, (1<<0) ;Set 1st LED asactive
ldi YH, HIGH(decode) ;usedinDoDecodesubroutine
loop:
;buttonhandler
sbis PINB, 0 ;skipnextifbuttonpressed
rjmpbtn_not_pressed
btn_pressed:
rcallRotateCnt
rcallSoftDelay ;glitchfreedelay. Couldberemoved
btn_not_pressed:
in temp2, PINA ;readvaluefromsensorandsavein 2nd tmpreg
movtemp, temp2
;lowerpartprocessing
anditemp, 0x0F ;bytemask, extractslowerpart
rcallDoDecode ;nowtempcontainsdecodedvalue
out PORTD, temp ;outputdecodedvaluetosegment
movtemp, leds
oritemp, (1<<PC4) ;selectsegment 2 forlowerpart
out PORTC, temp ;switchdemux&ledstoaccordingvalue
rcallSoftDelay ;wait
;higherpartprocessing
movtemp, temp2
anditemp, 0xF0 ;extracthigherpart
swaptemp ;placeitinlowerhalforregister
rcallDoDecode ;decodehigherpart, placeitto<temp>
out PORTD, temp ;outputdecodedvalue
movtemp, leds
oritemp, (1<<PC3) ;selectsegment 2 forlowerpart
out PORTC, temp ;switchdemux&ledstoaccordingvalue
rcallSoftDelay ;wait
rjmploop ;infiniterotateanddisplaydata
;* END MAIN
;* Rotatesubroutine. Holdingcounteriterations
;* Counterworksasif bit0 isnotpresent.
;* Neededtodirectlyoutputvalueto PORTB mux
RotateCnt:
inccnt ;cnt++
inccnt
cpicnt, 6 ;testifcnt>= 6
brlocnt_lower ;ifnot - set cnt=0
clrcnt ;elseclearcounter
ldileds, (1<<0) ;set 1st LED andasactive
cnt_lower:
out PORTB, cnt
ldileds, (1<<1) ; 2nd LED active. Maychangeafter "sbrs" below
sbrscnt, 1 ;skipnextif cnt.1=1 (ifcntpointsto 2nd LED)
ldileds, (1<<2) ; 3rd LED active. Couldbeskipped
ret
;* END RotateCnt
;* Decodersubroutine. Preparesvaluefor 7-segment displayout
;* [arguments]: <temp>register. Valuefrom 0x00 to 0x0F
;* [returns]: Resultingvaluein<temp>register. Readytobeoutputondisplay
DoDecode:
ldi YL, LOW(decode) ;Point Y to 7-segment decodetable
add YL, temp ;adddisplacement
ldtemp, Y ;readvaluebypointer
ret
;* END DoDecode
SoftDelay:
.if (DEBUG!=1)
;* Delay= 2+ 8*(DELAY) ; max=2042
ldi r16, LOW(DELAY) ; 1 c
delay_loop: ;total = 8 cycles
nop ; 1 c
nop ; 1 c
nop ; 1 c
nop ; 1 c
nop ; 1 c
nop ; 1 c
dec r16 ; 1 c
breqdelay_loop ; 1 c / 2 for r16=0
.else
.message "(!) Debugis ON"
.endif
ret
3.2. Текст include.inc файлу
;* Segment indicators are connected to port
;* using common cathode principle as follows:
;* bit7-> |G|F|E|D|C|B|A|DP| <-bit0
.equseg_DP=(1<<0)
.equseg_A=(1<<1)
.equseg_B=(1<<2)
.equseg_C=(1<<3)
.equseg_D=(1<<4)
.equseg_E=(1<<5)
.equseg_F=(1<<6)
.equseg_G=(1<<7)
.equ sym_0 = LOW(seg_A+seg_B+seg_C+seg_D+seg_E+seg_F)
.equ sym_1 = LOW(seg_B+seg_C)
.equ sym_2 = LOW(seg_A+seg_B+seg_D+seg_E+seg_G)
.equ sym_3 = LOW(seg_A+seg_B+seg_C+seg_D+seg_G)
.equ sym_4 = LOW(seg_B+seg_C+seg_F+seg_G)
.equ sym_5 = LOW(seg_A+seg_C+seg_D+seg_F+seg_G)
.equ sym_6 = LOW(seg_A+seg_C+seg_D+seg_E+seg_F+seg_G)
.equ sym_7 = LOW(seg_A+seg_B+seg_C)
.equ sym_8 = LOW(seg_A+seg_B+seg_C+seg_D+seg_E+seg_F+seg_G)
.equ sym_9 = LOW(seg_A+seg_B+seg_C+seg_D+seg_F+seg_G)
.equsym_A = LOW(seg_A+seg_B+seg_C+seg_E+seg_F+seg_G)
.equsym_B = LOW(seg_C+seg_D+seg_E+seg_F+seg_G)
.equsym_C = LOW(seg_A+seg_D+seg_E+seg_F)
.equsym_D = LOW(seg_B+seg_C+seg_D+seg_E+seg_G)
.equsym_E = LOW(seg_A+seg_D+seg_E+seg_F+seg_G)
.equsym_F = LOW(seg_A+seg_E+seg_F+seg_G)
.equsymbols_total = 16
4. Перелік змінних та периферії
У МК з периферії використовуються чотири порти: порт А, порт В, порт С, порт D. В портіВ0-й пін використовується на вхід, до нього підключенаклавіша К. 1-й та 2-й піни порту налаштовані на вихід. Вони використовуються для керування вхідним мультиплексором. Порт Аналаштований на вхід, до нього підключені датчики через мультиплексор.Порт С налаштований на вихід. Піни 0-й, 1-й, 2-й порту С використовуються для керування діодами, що індукують, який з датчиків обрано. 3-й та 4-й піни підключені до демультиплексора для того, щоб обирати на який з індикаторів виводити дані з порту D. Порт D налаштований на вихід, до нього підключений демультиплексор, через який дані виводяться на індикатори.
Регістри використовуються за призначенням, вказаним у табл.1.
Таблиця 1. Призначення регістрів загального призначення
РЗП |
Назва |
Об'єм |
Призначення |
R16 |
temp |
1 байт |
Тимчасове зберігання даних |
R17 |
temp2 |
1 байт |
Тимчасове зберігання даних |
R18 |
cnt |
1 байт |
Лічильниккількостінатисканьклавіші К |
R19 |
leds |
1 байт |
Зберігання вихідних значень для діодів (СД1-СД3) та керуючого сигналу вихідного демультиплексору |
5. Опис програми
5.1 Опис основної програми
На початку програми підключаються два файли: "8535def.inc" та "segment.inc".
Коли перший файл підключається до програмного коду на мові Асемблер, до всіх регістрів вводу-виводу та бітів цих регістрів, що описані в документації до мікроконтролера можна звертатися за їх іменами. Також задані імена XL - ZH для шести регістрів, використовуваних як вказівники X, Y та Z. Це покращує зрозумілість програмного коду та додає зручності при його написанні.
В файлі segments.inc визначено комбінації, які потрібно подати на семисегментний індикатор, щоб засвітити той чи інший символ.
Далі в програмному коді задаються константи компіляції, що дозволяють уніфікувати програму тим самим полегшити її відлагодження. Потім визначаються макроси, які дозволяють уникнути багаторазового повторення інструкцій в програмному коді: макрос замінюється на описані в ньому інструкції, причому макрос може приймати аргументи та передавати їх інструкціям. Тим самим макрокоманда поводить себе як інструкція, яка виконується за N тактів, де N єсумою тактів інструкцій, що входять до макросу.
Далі виконується початкова ініціалізація стеку. Це необхідно оскільки програма використовує виклики підпрограм.
Після цього за допомогою макроінструкціїsti виконується завантаження вектора значень, що знаходиться в файли segments.incі відповідає кодам для запалення відповідних символів на семісегментному індикаторі, до ОЗП.
Виконується налаштування портів . Відбувається скидання регістру cnt, завантаження в регістр leds константи 000000012, що відповідає за засвічування світло діода СД1. Завантаження в старший байт регістру покажчику Y старшої частиниадреси таблиці decode.
Потім програма переходить до основного циклуloop. Перевіряється, чи натиснута клавіша К. Якщо клавіша натиснута викликається підпрограма RotateCnt. Після повернення з підпрограми RotateCnt викликається підпрограма SoftDelay, яка робить затримку у 2045 тактів для уникнення зайвих переключень при дуже довгому утримуванні кнопки або при брязкоті контактів. Якщо клавіша не натиснута то програма переходить по мітці btn_not_pressed.
Відбувається завантаження даних з порту А в регістр temp2. Потімдані з регіструtemp2 копіюються в регістр temp для того, щоб при обробці молодшого напівбайту даних, зчитаних з порту А залишився незмінним старший напівбайт.
Відбувається маскування даних, що знаходяться в регістрі temp константою 0F16, щопризводить до скидання старшого напівбайтузчитаних даних. Викликається процедура DoDecode. Після повернення з підпрограми декодовані дані виводяться до порту D. Далі вміст регістру ledsзавантажується в регістрtemp. Регістрledsбув заповнений при виконанні підпрограми RotateCnt. Старші 5 біт цього регістру заповнені 0, молодші 3 біти відповідають за те, який діод (СД1–СД3) буде світитись. Наступною командою виконується логічне або регістру ledsз константою 000100002, тобто встановлення в цьому регістрі 4 біта в 1 для керування вихідним демультиплексором через порти PC4, PC3. Регістр ledsзаписується в порт С і викликається ще раз підпрограма затримки. Після повернення з підпрограми затримки дані з регістру temp2 завантажуються в регістр temp для відновлення старшої частини зчитаних даних. Відбувається маскування даних, що знаходяться в регістрі temp константою F016, призводить до зануленнямолодшогонапівбайтузчитаних даних. Викликається процедура DoDecode, яка перекодовує дані в код, який коректно буде відображатись на семи сегментному індикаторі. Після повернення з підпрограми декодовані дані виводяться до порту D. Далі вміст регістру ledsзавантажується в регістрtemp. Регістрledsбув заповнений при виконанні підпрограми RotateCnt. Старші 5 біть цього регістру заповнені 0, молодші 3 відповідають за те, який діод (СД1-СД3) буде світитись. Далі логічне або регістру ledsз константою 000010002, тобто встановлення в цьому регістрі 3 біта в 1 для керування вихідним демультиплексором через порти PC4, PC3. Регістр ledsзаписується в порт С і викликається ще раз підпрограма затримки.
5.2 Опис підпрограми вибору каналу мультиплексору
Підпрограма RotateCnt виконує циклічнеінкрементування лічильника cnt. Цей лічильник має рахувати від 0 до 2. Нюанс полягає в тому, що при рахуванні мають переключатись біти 1-й та 2-й, так як 0-й біт зайнятий клавішею К. Для цього лічильник інкрементується двічі кожен раз. На приклад, початкове значення в регістрі 000000002, тобто біти 1-й та 2-й містять 0, що відповідає за нульовий канал мультиплексора. Після двох команд інкрементування в цьому регістрі буде значення 000000102, біт 0 залишився незмінним, а біти 2-й та 1-й видають значення 012, отже вибирається перший канал мультиплексора. Після ще одного виклику підпрограми біти 2-й та 1-й будуть містити значення 102. При досягненні регістром лічильника цього значення відбувається скидання регістру cnt. Тобто лічильник циклічно дорахував до 2 і перекинувся на 0, обравши знову нульовий канал мультиплексора. Після роботи з регістром cntв підпрограмі, в залежності від вмісту регістру cntзавантажуються дані в регістр leds, що відповідають за те, який з світлодіодів (СД1–СД3) буде світитися. В кінці підпрограми вміст регістру cnt виводиться у порт B. Відбувається вихід з підпрограми командою ret.
5.3 Опис підпрограми декодування старшого напівбайту у код семи сегментного індикатора
Підпрограма DoDecodeвиконує перетворення вхідних даних в код семи сегментного індикатору. В регістр покажчик YLзавантажується початкова адреса таблиці decode. Потім до цієї адреси додається зміщення, яке являє собою чисельне значення, зчитане з порту А. Потім у регістр tempзавантажуються дані з памятіSRAMз вказаної адреси в регістри покажчику Y. Відбувається вихід з підпрограми командою ret.
5.4 Опис підпрограми затримки
Підпрограма SoftDelayвиконує затримку в 2042 такти. На початку в регістр temp завантажується константа DELAY, яка була ініціалізована на початку програми. Далі виконується 6 пустих команд, після чого вміст регістру tempдекрементується д тих пір, поки він не стане рівним 0. Після досягнення 0 відбувається вихід з підпрограми командою ret.
6. Моделювання пристрою
Моделювання пристрою проходило в 2 етапи:
На першому етапі було проведено перевірку правильності написання програми, а також проведено їїпокрокове (покомандне) виконання.
На другому етапі для реалізації моделювання пристрою в середовищі моделювання схем ProteusVSM було складено схему електричну принципову, яка має наступний вигляд:
Рис.2. Схема електрична принципова розроблюваного пристрою
На схемі представленi:
- МК (U1);
- світлодіоди (СД1 – СД3)які показують, який канал вхідних даних обрано;
- світлодіоди (MUX_1, MUX_2)що використані для того, щоб показати зміну сигналів на керуючих входах вхідного мультиплексора;
- світлодіоди (DEMUX_1, DEMUX_2)що використані для того, щоб показати зміну сигналів на керуючих входах вихідного демультиплексора;
- вхідні шини від датчиків замінені перемикачем DSW1 для полегшення моделювання;
- кнопка К;
- семи сегментний індикатор;
При моделюванні схеми у середовищі Proteus VSM отримано наступні результати:
- На перемикачі DSW1 виставлена комбінація 010100002, яка представляє у шістнадцятковому вигляді значення 5016:
Рис.3. Робота схеми при першому вибраному каналі даних
Як видно із рисунку 3, при коді 5016на перемикачі DSW1, на порт D МК виводиться значення 510, а на керуючі входи демультиплексора виводиться сигнал 102, що по базовій схемі відповідає вибору індикатора 2. На діодах MUX_1 та MUX_2 видно сигнал 002. Це значення показує, що обрано перший канал вхідного мультиплексору.
- Продовжується моделювання, дані на вхідному портіА не змінюються:
Рис.4. Реакція схеми на спрацювання датчика 2
Як видно із рисунку 4, через декілька тактів процесора змінюються дані на виході порту D на значення 010, а також на портах керування вихідним демультиплексором (піни PC3 та PC4) встановлюється значення 012. Це значення відповідає за індикацію на даних з порту D на першому індикаторі.
- при натисканні клавіші К 1 раз перемикаються сигнали керування вхідним мультиплексором(діоди MUX_1 та MUX_2), вони показують значення 012, гасне сітлодіод СД1 та починає світитись діод СД2. Тобто відбулося переключення вибору вхідних портів:
Рис. 5. Реакція схеми на натискання клавіші К
Висновок
У рамках курсової роботи, відповідно до завдання розроблено мікропроцесорну вимірювальну систему.У якості кристала використано восьми-бітний мікроконтролерAT90S8535.Завдання коректно виконане, це підтверджується результатами моделювання.
Аналізуючи програмну частину завдання можна виділити наступні особливості:
- перевагами написаної програми являється повна закоментованість коду, використання макросів, що допомагає зменшити обсяг коду а також зручність читання коду;
- недоліками програми є відсутність детектування імпульса, тобто якщо клавіша натиснута на час довший, ніж час затримки, то відбувається повторне спрацювання. Цей недолік легко виправити, додавши у программу цикл для детектування імпульсу.
Проект можливо перенести на більшість інших мікроконтролерів AVR. В більшостівипадківдостатньо просто змінити .inc файл на початку програми. Тобто цей проект має великі шанси на використання в промисловості, так як його легко перенести на інші мікроконтролери.
Список використаної літератури
- Система команд 8-розрядних RISC мікроконтролерів сімейства AVR – 111 с.
- Трамперт В. AVR-RISC мікроконтролери – М.: МК-Пресс, 2006 – 466 с.
- ISIS – Інструкція користувача. Пер. з англ. А.П. Гордійчук, 2004 – 35 с.
- DATA SHEET 8-bit AVR Microcontroller with 8K Bytes In-System Programmable Flash – November 2001 – 127 c.
- DATA SHEET SN54425QUADRUPLE BUS BUFFERS WITH 3-STATE OUTPUTS – December 1983 – 3c.
- DATA SHEET CD4051 CMOS Analog Multiplexer/Demultiplexerwith Logic Level Conversion – October 2003 – 28 c.