MOVE.L #$1,D4 ; Завантаження лічильника циклів

; скремблювання-дескремблювання

M4: MOVE.L #$9,D0 ; Завантаження першого числа ПВП

M1: MOVE.L D0,D1 ; Запам’ятовування чергового числа ПВП

; у D1

MOVE.B (A0)+,D2 ; Скремблювання чергового елемента

EOR.B D0,D2 ; масиву вхідних сигналів

MOVE.B D2,(A1)+ ; та запам’ятовування його за адресою

; (А1)+

ANDI.B #$95,D0 ; Організація зворотних зв’язків

BSR EVEN ; Звернення до ПП визначення парності-

; непарності кількості одиниць у байті

MOVE SR,D5 ; Ні, пересилання SR до D5

BTST #$0,D2 ; Кількість одиниць є

BEQ.B M2 ; парна?

ANDI.B #$FD,D5 ; Встановлення Х до “0”

BRA.L M3 ; Обхід встановлення Х до “1”

M2: ORI.B #$10,D5 ; Так, встановлення Х до “1”

M3: MOVE D5,SR ; Відновлення регістра стану

MOVE.L D1,D0 ; Відновлення чергового числа ПВП

ROXL.B #1,D0 ; Циклічний зсув D0 ліворуч через Х

DBF D3,M1 ; Повернення до початку внутрішнього

; циклу

MOVEA.L #$400800,A0 ; Переадресування вхідного

MOVEA.L #$400900,A1 ; та дескрембльованого масивів сигналів

MOVE.L #$FE,D3 ; Перевантаження лічильника циклів

DBF D4,M4 ; Повернення до початку зовнішнього

; циклу

NOP ; Завершення програми

 

Слід зауважити, що при зверненні до ПП визначення кількості одиниць у байті значення байта, що міститься у D0, треба передавати з головної програми, а команду MOVE.L #$9,D0 вилучити з ПП.

Результатом виконання програми є три масиви: перший, що складається з відліків вхідного сигналу, розпочинаючи з адреси $400700; другий розпочинається з адреси $400800 і складається з кодованих сигналів, а третій, розташований за адресою $400900, складається з розкодованих відліків вхідного сигналу. Кожний з масивів складається з 255-ти елементів.

 

Приклад 12.4.2 Вимірювальна МПС оцінює якість N каналів зв’язку за Р параметрами і розпочинає свою роботу після надходження із зовнішнього пристрою ПВВ1 байта дозволу В1. Через пристрій виведення ПВИВ МПС видає номер поточного каналу, а через інтервал часу Т1 – номер поточного вимірюваного параметра. До шини даних підмикається відповідний вимірювальний прилад, який через пристрій введення ПВВ2 вводить до МПС значення вимірюваного параметра у вигляді байта. Якщо це значення перебуває у заданих межах, МПС переходить до вимірювання наступного параметра, якщо ж ні, – то записує до пам’яті, розпочинаючи з адреси ADDR1 номер хибного каналу, номер хибного параметра та його значення, а потім також переходить до вимірювання наступного параметра. Задані межі відхилення кожного параметра зберігаються у пам’яті, розпочинаючи з адреси ADDR2. Скласти програму, яка забезпечує роботу МПС за заданим алгоритмом.

 

Розподіл регістрів:

D0 – лічильник кількості каналів

D1 – лічильник кількості параметрів

D2 – лічильник кількості циклів у підпрограмі затримки DELAY

A0 – адресний регістр, до якого завантажується ADDR1

A1 – адресний регістр, до якого завантажується ADDR2

A2 – адресний регістр, до якого завантажується ADDR3 (адреса ПВВ1)

А3 – адресний регістр, до якого завантажується ADDR4 (адреса ПВИВ)

А4 – адресний регістр, до якого завантажується ADDR5 (адреса ПВВ2)

В1 – байт дозволу роботи МПС

Ві – поточний байт, який вводиться з ПВВ2

Перед виконанням програми до пам’яті, розпочинаючи з адреси ADDR2, треба послідовно записати стандартні значення кожного з вимірюваних параметрів.

 

МOVEA.L #$ADDR1,A0 ; Завантаження ADDR1 до A0

MOVEA.L #$ADDR3,A2 ; Завантаження адреси ПВВ1

MOVEA.L #$ADDR4,A3 ; Завантаження адреси ПВИВ

