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

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

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) У випадку необхідності можна використовувати і інша кількість вимірювань.