Практична №3
Тема: Декомпозиція систем та структурування
Мета: На прикладі простого пристрою навчитися проводити структурування та декомпозицію систем.
Встп
Теорія систем застосовується у різноманітних аспектах нашого життя. Для розуміння роботи тої чи іншої системи необхідно вміти розбити її на підсистеми та намалювати структурну та функціональні схеми. Підсистема – це множина елементів і зв’язків з основної системи, які можуть розглядатися як один елемент на структурній або функціональній схемі.
Повна система, що досліджується, представлена електричною схемою на рис.1
Рис. 1. Електрична схема пристрою.
Вище сказане означає, що для спрощення розуміння роботи даної системи необхідно розбити її на підсистеми. На початку аналізу необхідно сформулювати мету. Метою даного пристрою є включення синхронного мотору (що представлений на схемі котушками L1 та L2) якщо натиснута кнопка дистанційного пульта з інфрачервоним випромінювачем.
Для з’ясування деталей побудуємо функціональну схему пристрою (рис.2):

Рис. 2. Функціональна схема роботи пристрою
Початкове налаштування системи
Для правильної роботи системи її необхідно привести в правильний початковий стан. Під початковим станом будемо розуміти настройку ніжок контроллера та регістри ШИМ, яка здійснюється наступною програмою:
main:
RSP
bset $2e,#6 ; скинути сторожовий таймер
ld A,#%11110101
ld $1,A
ld $2,A

ld A,#%01010000 ; Безпечний стан ніжок при зупиненому моторі
ld $0,A

ld A,#%01000000 ; Ніжка PB6 буде використовуватись для індикації
ld $4,A
ld $5,A
ld $3,A
clr $36 ; Для швидкої роботи АЦП
;-------------------------------------------------------------------------
LD A,#%00010000 ; завантажити маску джерела таймеру
LD $0D,A ; джерело таймеру від тактової частоти
LD A,#%00000001 ; завантажити маску дозволу ШИМ
LD $12,A ; дозвіл ШИМ на PA2

LD A,#%00001111 ; CNTR1 = 0..255:
LD $10,A ; початкове значення старшої частини лічильника
LD $17,A ; дорівнює старшій частині регістра порівняння
CLR $11 ; Молодша частина лічильника починається з «0».
;-------------------------------------------------------------------------
Підсистема прийняття сигналу
Прийняття інфрачервоного сигналу забезпечується фотодіодом D1. Для підсилення сигналу використовуються транзистори T1, T2. Дане з’єднання транзисторів забезпечує високий коефіцієнт підсилення, але є не стійким, оскільки вимагає підтримки напруги на базі T1 в дуже вузьких межах біля 0.6V. Для підтримки такого режиму роботи транзистора існує конденсатор C1, який забезпечує необхідну напругу. Цей конденсатор заряджається від ніжки PA2, на яку подаюся широтно-модульовані імпульси. Підсилені сигнали з фотодіоду вводяться в контроллер через ніжку PB0. Критерієм вірної роботи підсистеми прийняття інфрачервоного сигналу є середня напруга на ніжці PB0, яка приблизно дорівнює +3V. Таким чином, можна вважати, якщо напруга на PB0 менше +2.9V, то сприймається інфрачервоний імпульс, тобто транзистори T1, T2 відкриваються. Якщо напруга на PB0 стає більше +3V, або менше +3V, то система збільшує або зменшує ширину імпульсів на PA2, що приводить до збільшення або зменшення напруги на стабілізаційному конденсаторі C1. Завдяки такому регулюванню система не є чутливою до змін параметрів резисторів та конденсаторів вказаних на схемі.
Для реалізації алгоритму прийняття інфрачервоного сигналу можна скористатись наступним фрагментом:
READ_SIGNAL: ; Прочитати наступний біт даних
ld A,#128 ; 128 – це равновіддалене число до 0 і до 255,
ld $8A,A ; записали його в молодшу частина напруги на C1
M_SENS1: ; Задати напругу на PA2:
LD A,$8B ; старша частина значення напруги на C1
ld $18,A ; регістр ширини імпульсу ШИМ для ніжки PA2
LD A,#3 ; завантажити маску дозволу зміни значення ШИМ
LD $21,A ; дозвіл на зміну значення ШИМ
;======================================
call READ_PB0 ; Вхідна напруга на ніжці PB0 буде в регістрі A.
;======================================
cp A,#150 ; Поріг між «1» і «0» ( введений біт буде
; знаходитись в прапорці переносу.
rrc $80 ; Посунути біт переносу в старший біт
rrc $81 ; і всі введені біти зсунути на 1 біт вправо
rrc $82 ; через прапорець переносу.
rrc $83
rrc $84
rrc $85
;======================================
BSET $0,#0 ; Встановити біт PA0 для відладки програми
Ld A,$80
rrc A ; Перемістити останній введений біт на ніжку PB6
and A,#%01000000 ; Маска ніжок порту для виводу на світлодіод
Ld $3,A ; Вивести імпульс на світлодіод
BRES $0,#0 ; Скинути біт PA0 для відладки програми
;======================================
tnz $80 ; якщо останній прийнятий байт не нульовий
jrne CONTINUE
tnz $81 ; якщо передостанній прийнятий байт не нульовий
jrne CONTINUE
;======================================
call TESTING ; Під час паузи можна порівняти з оригіналом
;======================================
CONTINUE: ; Продовжити прийом коду
Ld A,$35 ; Взяти останнє прийняте значення напруги
cp A,#160 ; Порівняти його з нормою (?3V),
jrc DEC_SENSOR ; і перейти, якщо цей рівень завищений;
jrne INC_SENSOR ; і перейти, якщо цей рівень занижений;
jp READ_SIGNAL ; інакше прочитати наступний біт даних.
INC_SENSOR: ; Підвищити напругу на C1:
inc $8A ; Підвищити молодшу частину напруги C1,
jrne M_SENS1 ; і задати цю напругу на PA2;
inc $8B ; Збільшити старшу частину напруги C1,
jrne READ_SIGNAL ; і задати цю напругу на PA2.
dec $8B ; Напруга досягла максимального значення,
jp READ_SIGNAL ; прочитати новий біт.
DEC_SENSOR: ; Зменшити напругу на С1:
dec $8A ; Зменшити молодшу частину напруги C1,
jrne M_SENS1 ; і задати цю напругу на PA2.
tnz $8B ; Якщо напруга нульова,
jreq READ_SIGNAL ; то зменшення напруги неможливо.
dec $8B ; Зменшити старшу частину напруги C1
jp READ_SIGNAL ; і прочитати новий біт.
;----------------- Підпрограма для читання значення напруги на ніжці PB0:
READ_PB0:
bset $2e,#6 ; watchdog reset (скинути сторожовий таймер)
LD A,#%01100000 ; Завантажити в A маску настройки АЦП для PB1
LD $34,A ; Записати її в регістр, що дає дозвіл аналогового вводу з ніжки PB0
M2: BTJF $34,#7,M2 ; Переписати біт EOC в CF і перейти на M2, якщо він нульовий.
LD A,$35 ; Зчитати в регістр A отримане значення.
ret
Підсистема порівняння
Для порівняння необхідно вибрати момент, коли закінчилась послідовність імпульсів, тобто, почалася тривала послідовність нулів. Програму порівняння написати самостійно.
;=======================================
TESTING:
Ret