Смекни!
smekni.com

Система ПЭВМ IBM PCAT автоматический фазометр (стр. 3 из 4)

Fase:

Inc

DPTR

NOP

NOP

NOP

NOP

NOP

reti

Эта подпрограмма выполняется 10 мкс. Увеличение времени выполнения этой подпрограммы вызвано тем, что сигнал фазы может иметь максимальную длительность равную периоду сигнала (а не половине как при измерение частоты), что может привести к переполнению регистра DPTR в случае если подпрограмма занимает 5 мкс. Поэтому время выполнения этой подпрограммы увеличено вдвое.

Рассмотрим алгоритм нахождения константы пересчета для загрузки в генератор.

Если частота сигнала больше 15 кГц (N<7), то в 9-разрядный регистр MUX генератора, с помощью которого определяется режим работы программного делителя частоты, загружается число 000110010В. При занесении в регистр MUX данного числа частота генератора будет равна 60 МГц.

Если частота сигнала меньше 15 кГц (N>6), то в 9-разрядный регистр MUX генератора, с помощью которого определяется режим работы программного делителя частоты, загружается число 000110100В. При занесении в регистр MUX данного числа частота генератора будет равна (60/(ND+2)) МГц, где ND – число загружаемое в 9-разрядный регистр-делитель. Так как необходимо получать частоту генератора равную

, и исходя из справочной документации частота генератора имеет зависимость от константы пересчета :

то имеем систему исходя из которой найдем зависимость ND(N):

(1)

С учетом того, что вычисление по формуле (1) константы ND будет выполняться с погрешностью, то следует увеличить ее значение на 1, для того чтобы частота генератора гарантированно была меньше числа

, и не произошло переполнения счетчика. Тогда
(2). Посчитаем при каком N в формуле (2) ND будет неотрицательным
. То есть фактически формулу (2) для пересчета можно применять для частот при которых N>6. Так как максимальное значение программного делителя составляет 513 (29+2), то минимальная частота генератора при которой применим этот алгоритм деления частоты составляет

кГц.

При этом из формулы (2)

а частота сигнала равна

Гц.

Для получения более низкой частоты нужно изменить значение регистра MUX генератора на такое значение 000111000В. Тогда частота на выходе генератора будет меньше чем частота резонатора генератора (60 МГц) в 2·(ND+2) раза. Тогда уравнение, из которого вычисляется константа ND, изменится, и будет иметь вид:

Поэтому значение ND согласно формуле (2) нужно поделить на 2 и добавить 1. Тогда

(3)

При этом константа ND, вычисленная по формуле (3) программируется в генератор при частоте сигнала в диапазоне

Гц, что соответствует значению N=3496..6977=0DA8h..1B41h.

При частотах сигнала в диапазоне fc=7.5..14.3 Гц в регистр MUX генератора программируется следующее значение 000110000В. Тогда частота на выходе генератора будет меньше чем частота резонатора генератора (60 МГц) в 4·(ND+2) раза. Поэтому значение ND согласно формуле (2) нужно поделить на 4 и добавить 1. Тогда

что соответствует значению N=6978..13954=1B42h..3682h.

Рассчитаем, какое число нужно загрузить в регистр TH1 для настройки последовательного интерфейса на скорость 4800 бод/с. Частота передачи данных рассчитывается по формуле:

Из этой формулы находим константу которую нужно загрузить в TH1.

Так как число 243 округлялось найдем фактическую скорость передачи данных.

бод/с

Погрешность составляет 0.15%. Такая погрешность скорости не вызывает ошибок при передаче данных.

Описание алгоритма программы для МК

Микроконтроллер должен осуществлять такие действия:

1) начальную настройку своих узлов и периферийных устройств;

2) прием параметров измерения фазы от компьютера;

3) измерение частоты сигнала;

4) выбор режима измерения фазы;

5) выдача информации о частоте и фазе компьютеру.

Соответственно этому МК будет работать по алгоритму указанному на рис.5.


Рис.5. Блок-схема алгоритма программы для МК

Программа для МК

BSEG

ORG 0h

Cell_Tr: DBIT 1

DSEG

ORG 30h

Fr_low: DS 1

Fr_high: DS 1

Fase_low: DS 1

Fase_high: DS 1

Contr_sum: DS 1

CSEG

ORG 0h

Jmp On_Reset:

ORG 3h

Jmp Freq

ORG 0Bh

Reti

ORG 13h

Jmp Fase

ORG 1Bh

Reti

ORG 23h

Reti

ORG 40h

On_Reset :

MovIE, #0 ; запрет всех прерываний

MovSp, #40h ; установка вершины стека

MovIP, #0 ; все приоритеты прерываний одинаковы

MovTCON,#0 ; внешние прерывания вызываются по низкому уровню

; на входах INT0,INT1

MovTMOD,#00100000B ; таймер/счетчик Т1 работает в режиме 8-битного с

; таймера c автоперезагрузкой

MovSCON,#11001100B ; 8-битовый приемопередатчик + бит паритета

MovPCON,#10000000B ; удвоенная скорость передачи данных (SMOD=1)

MovA, #243 ; настройка скорости последовательного интерфейса

MovTH1, A ; 4800 бод/с

SetbTR1 ; запуск таймера T1

MovDPTR, #0 ;

MovIE, #10000001B ; разрешение прерываний от INT0 измерение частоты

MovR0, #100 ; проверка правильности работы фазометра

