Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабраб.DOC
Скачиваний:
0
Добавлен:
22.08.2019
Размер:
1 Mб
Скачать

5.2 Порядок виконання роботи

  1. Ознайомитися з особливостями паралельних інтерфейсів мікропроцесорних систем, вивчити їх атрибути.

  2. Вивчити механізм програмного опитування пристроїв АЦП мікропроцесорною системою.

  3. Скласти програму мовою асемблера для МП К1810ВМ86, яка забезпечує виведення на принтер текстового рядка, що зберігається в сеґменті даних.

  4. За допомогою текстового редактора ввести текст програми керування обміном інформацією через паралельний інтерфейс мовою асемблера для МП К1810ВМ86 та зберегти його в каталозі вашої групи в C:\CPU\TASM\WORK.

  5. Домогтися правильної роботи розробленої програми.

  6. Зберегти файл з вихідним текстом програми, а також ехе-файл.

  7. Вийти з програми TASM.

  8. Скласти звіт щодо виконаної роботи.

5.3 Зміст звіту

  1. Титульний аркуш.

  2. Найменування та мета лабораторної роботи.

  3. Короткі теоретичні відомості.

  4. Отримане у викладача завдання (текст програми з докладними коментарями).

  5. Опис виконання кожного пункту завдання.

  6. Письмові відповіді на контрольні питання.

5.4 Контрольні запитання

  1. В чому полягає основна відмінність паралельних інтерфейсів від послідовних? Які переваги має кожний з типів інтерфейсів?

  2. Який паралеьлний інтерфейсів використовуються у мікропроцесорних системах для підключення принтера?

  3. З яких реґістрів складається адаптер паралельного інтерфейса для мікропроцесорних систем на базі МП К1810ВМ86?

  4. Опишіть призначення бітів реґістра статусу. Дайте пояснення особливостям використання.

  5. Опишіть призначення бітів реґістра керування. Дайте пояснення особливостям використання.

  6. Які режими роботи паралельного інтерфеса ви знаєте?

  7. Як здійснюється конфіґурування паралельного порта? Привести приклад програмного коду вибору порта LPT2 та виведення символа на друк.

Лабораторна робота № 6 програмне опитування датчиків технологічної інформації. Програмне виведення інформації на зовнішній пристрій

Мета роботи.

Освоїти програмування додатків мовою асемблера для МП К1810ВМ86 для керування зовнішніми пристроями за допомогою портів введення/виведення

6.1 Теоретичні відомості

В разі використання мікропроцесорної системи для керування технологічним механізмом опитування датчиків технологічної інформації та перетворення аналогового сиґналу в цифровий, запис інформації в ОЗП виконується під керуванням МП.

Так, номер опитуваного датчика технологічних величин формується в одному з реґістрів загального призначення (РЗП), наприклад, в реґістрі ВН. У 8-розрядному реґістрі в 5-ти старших розрядах записуються одиниці, а в трьох молодших розрядах - номер датчика. Спочатку в реґістрі ВН записано число F8 в 16-тиричной системі числення:

11111000=F8

001

010

При опитуванні кожного датчика вміст реґістра ВН збільшується на 1. При опитуванні останнього датчика в реґістрі записується число FF = 11111111.

Додавання наступної 1 обнуляє реґістр ВН. На виході тригера нуля TZ з'являється 1. Номер комірки пам’яті ОЗП, в яку повинен бути записаний результат опитування датчика, міститься в 16-розрядному реґістрі загального призначення (РЗП), наприклад, в реґістрі СХ.

Рис. 6.1 - Структура мікропроцесорної системи збору даних на базі МП К1810ВМ86

Алгоритм роботи системи збору даних: наприклад вважатимемо, що перший зайнятий осередок ОЗП має номер 1350 в шістнадцятковій системі. У ньому буде розміщений результат опитування 1-го датчика з номером 000. Через акумулятор і шину даних номер датчика подається на пристрій виведення 1 (УВ1). УВ1 подає номер датчика на комутатор. Комутатор опитує потрібний датчик і передає аналоговий сиґнал на АЦП. АЦП перетворить аналоговий сиґнал на цифровій і передає цифровий сиґнал на УВВ1. Якщо в першому такті імпульсної послідовності Ф1 МП передає номер датчика, то в другому такті він очікує приходу сиґнала закінчення перетворення від АЦП. Сиґнал закінчення дорівнює 1 передається через УВВ2, через шину даних в акумулятор. Наявність сиґналу закінчення акумулятор перевіряє операцією циклічного зрушення вправо. Якщо сиґнал закінчення надійшов, то при зрушенні вправо 1 з молодшого розряду акумулятора передається в тригер зрушення ТС, тригер зрушення перемикається в стан 1 і дані з пристрою введення 1 по шині даних передаються в акумулятор, а з нього в осередок ОЗП. Вміст 16-розрядного реґістра і реґістра ВН збільшується на 1, при цьому формується номер наступного датчика і номер осередку, куди повинен бути поміщений наступний результат вимірювання.