MOVEA.L #$ADDR5,A4 ; Завантаження адреси ПВВ2

MN: MOVE #$N-1,D0 ; Завантаження кількості каналів N-1

MP: MOVE #$P-1,D1 ; Завантаження кількості параметрів Р-1

M5: MOVEA.L #$ADDR2-1,A1 ; Завантаження ADDR2-1 до A1

M1: MOVE.B (A2),D3 ; Введення чергового байта Ві з ПВВ1

СМР #$B1,D3 ; Порівняння введеного байта з В1

BNE M1 ; Повернення на початок циклу

MOVE.B D0,(A3) ; Виведення номера каналу до ПВИВ

JSR DELAY

MOVE.B D1,(A3) ; Виведення номера параметра до

; ПВИВ через час Т

JMP M3

DELAY: MOVE #$K,D2 ; Завантаження до D2 числа К, яке

; визначає час затримки

М2: SUBQ #1,D2 ; Декрементування регістра D2

BNE М2 ; Повернення на дві адреси назад, якщо

; у регістрі D2 не 0

RTS ; Повернення з підпрограми DELAY

M3: MOVE.B (A4),D3 ; Введення значення вимірюваного

; параметра

ADDA,L #1,A1 ; Отримання адреси ADDR2+2

СMP2.B (A1)+,D3 ; Перевірка перебування введеного

; параметра у межах (А1) ≤ D3 ≤ (A1+1)

BЕQ М4

MOVE.B D0,(A0)+ ; Завантаження до пам’яті номера

; хибного каналу

MOVE.B D1,(A0)+ ; Завантаження до пам’яті номера

; хибного параметра

MOVE.B D3,(A0)+ ; Завантаження до пам’яті значення

; хибного параметра

М4: DBF D1,M3 ; Повернення на початок внутрішнього

; циклу по Р, якщо D1 не -1

MOVE #$P-1,D1 ; Відновлення лічильника циклів D1

DBF D0,M5 ; Повернення на початок зовнішнього

; циклу по N, якщо D0 не -1

JMP MN ; Циклування програми

 

При налагодженні програми у разі неможливості підключати пристрої введення-виведення треба імітувати надходження байтів параметрів зчитуванням їх з пам’яті як елементів масивів.

 

Приклад 12.4.3 Керувальна МПС послідовно перевіряє готовність до роботи N пристроїв з адресами ADDR1…ADDRN. МП видає через пристрій виведення ПВИВ адресу пристрою, який перевіряється на готовність, на комутатор. Комутатор підмикає пристрій до пристрою введення ПВВ, і МП може зчитати байт з виходу пристрою; якщо він дорівнює еталонному байтові $AA, то пристрій є готовий до роботи. Адреси готових до роботи пристроїв запам’ятовуються у послідовних комірках пам’яті, розпочинаючи з адреси ADDRR = ADDRN+1. Якщо в перебігу першого опитування виявляється, що жоден пристрій не є готовий до роботи, через час Т опитування повторюється і, в разі неготовності жодного пристрою, МПС завершує роботу.

 

MOVE.L #$ADDR1,A0 ; Завантаження адреси 1-го пристрою до А0

MOVE #$N-1,D0 ; Організація лічильника циклів за

; кількістю пристроїв

MOVE #$1,D1 ; Організація лічильника циклів за

; кількістю перевірок

EOR D3,D3 ; Обнулення регістра D3 – лічильника

; кількості готових пристроїв

MOVEА.L #$ADDRО,A1 ; Завантаження адреси пристрою

; виведення ПВИВ до А1

MOVEA. L #$ADDRІ,A2 ; Завантаження адреси пристрою ПВВ

; до А2

MOVEA. L #$ADDRR,A3 ; Завантаження початкової адреси

; масиву адрес готових до роботи

; пристроїв

M1: MOVEА.L A0,(A1) ; Виведення адреси i-го пристрою через

; порт виведення ПВИВ

АDDQ #1,А0 ; Нарощування адреси пристроїв

MOVE.B (A2),D2 ; Введення байта даних з пристрою

; ПВВ

CMP $AA,D2 ; Порівняння (D2) з байтом дозволу

; $AA

BNE M2 ; Ні, (D2) не дорівнює $AA

ADDI #1,D3 ; Так, (D2) дорівнює $AA,

; інкрекрементування лічильника D3

