Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MSP430_НВВ.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.67 Mб
Скачать

3.7 Таймер a3

Таймер А3 является 16-ти битным таймером-счетчиком. На его базе реализованы 3 модуля захвата/сравнения (capture/compare) – CC0, CC1 и СС2. Каждый из этих модулей может работать либо в режиме захвата, либо в режиме сравнения.

Модули захвата обычно используются для точного измерения временных интервалов между какими-либо событиями, например фронтами внешних импульсов. Для организации работы модуля захвата обычно запускают таймер в режиме свободного счета, входная логика модуля захвата настраивается на определенный тип события (растущий/падающий фронт). При возникновении внешнего события, текущее содержимое таймера автоматически перезаписывается в специальный регистр захвата. Кроме того, устанавливается флаг требования прерывания модуля захвата, отреагировать на который программа может несколько позже, но при этом, содержимое регистра захвата будет точно соответствовать моменту события.

Модули сравнения обычно используются для генерации событий на внешних выводах микроконтроллера в заданный момент времени. Для этого блок выходной логики, связанный с внешним выводом, настраивают на тот или иной тип события (установка, сброс или переключение вывода). В специальный регистр сравнения записывается значение, соответствующее моменту генерации события. С помощью цифрового компаратора модуль периодически сравнивает текущее содержимое таймера и регистра сравнения. При их равенстве вырабатывается внутренний сигнал EQU, который заставляет сработать блок выходной логики. Кроме того, устанавливается флаг требования прерывания, который может быть обработан процессором уже после генерации требуемого события.

Структурная схема таймера А3 приведена на рисунке 3.

Рисунок 3. Структурная схема таймера А3

Текущее содержимое таймера находится в регистре TAR (Timer A Register). Тактирование таймера осуществляется с помощью одного из источников – внутренние сигналы ACLK или SMCLK, или внешние сигналы, подключаемые к выводам P1.0/TACLK и P2.1/INCLK. Выбрать источник можно с помощью битов TASSEL в регистре управления таймера. Выбранная входная частота подается на таймер через делитель DIV, управляемый битами ID регистра управления.

Таймер A обеспечивает несколько режимов работы:

  • Режим продолжительного счета (Continuous) – содержимое регистра TAR увеличивается на 1 при каждом тактирующем импульсе от 0 до FFFFh, после чего таймер переполняется, его содержимое сбрасывается в 0 и процесс начинается сначала. При переходе значения TAR FFFFh0 устанавливается флаг переполнения таймера TAIFG. Период переполнения таймера определяется выражением: 65536*ΔT, где ΔT – период частоты тактирования таймера.

  • Режим суммирования (Up) - содержимое регистра TAR увеличивается на 1 при каждом тактирующем импульсе от 0 до содержимого регистра сравнения CCR0, после чего содержимое TAR сбрасывается и процесс счета начинается сначала. Флаг переполнения TAIFG устанавливается при переходе содержимого TAR CCR00. Период переполнения таймера определяется выражением: (CCR0+1)*ΔT.

  • Режим суммирования-вычитания (Up/Down) – содержимое TAR сначала увеличивается на 1 от значения 0 до содержимого CCR0, после чего направление счета меняется и таймер считает до 0. После достижения нулевого значения, направление счета опять меняется на противоположное и т.д. Флаг переполнения таймера TAIFG устанавливается при переходе TAR 10. Обычно этот режим применяется для широтно-импульсной модуляции PWM. Период переполнения таймера определяется выражением: 2*CCR0*ΔT.

Режимы работы таймера задаются блоком MODE. На рисунке 4 изображены режимы работы таймера. Содержимое таймера также может быть очищено программно с помощью бита TACLR регистра управления.

Рисунок 4. Режимы работы таймера A3

Модули захвата/сравнения имеют идентичную структуру. Т.к. каждый модуль может работать либо в режиме захвата, либо в режиме сравнения, в них используется общий регистр CCRx. Тип события для захвата выделяет блок CC_IN, тип режима сравнения генерирует блок CC_OUT.