Кожний пристрій введення/виведення, кожний системний пристрій має один або декілька реґістрів, доступ до яких здійснюється через адресний простір введення/виведення. Ці реґістри мають розрядність 8, 16 або 32 біт. Адресний простір введення/виведення фізично незалежний від простору оперативної пам’яті й має обмежений об’єм, що становить 216, або 65 536 адрес введення/виведення. Таким чином, поняття порта введення-виведення можна визначити як 8, 16 або 32-розрядний апаратний реґістр, що має певну адресу в адресному просторі введення/виведення. Вся робота системи з пристроями на найнижчому рівні виконується з використанням портів введення-виведення. На рис. 6.1 показана сильно спрощена, концептуальна схема управління устаткуванням мікропроцесорної системи.

Рис. 6.1 - Концептуальна схема управління устаткуванням мікропроцесорної системи

Як видно з рис. 6.1, самим нижнім рівнем є рівень базової системи введення-виведення (ВІОS), на якому робота з устаткуванням ведеться безпосередньо через порти. Тим самим реалізується концепція незалежності від устаткування. При заміні устаткування необхідно лише підправити відповідні функції ВІОS, переорієнтувавши їх на нові адреси і логіку роботи портів.

Принципово керувати пристроями безпосередньо через порти нескладно. Відомості щодо номерів портів, їх розрядності, форматів керуючої інформації приводяться в технічному описі на пристрій. Необхідно знати лише кінцеву мету своїх дій, алгоритм, відповідно до якого працює конкретний пристрій, і порядок програмування його портів. Тобто фактично, потрібно знати, що і в якій послідовності потрібно послати в порт (при записі в нього) або отримати з нього (при читанні) і як потрібно трактувати отриману інформацію. Для цього достатньо всього дврх команд, що входять в систему команд мікропроцесора:

IN акумулятор, номерпорта - введення в акумулятор з порту з номером (номер_ порту);

OUT порт, акумулятор - виведення вмісту акумулятора в порт з номером номеру порту.

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

Як відомо, у персонального комп'ютера є внутрішній динамік. Але при цьому спеціальної схеми ґенерації звуку для нього немає. Сиґнал для управління динаміком формується в результаті спільної роботи мікросхем:

1. програмованого периферійного інтерфейсу (ППІ) І8255;

2. таймера І8253.

Загальна схема формування такого сиґналу показана на рис. 6.2.

Рис. 6.2 - Схема формування звука для вбудованого динаміка ПЕОМ

Основна робота щодо ґенерації звуку виконується мікросхемою таймера. Мікросхема таймера (або просто таймер) має три канали з абсолютно однаковими внутрішньою структурою й принципом роботи. На канали таймера подаються імпульси від мікросхеми системного годинника, який являє собою генератор імпульсів, що працює з частотою 1,19 Мгц. Кожен канал має два входи та один вихід. Виходи каналу замкнуті на цілком певні пристрої комп'ютера. Так, канал 0 замкнутий на контролер переривань і є джерелом апаратного переривання від таймера, яке виникає 18,2 рази на секунду. Канал 1 зв'язаний з мікросхемою прямого доступу до пам'яті (DМА). І нарешті, канал 2 виведений на динамік комп'ютера. Основу каналів таймера складають три реґістри: реґістр введення-виведення розрядністю 8 бітів, реґістр-фіксатор (latch register) і реґістр-лічильник, обидва по 16 бітів. Всі реґістри зв'язані між собою таким чином. До реґістру введення-виведення ззовні поміщається деяке значення. Джерелом цього значення, може бути або системне програмне забезпечення, або програма користувача. Кожен реґістр введення-виведення має адресу в адресному просторі введення-виведення (номер порту введення-виведення). Реґістр введення-виведення каналу 2 має номер порту введення-виведення 42h. Значення, що поміщаються в нього, негайно потрапляють в реґістр-засувку або, як його ще називають, реґістр-фіксатор, де значення зберігається допоки в реґістр введення-виведення не буде записано нове значення. Узгодження цих реґістрів за їх розрядністю, (один з них 8, а інший 16-розрядний) здійснюється за допомогою реґістру управління (йому відповідає порт 43h), який є частиною механізму управління всією мікросхемою таймера. Він містить слово стану, за допомогою якого здійснюється вибір каналу, завдання режиму роботи каналу і тип операції передачі значення в канал. Слово стану має структуру:

