Распечатка 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 микросекунд.
(Приготовить фрагмент программы на ассемблере)