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

ПРАКТИЧЕСКОЕ ЗАНЯТИЕ № 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