2 Алгоритми і програми проектування мікропроцесорних систем
2.1 Мета занять
Вивчити відмітні особливості проектування електронних апаратів з вбудованими мікропроцесорними засобами, етапи проектування програмної частини. Розглянути методи побудови алгоритмів та їх реалізацію у машинних кодах.
2.2 Методичні вказівки з організації самостійної роботи студентів
Для системи, що містить МП, потрібне проектування як апаратних, так і програмних засобів [1].
Проектування апаратної частини може бути виконано з використанням стандартної методології проектування апаратури.
Проектування програмного забезпечення краще за все може бути виконано з використанням мови проектування, подібного природній мові.
Програмне забезпечення будується шляхом перетворення конструкцій мови проектування на мову програмування мікрокомп'ютера (МК). Програмування – це опис послідовності дій користувача, які мають виконуватися для вирішення поставленого завдання. Для успішного вирішення завдання необхідно пройти через певні етапи програмування:
1. Постановка завдання. В деяких випадках постановка завдання не завжди очевидна. Якщо це так, то втрачається багато сил і засобів. Коректна постановка завдання – гарантія успішного його розв`язання.
2. Вибір найбільш прийнятного методу розв`язання. На цьому етапі здійснюється вибір з безлічі можливих методів розв`язання задачі. При цьому необхідно врахувати конкретні властивості вживаного ОП, тобто швидкодію, об'єм пам'яті, наявність стандартних програм тощо.
3. Визначення типів вхідних і вихідних даних. Необхідно визначити форму опису і відображення використовуваних під час розв`язання задачі даних, які часто можуть мати складну і нерідко неявну структуру. Тут необхідний детальний аналіз даних, визначення точності обробки даних, особливо якщо вони надходять від датчиків з великою погрішністю.
4. Проектування і аналіз розв`язання, зокрема порівняння схем, описів тощо. Тут необхідно визначити окремі кроки розв`язання і організувати їх логічну послідовність дій для виконання. Цю послідовність можна відобразити у вигляді схеми алгоритму.
5. Кодування алгоритму мовою програмування. Часто саме цей етап помилково називають програмуванням, хоча, по суті, кодування – це тільки частина всього процесу створення програми.
6. Перевірка і відлагодження програми. Для виправлення помилок необхідно ретельно проаналізувати текст програми.
Весь процес, як правило, носить ітераційний характер. Якщо одержаний розв`язок не задовольняє користувача з причини невисокої точності, недостатньої швидкодії або з яких-небудь інших причин, йому доводиться маніпулювати початковими даними, шукати інший метод розв`язання, інакше планувати виконання завдання.
Одним з важливих етапів програмування є етап складання послідовності дій для вирішення поставленого завдання, тобто побудови алгоритму. Реалізувати це можна з використанням мови проектування, або шляхом складання схем.
Використання мови проектування можна розглянути за допомогою простого прикладу.
Приклад 2.1. Нехай маємо систему з мікрокомп'ютера з двома виходами (рис. 2.1), яка має реалізовувати функцію перетворення, наведену на рис. 2.2.
Рисунок 2.1 – Структурна схема мікрокомп'ютерної системи
За наявності у системи входів і виходів можна зробити висновок про те, що мікрокомп'ютер повинен мати можливість перевіряти значення кожного входу, а також встановлювати кожний з виходів у певні значення.
Мовою проектування в операціях перевірки та установки використовуються прості конструкції.
Перевірити Вх.1 і запам'ятати його значення.
Встановити значення Вих.1, рівне 6.
Рисунок 2.2 – Функція перетворення
Необхідно також мати можливість перевіряти умови, яким задовольняють значення кожного зі входів, що зберігаються, для встановлення вихідних значень. З цією метою використовується умовна конструкція, яка в загальному вигляді може бути подана як: ЯКЩО (умови перевірки – істина). ТО (виконати що-небудь). ІНАКШЕ (виконати що-небудь інше). Таким чином, для даного прикладу опис мовою проектування спочатку матиме вигляд:
1. Перевірити Вх1 і зберігати його значення.
2. Перевірити Вх2 і зберігати його значення.
3. Якщо 4 8 Вх1 8 8, встановити Вих1 = 6.
4. Інакше Вих1 встановити = 0.
5. Якщо 2 8 Вх2 8 6, встановити Вих2 = 4.
6. Інакше Вич2 встановити = 0.
Коли система функціонує, мікрокомп'ютер виконує запрограмовані операції крок за кроком. Після того, як входи перевірені, немає впевненості, що потім при повторній перевірці один з них не виявиться зміненим. Тому необхідна така операція, яка дозволяла б виконувати інші операції мови проектування нескінчену кількість разів.
З цією метою використовується конструкція:
«ВИКОНУВАТИ БЕЗПЕРЕРВНО» . . . . . «КІНЕЦЬ»
У цій конструкції набір операцій, розташований ВИКОНУВАТИ БЕЗПЕРЕРВНО і КІНЕЦЬ, має повторитися без кінця.
В цьому випадку, одного разу розпочавшись, операція перевірки значень входів повторюватиметься стільки часу, скільки система залишається у дії.
З вищенаведеного прикладу можна зробити такі висновки:
мікрокомп'ютер є послідовним пристроєм і в кожен момент часу виконує тільки одну операцію;
у багатьох випадках, щоб змінити функціональну поведінку мікрокомп'ютерної системи, необхідно змінити лише деякі операції в описі програми мовою проектування.
МКП| маніпулює тільки цифровими даними. Якщо в системі є аналогові сигнали, для перетворення вхідних сигналів в цифрову форму необхідний АЦП|, а для перетворення вихідних сигналів в аналогову форму – ЦАП|.
Найбільш зручна показова форма подання алгоритму Розвязок задачі – графічна, у вигляді схеми [2]. Вона складається з упорядкованої сукупності умовних геометричних фігур, що несуть інформацію про певний характер операцій, умову, що накладається, прийняті позначення. Основні форми, які використовуються для подання схем алгоритмів згідно з діючими стандартами, наведені у додатку А.
Схеми алгоритмів можуть бути трьох типів: системні; укрупнені (основні); детальні (докладні).
Приклад 2.2. Скласти схему алгоритму формування двох наборів цілих чисел, що знаходяться в діапазоні від -5 до +5.
Розвязок. Шляхом сортування організувати два набори, один з яких включає позитивні числа, а інший – негативні. Укрупнена схема алгоритму Розвязок цієї задачі наведений на рис. 2.3.
Рисунок 2.3 – Схема алгоритму з розгалуженням
Під час програмування можливе використання підпрограм. Підпрограма – це частина програми, використовувана зазвичай кілька разів у процесі її виконання. Проте текст підпрограми записується програмістом тільки один раз. Коли ж програмісту необхідно скористатися підпрограмою, достатньо вказати в програмі відповідну команду виклику (звертання до підпрограми), що адресується до області пам'яті, в якій розташована підпрограма. З цією метою в мові програмування для більшості МП| існує команда CALL (викликати). У цій команді після коду операції (CALL) зазначається ім'я підпрограми, яке присвоєне фізичній адресі в області пам'яті, де розташована дана підпрограма.
Останньою виконуваною командою підпрограми є команда RET (return – повернення). За цією командою виконується повернення до основної програми, перерваної командою виклику.
Реалізація необхідного алгоритму обчислення досягається шляхом підготовки, відлагодження і запису в ПЗП відповідної програми. Мікропроцесор здатний сприймати лише програми, що складаються з послідовності команд, поданих двійковими кодами. Програмування безпосередньо в машинних кодах вимагає постійної операції багаторозрядними двійковими числами, які являють як коди команд, так і коди операндів.
Приклад 2.3. Реалізувати в машинних кодах програму складання двох чисел, одне з яких 01100100 знаходиться в регістрі загального призначення (РЗП|) В, а друге – 00010111 розташоване в елементі пам'яті з адресою 0000000010001111.
Розв’язок. У даному випадку МП| має шістнадцятирозрядну| шину адреси. Фрагмент програми наведений у табл|. 2.1.
Таблиця 2.1 – Програма складання в машинних кодах |
|
Таблиця 2.2 – Програма складання в шістнадцяткових| кодах | ||||
Адреса пам'яті |
Мнемокод |
|
Мнемокод |
Адреса |
Н - код |
Vt |
0000 0000 0000 0100 |
01111000 |
|
MOV A,B |
0004 |
78 |
5 |
0000 0000 0000 0101 |
00100001 |
|
LXI H |
0005 |
21 |
16 |
0000 0000 0000 0110 |
10001111 |
|
|
0006 |
8F |
|
0000 0000 0000 0111 |
00000000 |
|
|
0007 |
00 |
|
0000 0000 0000 1000 |
10000110 |
|
ADD M |
0008 |
86 |
7 |
0000 0000 0000 1001 |
01110110 |
|
HLT |
0009 |
76 |
7 |
. . . . . . . . . . . . . . . . . |
. . . . . . . . . |
|
. . . . . . . . . |
. . . . . . |
. . . . . . |
. . . . |
0000 0000 0000 0100 |
00010111 |
|
|
008F |
17 |
|
Перша команда – пересилання вмісту регістра В в акумулятор – є однобайтовою. Код операції розташований у ПЗП за адресою 0000 0000 0000 0100, яка для даної програми є початковою.
Наступна команда – трибайтова, має код операції 00100001, що являє перший байт команди. Другий і третій байти, розташовані в чергових осередках ПЗП, містять відповідно молодшу і старшу частині адреси 1000 1111 0000 0000, передані за цією командою в регістрову пару H і L.
Розгляд такої простої програми показує, наскільки незручним і недостатньо наочним є відображення чисел у машинних двійкових кодах. Дещо простіше і зрозуміліше запис машинних кодів проводити в шістнадцятковій| системі.
У табл|. 2.2 наведений фрагмент тієї самої програми, записаної в шістнадцяткових| кодах. Поряд з кодом операції показані його мнемонічне зображення і найменування операндів, прийняті в системі команд даного МП|. Наприклад, шістнадцятковий| код команди 78, що має мнемонічне позначення MOV A,B, відповідає операції пересилання вмісту регістра В в акумулятор А. У табл|. 2.2 також вказане число тактів Vt, необхідне для виконання кожної команди. Для виконання всієї програми потрібно 35 машинних тактів.
Найбільш зручним методом написання програм є використання мнемонічних кодів, що складаються з абревіатури повної назви інструкції. В цьому випадку мнемокод відображає змістовний сенс виконуваної операції.
Приклад 2.4. Визначити модуль числа.
Розв’язок. Під час дослідження сигналів часто доводиться оцінювати погрішність вимірювання за модулем. У зв'язку з тим, що від’ємні числа подаються в додаткових кодах, при визначенні модуля не можна обмежитися тільки відкиданням знаку числа, інформація про яке поміщена в старшому біті. Якщо число позитивне, то його слід помножити на -1. Знак можна визначити, використовуючи операцію маскування або засилання старшого біта в тригер перенесення з подальшим його аналізом. У даному випадку ці операції небажані, оскільки супроводжуються зміною вмісту акумулятора. Доцільно застосувати команду логічного складання вмісту акумулятора з самим собою. При цьому вміст акумулятора не змінюється, а прапорці встановлюються у відповідні стани. Умовний перехід виконується за вмістом тригера знаку.
На рис. 2.4 зображена схема алгоритму визначення модуля числа, що знаходиться в регістрі Е.
Рисунок 2.4 – Схема алгоритму визначення модуля числа |
Алгоритм працює так. Число з регістра Е пересилається в акумулятор. У результаті виконання операції логічного складання акумулятора з самим собою в тригер знаку записується старший біт числа. За допомогою команди умовного переходу здійснюється розгалуження програми. Якщо S=0 (позитивне число) умова не виконується, то проводиться зміна знака числа і модуль числа з акумулятора пересилається в регістр Е. Знак числа змінюється застосуванням операції доповнення, що полягає в інвертуванні усіх розрядів числа (команда CMA) з подальшим збільшенням одиниці до молодшого розряду (команда INR A). Якщо умова S=0 виконується (число позитивне), то за умовним переходом JР M2 три останні команди не виконуються, вміст регістра Е не змінюється, а виконання програми продовжується з адреси 01F8, відповідно мітки М2. Програма в машинних кодах з коментарями наведена в табл. 2.3.
|
Таблиця 2.3 – Програма визначення модуля числа
Мітка |
Мнемокод |
Операнд |
Адреса |
Н-код |
Коментар |
Vт |
|
MOV |
A, E |
01F0 |
7B |
Пересилання в акумулятор |
5 |
|
ORA |
A |
01F1 |
B7 |
Визначення знака числа |
4 |
|
JP |
M2 |
01F2 |
F2 |
Умовний перехід за позитивним значенням |
10 |
|
|
|
01F3 |
F8 |
|
|
|
|
|
01F4 |
10 |
|
|
|
CMA |
A |
01F5 |
2F |
Зміна знака числа |
4 |
|
INR |
A |
01F6 |
3C |
|
5 |
|
MOV |
E, A |
01F7 |
5F |
Пересилка в регістр Е |
5 |
M2: |
|
|
10F8 |
|
|
|
2.3 Контрольні запитання і завдання
1. Які етапи програмування передують кодуванню алгоритму мовою програмування?
2. Які етапи програмування виконуються після етапу визначення типів вхідних і вихідних змінних?
3. Які вимоги висуваються до алгоритмів?
4. Які можливі типи схем алгоритмів і їхня область застосування?
5. У яких випадках переважне написання програм у машинних двійкових кодах?
6. У яких випадках переважне написання програм у мнемокодах?
7. Що розуміється під вкладенням підпрограм?
2.4 Приклади аудиторних і домашніх завдань
Приклад 2.6. Організувати програмно лічильник циклів.
Розв’язок. Для реалізації завдання складається перелік кроків, тобто схема алгоритму.
Схема алгоритму наведена на рис. 2.5, а фрагмент програми – у табл. 2.4.
Рисунок 2.5 – Схема алгоритму рахунку циклів
Для МП з регістр-акумуляторною архітектурою як лічильник циклів може бути один РЗП, наприклад, регістр В. За командою в нього заноситься число N, що визначає кількість повторюваних циклів. У даному завданні умовно встановлюється N=16. Для визначеності приймаємо, що ділянка програми, яку необхідно повторити 16 разів, починається командою логічної операції що «ВИКЛЮЧАЄ АБО» XRA A, розташованої за адресою 1002, і закінчується командою MOV D, A. Ця команда розташована за адресою 10А1H і пересилає дані з акумулятора в регістр D. Після кожного виконання цієї ділянки програми вміст лічильника (регістра В) зменшується на одиницю за допомогою команди DCR B (адреса 10А2). До тих пір, поки вміст регістра В відмінний від нуля, ознака Z має нульове значення і програма переходить до виконання команди, адреса 1002 якого міститься в другому і третьому байтах команди JNZ (перехід за відсутності нуля). Вказана адреса позначена у програмі міткою М, тобто мітка М1 є мнемонічним позначенням адреси 1002.
Таблиця 2.4 – Програма рахунку циклів
Мітка |
Мнемокод |
Операнд |
Адреса |
Н - код |
Коментар |
Vt |
|
. . . . . . . |
. . . . . . . |
. . . . . . |
. . . . . . |
. . . . . . . . . . |
. . |
|
MVI |
B, 16 |
1000 |
06 |
Встановлення лічильника |
7 |
|
|
|
1001 |
10 |
N=16 у (B) |
|
M1: |
XRA |
A |
1002 |
AF |
Обнулення ознаки перенесення |
4 |
Продовження табл. 2.4 | ||||||
|
. . . . . . . |
. . . . . . . |
. . . . . . |
. . . . . . |
. . . . . . . . . . |
. . |
|
MOV |
D, A |
10A1 |
57 |
Пересилання вмісту А в регістр D (D:=A) |
5 |
|
DCR |
B |
10A2 |
05 |
Зменшення вмісту лічильника на 1 |
5 |
|
JNZ |
M1 |
10A3 |
C2 |
Перехід за умовою (N) 0 до елемента пам'яті з адресою 1002 |
10 |
|
|
|
10A4 |
02 |
|
|
|
|
|
10A5 |
10 |
|
|
|
. . . . . . . |
. . . . . . . |
. . . . . . |
. . . . . . |
. . . . . . . . . . |
. . |
Якщо в результаті чергового віднімання одиниці вміст регістра У виявиться рівним нулю (Z=1), то програма перейде до виконання команди, розташованої за JNZ. Відбувається вихід з циклічної ділянки програми. Якщо регістр В має вісім двійкових розрядів, то розглянута структура програми дозволяє організувати лічильник від 1 до 255 циклів.
Приклад 2.7. Визначити з двох позитивних чисел одне максимальне.
Розв’язок. Під час обробки сигналів часто з’являється необхідність визначення максимального з декількох позитивних чисел. Такі завдання виникають, наприклад, під час виявлення корисних сигналів або під час знаходження максимального значення сигналу при заданому інтервалі часу. Знаходження максимального з декількох чисел зводиться до послідовного визначення максимального з двох чисел.
Вважатимемо, що одне з чисел, які перевіряються, знаходиться в регістрі А, друге – в регістрі В. Потрібно після визначення більше число помістити в регістр В, а менше – в акумулятор. Схема алгоритму реалізації даного завдання наведена на рис. 2.6, а програма в машинних кодах – у табл. 2.5.
Рисунок 2.6 – Схема алгоритму знаходження
максимального з двох позитивних чисел
У системі команд МП є команда порівняння СМР, яка не змінює вмісту акумулятора, проте встановлює трігер ознаки CY (перенесення) в одиничний стан, якщо вміст акумулятора менше вмісту регістра.
Таблиця 2.5 – Програма знаходження більшого з двох позитивних чисел
Мітка |
Мнемокод |
Операнд |
Адреса |
Н-код |
Коментар |
Vt |
|
CMP |
B |
00A1 |
B8 |
Порівняння чисел |
7 |
|
JC |
M1 |
00А2 |
DA |
Перехід на М1, якщо (А) <(В) |
10 |
|
|
|
00А3 |
А8 |
|
|
|
|
|
00А4 |
00 |
|
|
|
MOV |
C, A |
00A5 |
4F |
Обмін вмісту між акумулятором і регістром B через регістр З |
5 |
|
MOV |
A, B |
00A6 |
7B |
|
5 |
|
MOV |
B, C |
00A7 |
41 |
|
5 |
M1: |
|
|
00A8 |
|
|
|