- біт 0 визначає тип константи перерахунку: 0 - константа задана двійковим числом, 1 - константа задана двійково-десятковим (ВСD) числом. Константа перерахунку - значення, що завантажується ззовні в реґістр-фіксатор; у даному випадку завантажуватися буде двійкове число, тому значення цього поля буде 0;

- біти 1-3 визначають режим роботи мікросхеми таймера. Усього можна визначити шість режимів, але зазвичай використовується третій, тому для нашого випадку значення поля - 011;

- біти 4-5 визначають тип операції: 00 - передати значення лічильника в реґістр-фіксатор (тобто можлива не тільки операція запису значення в канал, але і зчитування значення реґістра-лічильника з нього), 10 - записати в реґістр-клямку тільки старший байт, 01 - записати в реґістр-клямку тільки молодший байт, 11 - записати в реґістр-клямку спочатку старший байт, а потім молодший. У нашому випадку значення поля буде 11. Тому формування 16-бітного реґістра-фіксатора через 8-бітовий реґістр введення-виведення проводиться таким чином: запис проводиться в два прийоми, перший байт з реґістра введення-виведення записується на місце старшого байта реґістра-фіксатора, другий байт - на місце молодшого байта. В реґістр введення-виведення ці байти поміщаються командами IN та OUT.

- біти 6-7 визначають номер програмованого каналу. У даному випадку вони дорівнюють 10.

Для формування будь-якого звуку необхідно задати його тривалість і висоту. Після того, як значення з реґістра введення-виведення потрапило в реґістр-фіксатор, воно відразу записується до реґістра-лічильника. Відразу ж після цього значення реґістра-лічильника починає зменшуватися на одиницю з надходженням кожного чергового імпульсу від системного годинника. На виході будь-якого з трьох каналів таймера встановлено схему логічного множення. Ця схема має два входи і один вихід. Значення реґістра-лічильника бере участь у формуванні сиґналу на одному з входів схеми логічного множення І. Сиґнал на другому вході цієї схеми залежить від стану біта 0 реґістра мікросхеми інтерфейсу з периферією (порт 61п). Коли значення в реґістрі-лічильнику стає рівним нулю, на відповідному вході схеми І формується одиниця. І якщо при цьому на другому вході, значення якого залежить від біта 0 порту 61h, також 1, то імпульс від системного годинника проходить на вихід каналу 2. Одночасно з пропуском імпульсу в каналі 2 негайно проводиться завантаження вмісту реґістра-фіксатора в реґістр-лічильник. Весь процес із зменшенням вмісту реґістра-лічильника повторюється заново. Таким чином, чим менше значення завантажене в реґістр-фіксатор тим частіше буде обнулення реґістра-лічильника і тим частіше імпульси проходитимуть на вихід каналу 2. Це означає, що висота звуку буде вища. Зрозуміло, що максимальне значення частоти на вході 1 динаміка - 1,19 Мгц. Таким чином імпульс з виходу каналу 2 потрапляє на динамік, і якщо на останній поданий струм, то виникає звук. Подачею струму на динамік управляє біт 1 порту 61h. Для переривання звучання можливі два шляхи: перший - відключити струм, скинувши біт 1 порту 61h, другий - скинути біт 0 порту 61h. Ці дві можливості використовують для створення різних звукових ефектів. Виконуючи ці розриви, фактично визначають тривалість звучання.

Перший канал таймера формує сиґнали апаратного переривання від таймера 18,2 рази на секунду (на основі цих сиґналів програми користувача відстежують час). Для цього ВІОS під час завантаження після включення комп'ютера завантажує в перший канал відповідне значення.

Таким чином, існують три послідовні дії, необхідні для програмування звукового каналу таймера (вони можуть бути застосовані й до решти каналів):

1. За допомогою порта 43h вибрати канал, задати режим роботи й тип операції передачі значення в канал. У даному випадку відповідне значення буде дорівнювати 10110110 – 0b6h.

2. Подати струм на динамік, встановивши біт 1 порта 61h.

3. Використовуючи реґістр АХ, помістити потрібне значення в порт 42h, визначивши тим самим потрібну висоту тону.

Приклад програми, що реалізовує звук сирени наведений в лістингу 6.1. Для зручності роботи в програмі була використана макрокоманда delay, що виконує затримку роботи програми на заданий час. Введена таким чином макрокоманда в тексті програми синтаксично нічим не відрізняється від інших команд асемблера і це дозволяє програмісту, в разі необхідності, розширити стандартний набір команд асемблера.