Как видно из рисунка 3, для каждого модуля имеется свой набор входных и выходных сигналов. Входной сигнал для модулей захвата назначается битами CCIS регистров управления. Внутреннее подключение входов к потенциалам GND и VCC дает возможность осуществить программное срабатывание модуля захвата. В качестве второго входа модуля CC1 можно выбрать внутренний сигнал выхода встроенного аналогового компаратора CAOUT (см. п. 3.10). В качестве второго входа модуля CC2 можно выбрать внутреннюю частоту ACLK. Эта возможность предусмотрена для реализации умножителя частоты DCO (см.п.3.3).

Подключение выходных сигналов к модулю сравнения производится с помощью регистров P1SEL и P2SEL (см.п. 3.6). Выход ADC12sc модуля CC1 является внутренним сигналом, предназначенным для автоматического старта преобразования АЦП при срабатывании модуля сравнения.

Блок выходной логики модуля сравнения CC_OUT можно запрограммировать на работу в одном из 8-ми возможных режимов:

  • 0 – Output – выход устанавливается программно через специальный бит в регистре управления;

  • 1 – Set – выход устанавливается в 1 при TAR=CCRx и остается в этом состоянии до тех пор, пока таймер не будет сброшен или не изменен режим;

  • 2 – Toggle/Reset – выход переключается на противоположное состояние при TAR=CCRx, сбрасывается в 0 при TAR=CCR0;

  • 3 – Set/Reset – выход устанавливается в 1 при TAR=CCRx, сбрасывается в 0 при TAR=CCR0;

  • 4 – Toggle – выход переключается на противоположное состояние при TAR=CCRx;

  • 5 – Reset – выход сбрасывается в 0 при TAR=CCRx и остается в этом состоянии до тех пор, пока не будет изменен режим;

  • 6 – Toggle/Set – выход переключается на противоположное состояние при TAR=CCRx и сбрасывается в 0 при TAR=CCR0;

  • 7 – Reset/Set – выход сбрасывается в 0 при TAR=CCRx и устанавливается в 1 при TAR=CCR0.

Режимы 2,3,6,7 не используются для CC0.

Согласно таблице 5 модуль CC0 имеет индивидуальный вектор прерывания с адресом FFECh, прерывания от модулей CC1, CC2, а также переполнение таймера имеют групповой вектор с адресом FFEAh. Для быстрого определения источника прерывания используется регистр идентификации прерывания TAIV.

Перечень регистров управления таймера A3 приведен в таблице 12.

Таблица 12

Регистр

Назначение

Адрес

TAR

Регистр таймера-счетчика

170h

TACTL

Регистр управления таймера

160h

TACCR0

Регистр захвата/сравнения СС0

172h

TACCTL0

Регистр управления СС0

162h

TACCR1

Регистр захвата/сравнения СС1

174h

TACCTL1

Регистр управления СС1

164h

TACCR2

Регистр захвата/сравнения СС2

176h

TACCTL2

Регистр управления СС2

166h

TAIV

Регистр идентификации прерывания

12Eh

    • TAR (Timer A Register) – регистр таймера А. 16-ти разрядный регистр текущего содержимого таймера. Регистр доступен как для записи, так и для чтения с помощью словных форм инструкций.

    • TACTL (Timer A Control) – содержит биты управления таймера А. Регистр доступен как для записи, так и для чтения с помощью словных форм инструкций и содержит следующие биты.

15 10 9 8

TASSEL 1, 0

7 6 5 4 3 2 1 0

ID 1, 0

MC1,0

-

TACLR

TAIE

TAIFG

  • Биты 15 -10 – зарезервированы.

  • Биты 9, 8 – TASSEL (Timer A Source Select) – комбинация состояния этих бит определяет источник тактирования таймера.

TASSEL1

TASSEL0

Источник

0

0

TACLK

0

1

ACLK

1

0

SMCLK

1

1

INCLK

  • Биты 7, 6 – ID (Input Divider) - комбинация состояния этих бит определяет коэффициент деления входного делителя таймера

ID1

ID0

Коэффициент

0

0

1 / 1

0

1

1 / 2

1

0

1 / 4

1

1

1 / 8

  • Биты 5, 4 – MC (Mode Control) - комбинация состояния этих бит определяет текущий режим таймера

MC1

MC0

Режим

0

0

Остановлен

0

1

Up

1

0

Continuous

1

1