Next_wait: ; при разрешенном прерывании

AcallDel_10 ; каждые 10 мс проверяется содержимое DPL

Mov A, R0 ;

Mov R1, A ;

Fr_beat:

NOP

DjnzR1, Fr_beat ; этот участок кода нужен для обнаружения частот

MovA, DPL ; с периодом кратным 10 мс

JnzWork ; если в DPL не ноль то фазометр работает нормально

DjnzR0, Next_wait ; иначе снова проверять

ClrEA ; запрет прерываний

ClrCell_tr ; сбросить флаг работоспособности

RjmpSend_error

Work:

SetbCell_tr ; установить флаг работоспособности

Send_error:

Acall Get_COM ; ждатьсообщенияотПК

Mov Acc.0, Cell_tr

AcallTransmit_COM ; послать сообщение ПК о работоспособности

JbCell_tr, To_do ; если фазометр работает, то продолжать работу

Ret ; иначе конец программы

To_do:

AcallGet_COM ; получить количество измерений

MovR1, A

AcallGet_COM ; получить период измерений

Mov R5, A

Clr A

Mov Contr_sum, A ; обнуляемконтрольнуюсумму

Next_measure:

Mov DPTR, #0 ; померятьчастоту

MovIE, #10000001B ; разрешение прерываний от INT0 измерение частоты

JnbIE0, $

JbIE0, $

ClrEA

Mov A, DPH

Acall Transmit_COM ; передачаПК

MovFr_high, A ; сохранить старший байт

Mov A, DPL

Acall Transmit_COM ; передачаПК

MovFr_low, A ; сохранить младший байт

Mov A, Fr_high

Subb A, #36h

Jnc Meas_MK ; если DPH > 36h, тофазумеряет MK

Mov A, Fr_high

Subb A, #1Bh ; если DPH > 1Bh, тофазумеряеттаймерс

JncMeas_T4 ; предделением частоты на 4

MovA, Fr_high

SubbA, #0Dh ; если DPH > Dh, то фазу меряет таймер с предделением

JncMeas_T2 ; частоты на 2

MovA, Fr_low

SubbA, #06h ; если DPL > 6, то фазу меряет таймер без предделения

JncMeas_T ; частоты, иначе таймер работает на

; максимальной частоте 60 МГц

AcallFirst_reset ; начальный сброс генератора

MovA, #1 ; код команды записи в регистр DIV

AcallWrite_Byte ; запись в генератор

MovA, #00110010В ; загрузка 8 бит константы для задания частоты

; генератора

AcallWrite_Byte ; запись в генератор

Acall Write_0 ; 9-ыйбит

Ajmp Meas_G

Meas_T:

Mov R2, Fr_low ; вычисление

Mov R3, Fr_high

Mov R1, #4

Acall Dividing

Mov A, R2

Mov B, #75

MUL AB

Mov R2, A

Mov A, B

Mov R3, A

Mov R1, #5

Acall Dividing

Dec R2

Mov A, R3

Jnc Meas_G

Dec A

Mov R3, A

Acall First_reset ; начальныйсброс

MovA, #1 ; код команды записи в регистр DIV

AcallWrite_Byte ; запись в генератор

MovA, #00110100В ; загрузка 8 бит константы для задания частоты

; генератора

AcallWrite_Byte ; запись в генератор

Acall Write_0 ; 9-ыйбит

Ljmp Meas_G

Meas_T2:

Mov R2, Fr_low ; вычисление

Mov R3, Fr_high

Mov R1, #5

Acall Dividing

Mov A, R2

Mov B, #75

MUL AB

Mov R2, A

Mov A, B

Mov R3, A

Mov R1, #5

Acall Dividing

AcallFirst_reset ; начальный сброс

MovA, #1 ; код команды записи в регистр DIV

AcallWrite_Byte ; запись в генератор

MovA, #00111000В ; загрузка 8 бит константы для задания частоты

; генератора

AcallWrite_Byte ; запись в генератор

Acall Write_0 ; 9-ыйбит

Ljmp Meas_G

Meas_T4:

Mov R2, Fr_low ; вычисление

Mov R3, Fr_high

Mov R1, #6

Acall Dividing

Mov A, R2

Mov B, #75

MUL AB

Mov R2, A

Mov A, B

Mov R3, A

Mov R1, #5

Acall Dividing

AcallFirst_reset ; начальный сброс

MovA, #1 ; код команды записи в регистр DIV

AcallWrite_Byte ; запись в генератор

MovA, #00110000В ; загрузка 8 бит константы для задания частоты

; генератора

AcallWrite_Byte ; запись в генератор

Acall Write_0 ; 9-ыйбит

Meas_G:

MovA, #2 ; код команды записи в программный делитель

AcallWrite_Byte ; запись в генератор

MovA, R2 ; младшие 8 бит предделителя

AcallWrite_Byte ; запись в генератор

Mov A, R3 ; старшийбит

Jb Acc.0, Wr1

AcallWrite_0 ; запись в генератор 0

LjmpSt_m

Wr_1:

AcallWrite_1 ; запись в генератор 1

St_m:

AcallFirst_reset ; начало работы генератора после программирования

ClrP0.1 ; сброс счетчиков

JnbIE1, $ ; ждем пока не возникнет прерывания от изм. фазы

SetbP0.1 ; разрешение счета счетчиков

JbIE1, $ ; ждем пока не завершиться прерывания от изм. фазы