Варто відзначити, що макрокоманда чутлива до продуктивності мікропроцесора, з причини чого звук на комп'ютерах з різними моделями мікропроцесорів може відрізнятися. У рядками 37-38 виконується настройка каналу 2, яка полягає в записі в реґістр управління (порт 43h) байта стану 0b6h. Другим кроком треба встановити біти 0 і 1 порту 61h. Заздалегідь необхідно зчитати вміст цього порту. Це робиться для того, щоб виконувати установку бітів 0 і 1, не змінюючи вмісту решти бітів порту 61h (рядки 39-41). Принцип формування сиґналу сирени полягає в тому, що в циклі на одиницю змінюється вміст реґістра-лічильника і робиться невелика затримка для того, щоб сиґнал якийсь час звучав з потрібною висотою. Поступове підвищення, а потім зменшення висоти звуку і дає ефект сирени. Рядки 43-53 відповідають циклу, в тілі якого висота збульшується, а рядки 55-62 - циклу зниження тону. Обидва цикли повторюються послідовно 5 разів. Контроль за цим здійснюється за допомогою змінної CNT, вміст якої збільшується на 1 в рядку 69 і контролюється на рівність 5 в рядках 71-72. Якщо CNT = 5, то команда CMP встановлює певні прапорці. Наступна команда умовного переходу JNE аналізує ці прапорці й залежно від їх стану передає керування або на мітку, вказану в полі операнда цієї команди, або на наступну за JNE команду. Цикл в програмі асемблера можна організувати декількома способами. В даному випадку цикл організовується командою LOOP, яка за операнд має ім'я мітки. На цю мітку й передається керування при виконанні команди LOOP. Але до того, як передати керування, команда LООР аналізує вміст реґістра СХ, і, якщо він дорівнює нулю, керування передається не на мітку, а на наступну за LООР команду. Якщо вміст реґістра СХ не дорівнює нулю, то він зменшується на одиницю і керування передається на мітку. Таким чином у4-' СХ зберігається лічильник циклу. У нашій програмі він завантажується в СХ рядках 42 і 54.

Приклад 6_1.

;Програма, що імітує звук сирени.

;3міна висоти звуку від 450 Гц до 2100 Гц.

;Використовується макрос delay (затримка),

masm

model small

stack 100h

delay macro time

;макрос затримки, його текст обмежуеться директивами macro i endm.

;на вході - значения затримки (у мкс)

local ext, iter

push сx

mov cx,time

ext:

push сx

mov сx, 5000

iter:

loop iter

pop сx

loop ext

pop сx

endm

.data ;сеґмент даних

tonelow dw 2651 ;нижня частота звучания = 450 Гц

cnt db 0 ;лічильник для виходу з програми

temp dw ? ;верхня частота звучания

.code ;сеґмент коду

main: ;точка входа в програму

mov ax,@data ;зв'язати реґістр ds з сеґментом

mov ds,ax ;даних через peґicтр ax

хоr ах,ах ;очищуємо ах

go:

mov al,0B6h ;заносимо слово стану 10110110b (0B6h)

out 43h,al ;в командний реґістр (порт 43h)

in al,61h ;зчитати значення порта 61h в al

or al,3 ;ініціалізація динаміка i подача струму

out 61h,al ;на порт 61h

mov cx,2083 ;кількість кроків ступінчастої зміни тону

musicup:

;у ах значения нижньої частоти частоти звуку

mov ax,tonelow

out 42h,al ;порт 42h молодше слово ах:al

xchg al,ah ;обмін між al i ah

out 42h,al ;y порт 42h старше слово ax:ah

add tonelow, l ;підвищуємо тон

mov dx,tonelow ;y dx поточне значения висоти звуку

mov temp,dx ;temp - верхне значения висоти звуку

loop musicup ;повторити цикл шдвищення

mov cx,2083 ;відновити лічильник циклу

musicdown:

mov ax,temp ;y ax верхне значения висоти

out 42h,al ;у порт 42h молодше слово ax:al

mov al,ah ;обмін між al i ah

out 42h,al ;y порт 42h старше слово ax:ah

sub temp,l ;знижуємо висоту звуку

delay 1 ;затримка на 1 мкс

loop musicdown ;повторити цикл зниження

nosound:

in al,61h ;набудемо значения порту 61h в AL

and al,0FCh ;вимкнути динамік

out 61h,al ;у порт 61h

mov dx,2651 ;для подальших циклів

mov tonelow,dx

inc cnt ;збільшуемо значення лічильника проходів,

;тобто кількість звучань сирени

сmp cnt,5 ;у 5 разів?

jne gо ;якщо ні, перейти на мітку gо

ехіt:

mov ах,4с00b ;стандартний вихід

іnt 21h

end main ;кінець програми