Up/Down

  • Бит 3 – зарезервирован .

  • Бит 2 – TACLR (Timer A Clear) – программная установка этого бита вызывает сброс регистра TAR в 0. Бит сбрасывается в 0 автоматически.

  • Бит 1 – TAIE (Timer A Interrupt Enable ) – установка/сброс этого бита разрешает/запрещает прерывание по переполнению таймера.

  • Бит 0 – TAIFG (Timer A Interrupt Flag) – флаг требования прерывания. Устанавливается аппаратно при переполнении таймера или программно. Сбрасывается автоматически чтением регистра TAIV.

    • TACCR 0, 1, 2 (Timer A Capture/Compare Register) - 16-ти разрядные регистры захвата/сравнения. В режиме захвата в регистр автоматически записывается содержимое TAR. В режиме сравнения содержимое этих регистров автоматически сравнивается с содержимым TAR для генерации внешнего события. Доступны по записи и чтению с помощью словных форм инструкций.

    • TACCTL 0, 1, 2 (Timer A Capture/compare Control) – содержат биты управления модулей захвата/сравнения. Все три регистра имеют идентичную структуру и доступны по записи и чтению с помощью словных форм инструкций. Регистры содержат следующие биты

15 14 13 12 11 10 9 8

CM1, 0

CCIS1,0

SCS

SCCI

-

CAP

7 6 5 4 3 2 1 0

OUTMOD 2,1,0

CCIE

CCI

OUT

COV

CCIFG

  • Биты 15, 14 – CM (Capture Mode) – режим модуля захвата. Определяют тип события для срабатывания модуля захвата.

CM1

CM0

Тип события

0

0

Нет захвата

0

1

Растущий фронт

1

0

Падающий фронт

1

1

Любой фронт

  • Биты 13, 12 – CCIS (Capture/Compare Input Select) – выбирают сигналы для входа модуля захвата.

CCIS1

CCIS0

Вход

0

0

CCIA

0

1

CCIB

1

0

GND

1

1

VCC

  • Бит 11 – SCS (Synchronize Capture Source) – синхронизация источника захвата. Если этот бит установить в 1 то захват будет производиться синхронно с тактом таймера, в противном случае, захват будет произведен в момент обнаружения внешнего события.

  • Бит 10 – SCCI – (Synchronized Capture/Compare Input) – синхронизированный вход модуля захвата/сравнения. В этот бит аппаратно перезаписывается состояние выбранного входа захвата в момент генерации сигнала EQU. Бит доступен только по чтению.

  • Бит 9 - зарезервирован

  • Бит 8 – CAP (Capture) – установка/ сброс этого бита выбирает режим захвата или сравнения модуля соответственно.

  • Биты 7,6,5 – OUTMOD (Output Mode) – определяют режим работы выходов модуля сравнения.

OUTMOD2

OUTMOD1

OUTMOD0

Режим

Действие

0

0

0

Out

TACCTLx.OUT

0

0

1

Set

1 : TAR=CCRx

0

1

0

Toggle/reset

Переключение : TAR=CCRx,

0 : TAR=CCR0

0

1

1

Set/reset

1 : TAR=CCRx, 0 : TAR=CCR0

1

0

0

Toggle

Переключение : TAR=CCRx

1

0

1

Reset

0 : TAR=CCRx

1

1

0

Toggle/set

Переключение : TAR=CCRx,

1 : TAR=CCR0

1

1

1

Reset/set

0 : TAR=CCRx, 1 : TAR=CCR0

  • Бит 4 – CCIE (Capture/Compare Enable) – установка/сброс этого бита разрешает/запрещает прерывания от модуля захвата/сравнения.

  • Бит 3 – CCI (Capture/Compare Input) – через этот бит читается состояние входа модуля захвата, подключенное битами CCIS этого регистра. Доступен только по чтению.

  • Бит 2 – OUT – содержимое этого бита определяет состояние выхода модуля сравнения, если биты OUTMOD=0.

  • Бит 1 – COV (Capture Overflow) – переполнения захвата. Устанавливается аппаратно, если при срабатывании модуля захвата, предыдущее захваченное значение таймера не было вычитано из CCRx. Сбрасываться бит должен программно.

  • Бит 0 – CCIFG (Capture/Compare Interrupt Flag) – флаг требования прерывания. Устанавливается аппаратно при срабатывании модуля захвата/сравнения. Для TACCTL0 бит сбрасывается программно или аппаратно при вхождении в прерывание. Для TACCTL1 и TACCTL2 бит сбрасывается чтением регистра TAIV.

    • TAIV (Timer A Interrupt Vector) – регистр идентификации прерывания для таймера A и модулей TACC1 и TACC2. Регистр доступен только по чтению. В этом регистре генерируется код, позволяющий определить источник прерывания. Возможны следующие коды содержимого TAIV:

  • 0 – нет прерываний;

  • 2 – установлен флаг TACCTL1.CCIFG;

  • 4 – установлен флаг TACCTL2.CCIFG;

  • 10 – установлен флаг TACTL.TAIFG

