Распечатка 4. Измерение разности фаз

; Указание адресов ОЗУ для хранения значений сбора данных

CAPTURE_0 DATA 30H

CAPTURE_1 DATA 32H

PHASE DATA 34H

FLAG_0 BIT 20H.0

FLAG_1 BIT 20H.1

;

ORG 0000H

JMP PCA_INIT

ORG 0033H

JMP PCA_INTERRUPT

;

PCA_INIT:

; Инициализация для РСА таймера и прерывания такая же

; как в Распечатке 1. Инициализация двух РСА модулей следующая:

;

MOV CCAPM0, #21H ; Модуль 0 для захвата передних фронтов

MOV CCAPM1, #21H ; Аналогично модуль 1

;

;*******************************************************************************

; Отсюда начинается главная программа

;*******************************************************************************

; Этот фрагмент предполагает использование только модуля 0 и модуля 1.

PCA INTERRUPT:

JB CCF0, MODULE_0 ; Определяем, событие какого

JB CCF1, MODULE_1 ; модуля вызывает прерывание

;

MODULE_0:

CLR CCF0 ; Очищаем флаг событий модуля

MOV CAPTURE_0, CCAP0L ; Сохраняем 16-битное значение захвата

MOV CAPTURE_0+1, CCAP0H

JB FLAG_1, CALCULATE_PHASE ; Если захват завершен в

; модуле 1, приступаем к вычислению

SETB FLAG_ 0 ; Отмечаем захват в модуле 0

RETI

MODULE_1:

CLR CCF1 ; Очищаем флаг событий модуля 1

MOV CAPTURE_1, CCAP1L

MOV CAPTURE_1+1, CCAP1H

JB FLAG_0, CALCULATE_PHASE ; Если захват завершен в

; модуле 0, переходим к вычислению

SETB FLAG_1 ; Отмечаем завершение захвата в модуле 1

RETI

;

CALCULATE_PHASE:

PUSH ACC ; Это вычисление не может быть

PUSH PSW ; завершено в подпрограмме

CLR C ; обслуживания прерываний

;

JB FLAG_0, MOD0_ LEADING

JB FLAG_1, MOD1_LEADING

;

MOD0_LEADING:

MOV A, CAPTURE_1

SUBB A, CAPTURE_0

MOV PHASE, A

MOV A, CAPTURE_1+1

SUBB A, CAPTURE_0+1

MOV PHASE+1, A

CLR FLAG_0

JMP EXIT

;

MOD1_LEADING:

MOV A, CAPTURE_0

SUBB A, CAPTURE_1

MOV PHASE, A

MOV A, CAPTURE_0+1

SUBB A, CAPTURE_1+1

MOV PHASE+1, A

CLR FLAG_1

EXIT:

POP PSW

POP ACC

RETI

Для выше приведенной программы измерения разности фаз между входными сигналами самостоятельно составить блок-схему алгоритма.

Режим программируемого таймера и быстрого вывода (COMPARE MODE)

Задание 2а. ПРОГРАМНЫЙ ТАЙМЕР

Программный таймер используется для вызова подпрограмм прерывания, которые должны произойти в интервале периода.

Пользователь загружает 16-битное значение в регистры сравнения в модуле. Когда происходит соответствие между этим сравниваемым значением и РСА таймером, устанавливается флаг события и генерируется прерывание, если оно было разрешено.

Если необходимо, новое 16-битное сравниваемое значение может быть загружено в CCAP0H, CCAP0L в течение подпрограммы прерывания. Пользователь должен знать, что функционирование компаратора аппаратно отключается, пока значение данных регистров изменяется, так что недопустимое соответствие произойти не должно.

Таким образом, запись в младший байт CCAP0L запрещает действие компаратора, в то время как запись в старший байт CCAP0H снова разрешает сравнение.

Пользователь также может захотеть удерживать появление прерываний, пока меняются значения данных регистров.

Это можно легко сделать, сбросив ЕА бит.

Пример программной генерация прерывания через каждые 20 мс.

; Частота = 12 МГц

; РCA тактовый вход = 1/12 х Fosc -> 1 микросекунда

;

; Вычисление времени перезагрузки для регистров сравнения:

; 20 мс

; ------------- = 20,000 тактов

; 1 мкс/такт

;

ORG 0000H

JMP PCA_INIT

ORG 0033H

JMP PCA_INTERRUPT

;

PCA_INIT:

; Инициализация РСА таймера такая же, как в Распечатке 1

;

MOV CCAPM0, #49H ; Модуль 0 в режиме

программного таймера

MOV CCAP0L, #LOW(20000) ; Сначала запись в младший байт

MOV CCAP0H, #HIGH(20000)

;

SETB EC ; РСА прерывание разрешено

SETB EA

SETB CR ; Включить РСА таймер

;

; ***************************************************************************

; Отсюда идет главная программа

; ***************************************************************************

;

PCA_INTERRUPT:

CLR CCF0 ; Очищаем флаг событий модуля 0

PUSH ACC

PUSH PSW

CLR EA ; Удерживаем прерывания

MOV A, #LOW(20000) ; 16-битное сложение

ADD A, CCAP0L ; Следующее совпадение будет

MOV CCAP0L, A ; происходить через 20000 тактов

MOV A, #HIGH(20000)

ADDC A, CCAP0H

MOV CCAP0H, A

SETB EA

; .

; .

; Продолжение подпрограмм

; .

; .

POP PSW

POP ACC

RETI

Задание 2b. Режим высокоскорост­ного вывода (HSO - High Speed Output) переключает штырек порта, когда происходит соот­ветствие между РСА таймером и значением, которое было за­гружено в регистры сравнения.

Самостоятельно организовать высокоскоростной вывод (без прерывания), обеспечивающий генерацию периодического сигнала с помощью РСА с максимальной тактовой частотой (30.5 Гц) при частоте квантования 16 МГц.

Задание 3. Измерение ширины импульсов в таймерах 0 и 1

l В таймерах 0 и 1 установка GATEх и TRx позволяет включать и выключать таймер внешним сигналом на входе INTx#.

Такая настройка удобна для измерения ширины положительного импульса, присутствующего на выводе INTx#.

l Для таймера 1 в режиме 1 - это можно выполнить таким образом:

1. Запрограммируйте старшие 4 бита регистра TMOD так:

- режим 1 для таймера 1;

- С/Т1# = 0 для выбора частоты FOSC/12 в качестве счетного входа таймера;

- GATE1 = 1 для выбора INT1 в качестве бита управления запуском таймера.

2. Загрузите нулевое начальное значение в 16-битовый регистр таймера TН1/ТL1 или прочитать и сохранить текущее значение регистра.

3. Установите бит TR1 в регистре ТCON, чтобы разрешить INТ1

4. Подайте импульс, который нужно измерить, на вывод INT1. Таймер срабатывает, когда сигнал высокий.

5. Сбросьте бит TR1, чтобы запретить подачу следующего импульса на вывод INT1.

6. Для получения нового значения прочтите регистр таймера TH1/TL1.

7. Вычислите и сохраните ширину импульса, равную

12TOSCx (новое значение - начальное значение)

8. Пример: FOSC = 16МГц и 12Тosc =750 нc.

Если новое значение TH1=0 TL1 = 0000 1010 b , а начальное значение = 0, то ширина импульса = 750 нс х 10,000 = 7,5 микросекунд.

(Приготовить фрагмент программы на ассемблере)

Наши рекомендации