Распечатка 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