Если установлены несколько флагов одновременно, в регистре будет генерироваться меньшее значение. Вычитывание из регистра определенного кода автоматически сбрасывает соответствующий флаг IFG. Использование регистра TAIV дает возможность быстрого ветвления на подпрограмму обработки прерываний. Типовая последовательность команд для обработки прерываний различных источников таймера приведена ниже.

cc0: . . . ; ISR для TACCTL0.CCIFG

reti

TimHndl: add &TAIV, PC ; общая ISR для TACCTL1.CCIFG,

reti ; TACCTL2.CCIFG и TACTL.TAIFG

jmp cc1

jmp cc2

nop

nop

timOvf: . . . ; начало ISR по TACTL.TAIFG

reti ; можно заменить на “ jmp TimHndl

cc1: . . . ; начало ISR по TACCTL1.CCIFG

reti ; можно заменить на “ jmp TimHndl

cc2: . . . ; начало ISR по TACCTL2.CCIFG

reti ; можно заменить на “ jmp TimHndl

В данном фрагменте прерывание для модуля TACC0 подпрограмма обработки прерывания описывается самостоятельно, так как для этого модуля имеется собственный вектор прерывания. Для модулей TACC1, TACC2 и собственно таймера A, таблица векторов настраивается на единую подпрограмму с адресом TimHndl. При возникновении прерывания управление передается на первую команду, которая прибавляет к содержимому PC код TAIV. Если прерывание было от TACCTL1.CCIFG, то к PC прибавиться 2, и управление будет передано на команду jmp cc1, которая, в свою очередь, передаст управление на собственно подпрограмму обработки cc1 для TACCTL1.CCIFG. Таким образом, в подпрограмме обработки прерывания нет необходимости тестировать состояние флагов прерываний, поскольку используется вычисляемый переход. Если существует значительная вероятность того, что флаги прерываний могут быть установлены одновременно, вместо команд reti имеет смысл выполнить команду перехода на начало ISR. В этом случае, процессор будет находиться в прерывании до тех пор, пока не обслужит все запросы.

ПРИМЕР

Запрограммировать модуль сравнения для аппаратной генерации последовательности импульсов частотой 100 kHz, и длительностью 1 µs. Частота SMCLK = 8 MHz.

Временная диаграмма генерации импульсов приведена на рис.5. Для аппаратной генерации импульсов можно использовать UP-режим таймера. Тогда период импульсов будет определяться содержимым регистра TACCR0. Для генерации самих импульсов будем использовать модуль TACCR1 и внешний вывод P1.2/TA1. Модуль сравнения TACCR1 может работать в режиме Reset/Set.

Рисунок 5. Временная диаграммы генерации импульсов.

Параметры T1=1 µS, T2= 1/ (100 kHz)= 10 µS.

Значение, загружаемое в регистр TACCR0+1 = T2/Δt, где Δt – период тактирования таймера. Т.к. таймер должен тактироваться частотой SMCLK, то

TACCR0+1 = 10 µS * 8 MHz = 80.

Отсюда значение в TACCR0 = 79.

Значение, загружаемое в TACCR1, определится как

TACCR1 = 1 µS * 8 MHz = 8.

#include <msp430x14x.h> ; подключаем файл определений

mov #4, &P1SEL ; настраиваем P1.2/TA1 для поддержки TACCR1

mov #79, &TACCR0 ; задаем период импульсов

mov #8, &TACCR1 ; задаем длительность импульсов

mov #OUTMOD_7, &TACCTL1 ; настраиваем TACC1 на режим Reset/set,

; в msp430x14x.h определена константа

; OUTMOD_7=0Eh

mov #TASSEL+MC0+TACLR, &TACLR ;тактирование таймера от SMCLK,

; старт таймера в UP режиме

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]