В нашому випадку керуюче слово: 1000 0011 (83Н)
4. Розробка алгоритму та програми. Алгоритм роботи програми можна побудувати за двома майже протилежними принципами вимірювання:
1. Занесення даних, отриманих з АЦП до комірок ОЗП. Після проведення N вимірів проводять математичну обробку даних.
2. Порівняння даних, отриманих з АЦП з ”еталонними” та занесення до комірок ОЗП тільки ті дані, які пройшли ”відбір”. Після проведення N вимірів проводять математичну обробку даних.
Модулююча частота, як правило набагато перевищує частоту корисного (модулюючого) сигналу і при послідовному занесенні всіх вимірів до ОЗП для находження хоча б двох точок максимума та мінімума сигналу потрібне ОЗП порядку 1-10 кБ. Наприклад: частота несучої 100 кГц, частота модулюючого сигналу 1 кГц, тоді для знаходження одного максимума та мінімума сигналу потрібно 100/1=100 комірок ОЗП, які мають таку ж розрядність, що й АЦП, або більшу. Якщо розрядність АЦП 10 біт, то буде використовуватись 2 байти ОЗП на кожний вимір. Для задовільної точності математичної обробки потрібно декілька десятків вимірів максимума та мінімума сигналу, наприклад 50. Ітого: 100/1*2*50=10000 байт ОЗП. Якщо проводити порівняння кожного вимру з АЦП з попередньо отриманими значеннями максимума та мінімума сигналу, то буде використовуватися лише 4 байти ОЗП
Оскільки в даному методі нас цікавлять тільки два значення сигналу: максимальне та мінімальне, а також враховуючи те, що заданий об’єм ОЗП всього 2 кБайти, то побудову алгоритму роботи програми будемо проводити за другим варіантом.
На початку треба проініціалізувати порти вводу/виводу та індикатор, а також становити “еталонні” значення максимума та мінімума сигналу. Після проведення N вимірів, запускається математична обробка данних, результатом якої є значення коефіцієнта модуляції сигналу. Для виводу його на індикатор необхідно попередньо це значення розділити на декади.
Рис. 4. Блок-схема алгоритму.
Розробка програми проводиться за блок-схемою алгоритму та функціональною електричною схемою.
Визначимо розташування даних в ОЗП (Табл. 3.). Так, як АЦП має 10 розрядів даних, то числа, що вводяться з нього будуть двобайтними.
Табл. 3.
Адреса |
Зміст комірки ОЗП |
2000H |
Старший байт Umax |
2001H |
Молодший байт Umax |
2002H |
Старший байт Umin |
2003H |
Молодший байт Umin |
2004H |
Молодший байт (Umax – Umin) |
2005H |
Старший байт (Umax – Umin) |
2006H |
Молодший байт (Umax + Umin) |
2007H |
Старший байт (Umax + Umin) |
2008H |
Значення коефіцієнта модуляції |
Оскільки даний процесор не має власних команд ділення та множення чисел, то для реалізації ділення двох чисел написані дві підпрограми для ділення одно- та двобайтних чисел. Для спрощення алгоритму ділення, об’єму та складності підпрограм, а також зменшення часу роботи підпрограм ділення виконується націло, тобто залишок після операції ділення просто відкидується, що спричиняє додаткову похибку вимірювання, яка становить від 0 до +1% коефіцієнта модуляції.
Лістинг програми.
MOV A, 83H ;Занесення до акумулятору керуючого слова
OUT 03H ;Запис керуючого слова до порту
MOV A, 70H ;Керуюче слово для обнуління індикатора
OUT 00H ;Обнуління всіх розрядів індикатора
Start: MOV E, FF ;Лічильник вимірів
Wait: LXI H, 2000H ;Завантаження в HL початкової адреси ОЗП
IN 02H ;Ввід даних з порту С
ANI 04H ;Виділення сигналу готовності АЦП
JNZ Wait ;Перехід, якщо немає готовності
OUT O2H ;Активізація виходу АЦП
IN 01H ;Ввести молодший байт з порту В
MOV C, A ;Зберегти у регістрі С
IN 02H ;Ввести старший байт з порту С
ANI 03H ;Виділення двох старших біт даних
MOV B, A ;Зберегти у регістрі В
MOV D, M ;Занесення до регістру D старшого байта Umax
CMP D ;Порівняння з даними з АЦП
INX H ;HL ß 2001H
JC Lo ;Якщо менше, перехід до порівняння з Umin
MOV A, M ;Занесення до регістру А молодшого байта Umax
CMP C ;Порівняння з даними з АЦП
JC Write ;Якщо менше, перехід до порівняння з Umin
Lo: INX H ;HL ß 2002H
MOV A, M ;Занесення до регістру А старшого байта Umin
CMP B ;Порівняння з даними з АЦП
JC Exit ;Якщо більше, перехід до наступного циклу
INX H ;HL ß 2003H
MOV A, C ;Занесення до регістру А молодшого байта з АЦП
MOV D, M ;Занесення до регістру D молодшого байта Umin
CMP D ; Порівняння з даними з АЦП
JNC Exit ; Якщо більше, перехід до наступного циклу
Write: MOV M, C ;Зберігання у ОЗП молодшого байта
DCX H ;HL ß 2002H/2000H
MOV M, B ;Зберігання у ОЗП старшого байта
Exit: DCR E ;Декримент лічильника кількості вимірів
JNZ Wait ;Якщо не 0, то повторити вимірювання
LXI H, 2000H ;Завантаження в HL початкової адреси ОЗП
MOV B, M ;Занесення до регістру B старшого байта Umax
INX H ;HL ß 2001H
MOV C, M ;Занесення до регістру C молодшого байта Umax
INX H ;HL ß 2002H
MOV D, M ;Занесення до регістру D старшого байта Umin
INX H ;HL ß 2003H
MOV E, M ;Занесення до регістру E молодшого байта Umin
INX H ;HL ß 2004H
MOV A, С ;Занесення до регістру А молодшого байта Umax
SUB E ;UmaxLO - UminLO
MOV M, A ;Зберігання результату в ОЗП
INX H ;HL ß 2005H
MOV A, B ;Занесення до регістру А старшого байта Umax
SBB D ;UmaxLO - UminLO
MOV M, A ;Зберігання результату в ОЗП
INX H ;HL ß 2006H
MOV A, C ;Занесення до регістру А молодшого байта Umax
ADD E ;UmaxHI + UminHI
MOV M, A ;Зберігання результату в ОЗП
INX H ;HL ß 2007H
MOV A, B ;Занесення до регістру А старшого байта Umax
ADC D ;UmaxHI + UminHI
MOV M, A ;Зберігання результату в ОЗП
LXI H, 2004H ;HL ß 2004H
MOV E, FFH ;Ініціалізація лічильника
MOV A, M ;A ß (UmaxLO - UminLO)
INX H ;HL ß 2005H