Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
П_ ЗАНЯТИЕ 2 StudKI-08-2.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
661.5 Кб
Скачать

15

Практическое занятие № 2. Тема: "Расширение функциональных возможностей микроконт­роллеров семейства mcs-51 за счет модуля рса (матрица программируе­мых счетчиков) в мк i8хС51fx".

Задание 1. Использование модуля PCA в режиме сбора(захвата) данных для измерения ширины импульса, периода и частот сигналов, рабочих циклов, разности фаз.

Примеры реализации заданий приведены в директории РСА [файл 51fx.doc] раздела электронной справочной информации.

Задание 2. Работа РСА в режиме сравнения для программной ге­нерации прерываний, высокоскоростного вывода без прерываний и с прерываниями, отдельными импульсами.

Примеры реализации заданий приведены в директории РСА [файл 51fx.doc] раздела электронной справочной информации.

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

Регистры специальных функций, используемые для управления РСА.

Cmod: Регистр режима счетчика

Ccon (Counter Control Register): Управляющий регистр счетчика

CCAPMn (Compare/Capture Mode Register): Регистр режима сравнения/захвата

IE (Interrupt Enable Register): Регистр разрешения прерываний

Адрес - 0A8h Значение cброса - 0000 0000b

Бит адресуемый

Ip(Interrupt Priority Register): Регистр приоритета прерываний Адрес - 0b8h Значение cброса - x000 0000b Бит адресуемый

Пара регистров CH/CL (с прямыми адресами F9h и E9h) функционирует как 16-битовый таймер-счетчик.

Каждый модуль также имеет пару 8-разрядных регистров сравнения/захвата (CCAPnH, CCAPnL) связанных с ним. Эти регистры используются, чтобы сохранить время, когда событие сбора данных произошло или когда событие сравнения должно произойти.

Programmable Counter Array

Режим сбора данных (захвата -Capture Mode).

Задание 1а. Измерение ширины импульса

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

Однако, если это не известно, пользователь может выбирать, какой фронт вызовет первый сбор данных, выбирая соответствующий режим для модуля.

Момент (Capture2) - Момент (Capture 1) = Ширина импульса

Рисунок 4. Измерение ширины импульса

·

Распечатка 1 показывает пример измерения ширин импульса. (Принимается, что входящий сигнал соответствует тому, что на рисунке 4.)

В подпрограмме прерывания первый набор значений сбора данных сохраняется в ОЗУ.

После второго сбора данных подпрограмма вычитания вычисляет ширину импульса числом изменений состояния PCA таймера.

Обратите внимание на то, что в этом примере принято, что две события сбора данных произойдут за 216 тактов PCA таймера, то есть прокрутки PCA таймера не предусмотрены.

Распечатка 1. Измерение ширины импульса

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

CAPTURE DATA 30H

PULSE_WIDTH DATA 32H

FLAG BIT 20H.0

;

ORG 0000H

JMP PCA_INIT

ORG 0033H

JMP PCA_INTERRUPT

;

PCA_INIT: ; Инициализация РСА таймера

MOV CMOD, #00H ; Ввод в таймер = 1/12 X Fosc

MOV CH, #00H

MOV CL, #00H

;

; Инициализация модуля 0 в режиме сбора данных

MOV CCAPM0, #21H ; Захват переднего фронта

; для измерения длины импульса

;

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

SETB EA

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

CLR FLAG ; очищая тестовый флаг

;

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

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

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

; Этот пример предполагает, что только модуль 0 используется

; как РСА модуль. Если используются другие модули, программа должна

; проверять, событием какого модуля вызвано прерывание

;

PCA_INTERRUPT:

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

JB FLAG, SECOND_CAPTURE ; Проверить, первый это захват

; или второй

FIRST_CAPTURE:

MOV CAPTURE, CCAP0L ; Сохранить 16-битное значение

MOV CAPTURE+1, CCAP0H ; захвата в ОП

MOV CCAPM0, #11H ; Изменить модуль для

; захвата заднего фронта

SETB FLAG ; Первый сбор данных завершен

RETI ;

SECOND CAPTURE:

PUSH ACC

PUSH PSW

CLR C

MOV A, CCAP0L ; 16-битное вычитание

SUBB A, CAPTURE

MOV PULSE_WIDTH, A ; 16-битный результат

сохраняется

MOV A, CCAP0H ; в двух 8-битных ячейках памяти

SUBB A, CAPTURE+1

MOV PULSE WIDTH+1, A ;

MOV CCAPM0, #21H ; Дополнение, если пользователь

CLR FLAG ; хочет измерить длину

следующего ;импульса

POP PSW

POP ACC

RETI

Задание 1b. Измерение периодов

Измерение периода сигнала с PCA похоже на измерение ширины импульса.

Момент (Capture 2) - Момент (Capture 1) = Период

Рисунок 5. Измерение периода

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

CAPTURE DATA 30H

PERIOD DATA 32H

FLAG BIT 20H.0

;

ORG 0000H

JMP PCA_INIT

;

ORG 0033H

JMP PCA_INTERRUPT

;

; Инициализация РСА таймера

PCA_INIT:

MOV CMOD, #00H ; Ввод в таймер = 1/12 х Fosc

MOV CH, #00H

MOV CL, #00

;

; Инициализация модуля 0 в режиме захвата

MOV CCAPMO, #21H ; Захват передних фронтов на Р1.3

MOV CCAPOH, #00

MOV CCAPOL, #00

;

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

SETB EA

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

