Що може ZX Spectrum. 1.1 вимірювання частоти.
1.1 вимірювання частоти.
Ваш "Сінклер" може стати основою цифрового вимірювального комплексу з досить широкими можливостями. Найбільш просто за допомогою комп'ютера вимірювати частоту електричних сигналів в діапазоні звукових частот. Цей режим в "Сінклер" практично вже реалізовано. При завантаженні програм комп'ютер постійно вимірює частоту надходить від магнітофона сигналу. Тому, якщо рівень вимірюваного сигналу відповідає рівню на лінійному виході магнітофона, то частотомір може бути реалізований чисто програмними засобами, без використання будь-яких апаратних засобів. Приклади таких програм наведені в літературі (1), (2). Вимірювання частоти засноване на підрахунку кількості періодів сигналу за фіксований інтервал часу. Оскільки частота в тактового генератора комп'ютера стабілізована кварцом, то точність завдання вимірювального інтервалу, а отже і вимірювання частоти, буде досить висока. Для зменшення похибки пов'язаної з дискретністю рахунку періодів сигналу вимірювальний інтервал повинен бути можливо більше, але для зручності вимірювань він не повинен бути занадто великим. Наведена програма формує інтервал тривалістю близько 1 секунди. При цьому похибка обумовлена дискретністю рахунку в обраному діапазоні вимірюваних частот 300 Гц – 3 КГц складе 0,003 – 0,0003 відповідно.
Не складно розширити частотний діапазон в бік більш високих частот. Для цього на вході встановлюється дільник частоти, а в програму вводиться додатковий коефіцієнт, що враховує коефіцієнт поділу при відображенні результатів вимірювань. Схемотехніка вхідних дільників може бути різною. Якщо необхідно вимір в діапазоні частот до 10-20 МГц, то вхідний дільник частоти може бути реалізований на мікросхемах ТТЛ серій 155, 555, 1533. При необхідності вимірювання більш високих частот можна зібрати вхідний дільник описаний в (3). Варіанти схем вхідних дільників частоти наведені на рис. 1.1.
На входи дільників повинен подаватися імпульсний сигнал з рівнями ТТЛ. Для узгодження вихідного сигналу дільника частоти і магнітофоном входу комп'ютера необхідно використовувати резистивний дільник з коефіцієнтом ділення близько 20 (2кОм і 100 Ом).
Розглянемо більш детально роботу програми, що забезпечує вимірювання частоти. Алгоритм вимірювання частоти аналогічний алгоритму у програмі (2). Текст програми приведений нижче.
Програма 1.1.
10 CLEAR 65300; DIM A(64)
12 INPUT “FREQUENCY OF QUARTZ =”;Q
13 LET K=Q/14
15 INPUT “1:N”;N
16 LET KD=N
20 FOR I=1 TO 64
30 READ A(l): POKE (65300+l),A(l)
40 NEXT I
50 DATA 243,1,0,0,17,141,55,219
60 DATA 254,203,119,40,10,0,0,0
70 DATA 19,122,183,32,242,24,7,0
80 DATA 19,3,122,183,32,8,33,85
90 DATA 255,112,35,113,251,201,219,254
100 DATA 203,119,40,10,0,0,0,19
110 DATA 122,183,32,211,24,232,0,0
120 DATA 0,19,122,183,32,232,24,222
130 PRINT AT 9,6;”FREQUENCY:”;AT 9,26;”(Hz)”
135 PRINT AT 10,6;”1:N”;KD
140 OUT 254,7: RANDOMIZE USR 65301
150 LET F=256*PEEK 65365+PEEK 65366-1
160 IF F<0 THEN LET F=0
170 PRINT AT 9,16;” “;AT 9,16;INT((F*K*KD)/0.951)
180 GO TO 140
Основу її складає підпрограма в машинних кодах. Ці коди записані в рядках 50-120. Завантаження кодів в пам'ять здійснюється в рядках 10-40, а запуск підпрограми в рядку 140. У результаті роботи підпрограми в машинних кодах в осередках пам'яті з адресами 65365 і 65366 записується значення частоти. У рядку 170 проводиться висновок значення частоти на екран у зручному вигляді. При цьому коефіцієнт До враховує відміну частоти кварцового генератора від номіналу 14,0 МГц, а коефіцієнт KD коефіцієнт ділення вхідного дільника. У рядках 12-16 проводиться введення значень коефіцієнтів у програму. Якщо ці коефіцієнти постійні, то можна видалити рядка 12 і 15, а у рядках 13 і 16 замість Q і N записати постійні коефіцієнти. Коефіцієнт 0.951 коригує значення частоти, що отримується підпрограмою в машинних кодах.
Програма 1.2 являє собою текст підпрограми в машинних кодах. Усі команди в підпрограмі забезпечені докладними коментарями, тому зупинимося лише на загальній схемі роботи підпрограми.
Програма 1.2
Адреса |
Мітка |
Код |
Команда |
Коментар |
|||||
65301 |
243 |
F3 |
di |
Заборона переривань |
|||||
1 |
01 |
Id be 00 00 |
Обнуління регістра НД |
||||||
0 |
00 |
в якому накопичується |
|||||||
0 |
00 |
результат |
|||||||
17 |
11 |
Id de 37 8D |
Завантажити у DE |
||||||
141 |
8D |
14221 в DE задається |
|||||||
55 |
37 |
вимірювальний інтервал |
|||||||
Ml |
219 |
DB |
in a,(FE) |
З порту з адресою |
|||||
254 |
FE |
254 переспати дані в |
|||||||
акумулятор |
|||||||||
65310 |
203 |
CB |
bit 6,a |
Встановити прапор Z в |
|||||
119 |
77 |
відповідно до розрядом |
|||||||
6 акумулятора |
|||||||||
40 |
28 |
jr Z,s |
Перехід на мітку М2 |
||||||
10 |
0A |
(Зсув 10), якщо Z-0 |
|||||||
0 |
00 |
Додаткова затримка |
|||||||
0 |
00 |
||||||||
0 |
00 |
||||||||
19 |
13 |
inc de |
de-de+1 |
||||||
122 |
7A |
ld a,d |
Перевірка обнулення |
||||||
183 |
B7 |
or a |
регістра de і перехід |
||||||
65320 |
32 |
20 |
jr nz,s |
за умовою "не 0" |
|||||
242 |
F2 |
на мітку Ml |
|||||||
24 |
18 |
jr,s |
Перехід на мітку OUT |
||||||
7 |
07 |
||||||||
0 |
00 |
||||||||
M2 |
19 |
13 |
inc de |
de-de+1 |
|||||
3 |
03 |
inc bc |
Ьс-Ьс +1 |
||||||
122 |
7A |
ld a,d |
Перевірка обнулення |
||||||
183 |
B7 |
or a |
регістра de і перехід |
||||||
32 |
20 |
jr nz,s |
за умовою 'не 0 " |
||||||
65330 |
8 |
08 |
на мітку МОЗ |
||||||
OUT |
33 |
21 |
Id hi FF 55 |
Завантаження в hi числа – |
|||||
85 |
55 |
адреси осередку пам'яті |
|||||||
255 |
FF |
в якій буде результат |
|||||||
112 |
70 |
ld(hl),b |
У клітинку 65365 поміщається |
||||||
35 |
23 |
inc hi |
вміст регістру В, а в |
||||||
113 |
71 |
ld(hl),c |
клітинку 65366 вміст З |
||||||
251 |
FB |
ei |
Дозвіл переривань |
||||||
201 |
C9 |
ret |
Повернення в BASIC |
||||||
МОЗ |
219 |
DB |
in a,(FE) |
З порту з адресою |
|||||
65340 |
254 |
FE |
254 переслати дані в |
||||||
акумулятор |
|||||||||
203 |
CB |
bit 6,a |
Встановити прапор 2 в |
||||||
119 |
77 |
відповідно до розрядом |
|||||||
6 акумулятора |
|||||||||
40 |
28 |
jrz,s |
Перехід на мітку М4 |
||||||
10 |
OA |
(Зсув 10), якщо Z-0 |
|||||||
0 |
00 |
Додаткова затримка |
|||||||
0 |
00 |
||||||||
0 |
00 |
||||||||
19 |
13 |
inc de |
de-de+1 |
||||||
122 |
7А |
ld a,d |
Перевірка обнулення |
||||||
65350 |
183 |
В7 |
or a |
регістра de і перехід |
|||||
32 |
20 |
jr nz,s |
за умовою 'не 0 * |
||||||
211 |
D3 |
на мітку Ml |
|||||||
24 |
18 |
jr,s |
Перехід на мітку OUT |
||||||
232 |
Е8 |
||||||||
М4 |
0 |
00 |
Затримка |
||||||
0 |
00 |
||||||||
0 |
00 |
||||||||
19 |
13 |
inc de |
de=de+1 |
||||||
122 |
7А |
ld a,d |
Перевірка обнулення |
||||||
65360 |
183 |
В7 |
or a |
регістра de і перехід |
|||||
32 |
20 |
jr nz,s |
за умовою * не 0 * |
||||||
232 |
Е8 |
на мітку МОЗ |
|||||||
24 |
18 |
jr,s |
Перехід на мітку OUT |
||||||
65364 |
222 |
DE |
|||||||
65365 |
Осередки в які |
||||||||
65366 |
записується результат |
||||||||
роботи підпрограми |
Вступник з магнітофона (а в нашому випадку від джерела сигналу вимірюваної частоти) аналоговий сигнал перетвориться в комп'ютері в імпульсний сигнал і подається на вхід 6 розряду паралельного порту з адресою FEh (254d). Через фіксовані відрізки часу підпрограма перевіряє стан 6 розряду цього порту. Цей процес показано на рис. 1.2. При кожній перевірці на 1 збільшується стан регістра DE і перевіряється його переповнення. Час, за який відбудеться заповнення цього регістра, залежить лише від тактової частоти і, тому, незмінно. Цей час є вимірювальним інтервалом. Якщо при перевірці стану 6 розряду порту буде виявлено зміна його стану з "1" в "0", то на 1 збільшується вміст регістру НД Число, яке буде накопичено в регістрі ЗС за вимірювальний інтервал часу, буде пропорційно частоті вхідного сигналу. Результат роботи підпрограми заноситься в комірки пам'яті, через які здійснюється зв'язок з основною програмою на Бейсік.
Для точної роботи програми – частотоміра необхідно правильно вказати частоту кварцового генератора, що задає. Якщо вона точно не відома, та й просто для перевірки, можна провести калібрування.
По всій видимості, зразковий частотомір недоступний для читачів книги, але не варто впадати у відчай. Автор комп'ютера сер К. Сінклер забезпечив його багатьма корисними здібностями, в тому числі і реалізованими в операційній системі годинами реального часу. Оскільки еталоном для цього годинника є внутрішній кварцовий генератор комп'ютера, то точність їх ходу залежить від відхилення частоти кварцового генератора від номіналу 14.0 КГц. Програма 1.3 реалізує електронний секундомір.
Програма 1.3.
10 Роке 23674,0
20 Роке 23673,0
30 Роке 23672,0
40 LET Т = INT ((65536 "рейок 23 674 +256 * рейок 23 673 + рейок 23 672) / 50)
50 PRINT T
Програма показує на екрані скільки секунд пройшло після її запуску. Звичайні електронні годинники мають точність ходу не гірше 1 секунди в добу, тому їх цілком можна прийняти за еталон. Для отримання точності калібрування 1 / 1000 необхідно по електронному годиннику відміряти 1000 секунд (16 хвилин 40 секунд) і зафіксувати число N на екрані телевізора. Частота кварцового генератора становитиме: F = N * 0.014 Цю частоту і потрібно вводити в програмі 1.1 у відповідь на запит FREQUENCY OF QUARTZ =.
У перевіреному комп'ютері результат вимірювання склав N = 1002, тому частота F = 14.028 МГц.
Для подальшого підвищення точності необхідно збільшити інтервал часу, протягом якого виконується вимірювання частоти (у програмі 1.1 ця тривалість задана близько 1 секунди). Можна змінити в цій програмі підпрограму в машинних кодах, але, по всій видимості, простіше організувати багаторазові вимірювання та усереднення частоти в програмі на Бейсік. При цьому вимірювальні інтервали виявляються відокремлені один від одного деякими проміжками часу, однак, при вимірюванні незмінюваною частоти, точність вимірювань від цього не зменшується. У програму 1.1 достатньо внести наступні зміни:
Програма 1.4.
140 FOR Z = 1 ТО 1910
145 OUT 254,7: RANDOMIZE USR 65301
150 LET F=F+256″PEEK 65365+PEEK 65366-1
155 NEXT Z
160 IFF<0 THEN LET F=0
170 PRINT AT 9,16;” “AT 9,16;INT((F*K*KD)/9.51)
180 GO TO 140
У програмі 1.4 проводиться усереднення по десяти вимірами частоти. Цикл організується в рядках 140 – 155. У рядку 150 відбувається підсумовування результату кожного вимірювання, а при виведенні результату на екран сума ділиться на кількість вимірів (в даному випадку для цього замість коефіцієнта 0.951 використовується 9.51) У випадку необхідності можна використовувати і інша кількість вимірювань.
Ваш відгук