MOVEA. L A0,(A3)+ ; Завантаження адреси готового до

; роботи пристрою

M2: DBF D0,M1 ; Організація циклу за кількістю

; пристроїв

CMPI 0,D3 ; Перевірка лічильника D3 на рівність 0

BEQ M3 ; Всі прилади не є готові

JMP M5

M3: JSR DELAY ; Звернення до підпрограми DELAY

MOVEA.L #$ADDR1,A0 ; Відновлення адреси першого пристрою

MOVEA. L #$ADDRR,A3 ; Відновлення початкової адреси

; масиву адрес готових до роботи

; пристроїв

М4: DBF D1,M1 ; Завершення циклу за кількістю

; перевірок

M5: NOP ; Завершення програми

DELAY: MOVE #$K,D4 ; Завантаження до D4 числа К, яке

; визначає тривалість затримки

М6: SUBQ #1,D4 ; Організація

BNE М6 ; програмної затримки

RTS ; Повернення з підпрограми

 

Приклад 12.4.4 Керувальна МПС обробляє дані, які надходять у циклі від N датчиків через пристрій введення ПВВ у вигляді байтів за алгоритмом . Якщо для поточного даного Y = 1, то через час Т через пристрій виведення ПВИВ МПС виводить керувальний сигнал на відповідний виконавчий механізм і переходить до опитування наступного датчика. Якщо ж Y = 0, то МПС відразу переходить до приймання наступного даного.

Задамо номери N датчиків з N-2 по -1. Ці номери МПС видаватиме на зовнішній комутатор, який підмикає і датчики, і відповідні виконавчі механізми синхронно до ПВВ та ПВИВ.

Алгоритм оброблення даного, який є заданий у вигляді логічної функції, описано у [8]. Задля його реалізації треба виконати такі дії:

1 Помножити логічно дане на маску mask1, яка вміщує 1 у розрядах, відповідним наявним у даному розрядам, і 0 – у розрядах, які є відсутні, вилучаючи їх з розгляду, і здобути результат Y1.

2 Зробити операцію виключного АБО над результатом Y1 та маскою mask2, яка матиме 1 у розрядах, де х є інвертований, і 0 – у всієї решти, і здобути результат Y2.

3 Якщо Y2 ≠ 0, то Y = 0, і, навпаки, якщо Y2 = 0, Y = 1.

 

Фрагмент програми

 

MOVEА.L #$ADDR1,A1 ; Задання адреси ПВВ

MOVEА.L #$, ADDR2,A2 ; Задання адреси ПВИВ

LOOP: MOVE #$N-1,D0 ; Задання лічильника циклів

M1: MOVE D0,(A2) ; Виведення адреси N-го датчика

MOVE (A1),D1 ; Введення даного Yi

ANI.B #mask1,D1 ; Виключення розрядів, які є

; відсутні у Yi, знаходженняY1i

EORI.B #$mask2,D1 ; Знаходження Y2і

BEQ M3 ; Yi = 1

M2: DBF D0,M1 ; Y = 0, звернення за наступним даним

JMP LOOP ; Циклування програми

М3: JSR DELAY ; Звернення до підпрограми DELAY

MOVE D1,(A2) ; Виведення керувального слова

JMP M2

DELAY: MOVE #$K,D3 ; Завантаження до D3 числа К, яке

; визначає тривалість затримки

М4: SUBQ #1,D4 ; Організація

BNE М4 ; програмної затримки

RTS ; Повернення з підпрограми

 

Програма виконується у циклічному режимі неперервно.

 


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

1 Які фрагменти має вміщувати робоча програма, яка керує МПС?

2 Чи завжди МПС працює під керуванням операційної системи?

3 Які пристрої введення-виведення можуть входити до складу МПС?

4 Як називається програмний модуль, призначений керувати пристроями введення-виведення?

 

Контрольні питання підвищеної складності:

1 Напишіть фрагмент програми оброблення даних, які надходять у циклі від датчика через пристрій введення у вигляді байтів за алгоритмом . Якщо для поточного даного Y = 1, то через час Т через пристрій виведення ПВИВ МПС виводить керувальний сигнал на відповідний виконувальний механізм і переходить до опитування наступного датчика; якщо ж Y = 0, то МПС відразу переходить до приймання наступного даного. Кількість датчиків і значення даних задати самостійно. Програма повинна працювати в циклі.