CLR FLAG ; Очищение тестового флага

;

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

; Только тестовая программа

;

WAIT: JMP $ ; Ожидание РСА прерывания

JMP WAIT

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

;

; Эта часть использование только модуля 0. Если используются другие модули,

; программа должна проверять, флаг какого модуля вызвал прерывание

;

PCA_INTERRUPT:

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

JB FLAG, SECOND_CAPTURE

;

FIRST_CAPTURE:

MOV CAPTURE, CCAP0L

MOV CAPTURE+1, CCAP0H

SETB FLAG ; Выражаем завершение первого сбора данных

RETI

;

SECOND_CAPTURE:

PUSH ACC

PUSH PSW

CLR C

MOV A, CCAP0L ; 16-битное вычитание

SUBB A, CAPTURE

MOV PERIOD, A

MOV A, CCAP0H

SUBB A, CAPTURE+1

MOV PERIOD+1, A

;

CLR FLAG

POP PSW

POP ACC

RETI

;

END

Задание 1с. Измерение частот

Измерение частоты с PCA режимом захвата данных включает вычисление времени выборки для известного количества выборок. На рис.6 время между первым захватом и N-тым захватом является временем выборки Т.

Момент (Capture N) - Момент (Capture 1) = T

Частота = N / T = Количество выборок / Время выборки

Рисунок 6. Измерение частоты


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

CAPTURE DATA 30H

PERIOD DATA 32H

SAMPLE_COUNT DATA 34H

FLAG BIT 20H.0

;

ORG 0000H

JMP PCA_INIT

ORG 0033H

JMP PCA_INTERRUPT

;

PCA_INIT:

; Инициализация РСА таймера, модуля 0 и прерывания

; точно так же, как в Распечатке 1. Также нужно инициализировать

; счет количества выборок

;

MOV SAMPLE_COUNT, #10D ; N = 10 для этого примера

;

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

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

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

;

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

PCA_INTERRUPT:

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

JB FLAG, NEXT_CAPTURE

;

FIRST_CAPTURE:

MOV CAPTURE, CCAP0L

MOV CAPTURE+1, CCAP0H

SETB FLAG ; Выражаем завершение первого сбора данных

RETI

;

NEXT_CAPTURE:

DJNZ SAMPLE_COUNT, EXIT

PUSH ACC

PUSH PSW

CLR C

MOV A, CCAP0L ; 16-битное вычитание

SUBB A, CAPTURE

MOV PERIOD, A

MOV A, CCAP0H

SUBB A, CAPTURE+1

MOV PERIOD+1, A

;

MOV SAMPLE_COUNT, #10D ; Перезагрузка для следующего периода

CLR FLAG

POP PSW

POP ACC

EXIT:

RETI

;

END

Задание 1d. Измерение рабочих циклов

При измерении рабочего цикла входящего сигнала должны фиксироваться оба фронта - передний и задний. Тогда рабочий цикл должен вычисляться, базируясь на трех измеренных значениях, как показано на рис.7.

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

CAPTURE DATA 30H

PULSE_WIDTH DATA 32H

PERIOD DATA 34H

FLAG_1 BIT 20H.0

FLAG_2 BIT 20H.1

;

ORG 0000H

JMP PCA_INIT

ORG 0033H

JMP PCA_INTERRUPT

;

PCA_INIT:

; Инициализация РСА таймера, модуля 0 и прерывания

; точно так же, как в Распечатке 1. Сначала захват переднего

; фронта, а затем остальные.

;

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

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

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

;

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

PCA_INTERRUPT:

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

JB FLAG_1, SECOND_CAPTURE

;

FIRST_CAPTURE:

MOV CAPTURE, CCAP0L

MOV CAPTURE+1, CCAP0H

SETB FLAG_1 ; Выражаем завершение первого сбора данных

MOV CCAPM0, #31H ; Теперь захват остальных фронтов

RETI

;

SECOND_CAPTURE:

PUSH ACC

PUSH PSW

JB FLAG_2, THIRD_CAPTURE

CLR C ; Вычисляем ширину импульса

MOV A, CCAP0L ; 16-битное вычитание

SUBB A, CAPTURE

MOV PULSE_WIDTH, A

MOV A, CCAP0H

SUBB A, CAPTURE+1

MOV PULSE_WIDTH+1, A

SETB FLAG_2 ; Отмечаем завершение второго сбора данных

POP PSW

POP ACC

RETI

;

THIRD_CAPTURE:

CLR C ; Вычисляем период

MOV A, CCAP0L ; 16-битное вычитание

SUBB A, CAPTURE

MOV PERIOD, A

MOV A, CCAP0H

SUBB A, CAPTURE+1

MOV PERIOD+1, A

MOV CCAPM0, #21H ; Дополнительно - перестраиваем модуль

CLR FLAG_1 ; для захвата передних фронтов для

CLR FLAG_2 ; следующего цикла

POP PSW

POP ACC

RETI

;

END

Задание 1е Измерение разности фаз

Из-за того, что PCA модули совместно используют одну и ту же временную базу, полезно использовать PCA для измерения разности фаз между двумя или больше сигналами.

Например, два сигнала входят в модули 0 и 1, как показано на рис.8. Оба модуля запрограммированы для фиксирования только передних фронтов. Распечатка 4 представляет программный код, необходимый для измерения разности между двумя сигналами. Этот код не различает, отстает один сигнал или опережает другой.

| Момент (Capture 2) - Момент (Capture 1) | = Разность фаз

Рисунок 8. Измерение разности фаз