Вы здесь: Главная » Начинаем работать с системой событий микроконтроллеров XMEGA

Начинаем работать с системой событий микроконтроллеров XMEGA
1.Начинаем работать с системой событий микроконтроллеров XMEGA

2.Обзор системы событий

Систему событий можно разделить на три части:

  • Генераторы событий с одним или более источником событий.
  • Маршрутизатор событий.
  • Приёмники событий.

В этой главе будет рассмотрено взаимодействие этих частей между собой.

2.1 Что такое событие?

Под событием в данном документе подразумевается индикация изменения состояния периферийного модуля. Периферийные модули, способные генерировать события, называются генераторами событий. Один генератор событий может быть в состоянии генерировать события при изменении нескольких параметров периферийного модуля. Каждый из них является отдельным источником событий. Например, модуль таймера-счётчика является генератором событий с несколькими источниками событий, так как он может генерировать событие при переполнении, при ошибке и при сравнении/захвате.

2.2 Типы событий

В системе событий XMEGA существует два типа событий, «Signaling» и «Data». События «Signaling» не содержат никакой информации, кроме того, что произошло какое то событие. События «Data» содержат дополнительные данные об изменении состояния модуля. Структура данных зависит от источника события.

Поскольку события типа «Data» используются только несколькими периферийными модулями, они не будут подробно рассматриваться до главы 3. В остальной части этого документа при употреблении слова «событие» будет иметься ввиду событие типа «Signaling», за исключением ситуаций, когда будет необходимо их различать.

2.3 Генераторы событий

Генераторы событий - это периферийные модули, имеющие один или несколько источников событий. Как правило, существует строгое соответствие между доступными источниками событий, доступными прерываниями и источниками триггеров DMA, принадлежащими периферийному модулю. Генератор событий предоставляет все свои источники событий системе маршрутизации событий и не знает, какие из источников событий используются другими модулями.

2.4 Матрица соединений

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

Каждый источник событий каждого генератора событий подключен ко входам каждого из восьми мультиплексоров. Это позволяет подключить любой канал системы событий к любому источнику событий. Причём может быть выбрано несколько каналов событий для передачи событий от одного источника.

Фильтрация и специальные функции каналов системы событий рассмотрены в главе 3.

2.5 Приёмники событий

Приёмники событий - это периферийные модули, которые могут использовать событие для выполнения какого либо действия, называемого действием по событию. Приёмник события выбирает источник события, на которое он будет реагировать, путем выбора канала системы событий. Фактический источник события определяется настройками мультиплексора для выбранного канала системы событий.

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

2.6 Временные задержки событий

Событие обычно длится один такт системного тактового сигнала. Некоторые источники при определенных условиях способны генерировать события непрерывно, но этот случай здесь подробно не рассматривается.

Когда событие генерируется, ему требуется до двух тактов для срабатывания действия по событию. Один такт требуется на регистрацию порождённого события в матрице соединений, а второй такт на распространение события до приёмника.

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

2.7 Ручная генерация событий

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

Для генерации событий вручную используется два регистра, STROBE и DATA. Генерация события происходит при записи в регистр STROBE. Для генерации событий типа «Signaling» используется только регистр STROBE. При генерации событий типа «Data» используются оба регистра (STROBE и DATA), причём запись в регистр STROBE должна производиться после записи в регистр DATA.

Регистры STROBE и DATA содержат по одному биту на каждый канал событий. Бит с позицией N отвечает за канал системы событий с номером N. Допускается генерация событий сразу на нескольких каналах одновременно путем установки нескольких бит регистра STROBE одновременно.

В таблице 2-1 показано соответствие между значениями, записанными в регистры STROBE и DATA, и порождёнными событиями. Обратите внимание на то, что приёмники событий типа «Signaling» получат только события «Data Event 02» и «Data Event 03». Событие «Data Event 01» получит только тот приёмник, который подписан на события типа «Data». Более подробно события типа «Data» рассмотрены в главе 3.

Таблица 2-1. Кодирование событий

STROBE DATA Приёмник событий
типа «Data»
Приёмник событий
типа «Signaling»
0 0 Нет события Нет события
0 1 Событие «Data Event 01» Нет события
1 0 Событие «Data Event 02» Событие типа «Signaling»
1 1 Событие «Data Event 03» Событие типа «Signaling»

2.7.1 Ручная генерация событий типа «Signaling»

Для генерации событий типа «Signaling» требуется произвести запись только в регистр STROBE. Например, запись значения 0x05 в регистр STROBE приведёт к генерации событий типа «Signaling» на каналах 0 и 2 одновременно. Когда события будут сгенерированы, регистры STROBE и DATA автоматически очищаются.

2.7.2 Ручная генерация событий типа «Data»

При генерации событий типа «Data» сначала должна быть произведена запись в регистр DATA, а затем уже в регистр STROBE. События не будет порождено до тех пор, пока не будет произведена запись в регистр STROBE. Когда событие(я) будет порождено, регистры STROBE и DATA автоматически очищаются. Например, если записать значение 0x05 в регистр «Data», а затем записать значение 0x01 в регистр STROBE, будет порождено событие "Data Event 03" на канале 0 и событие "Data Event 01" на канале 2. Обратите внимание на то, что приёмник событий, ожидающий события типа «Signaling», получит его на канале 0, но на канале 2 событие этого типа порождено не будет.

2.8 События и режимы энергосбережения

Система событий работает в активном режиме и режиме ожидания (Idle). Во всех остальных режимах энергосбережения периферийные модули не могут использовать систему событий.

3 Более сложные функции

В дополнение к ретрансляции информации об изменениях в периферийных устройствах система событий имеет встроенные функции для обработки сложных задач, таких как фильтрация и квадратурное декодирование. Эти функции требуют специальной обработки в каналах системы событий и управляются регистрами CHnCTRL, где n это номер канала.

3.1 Фильтрация

Каждый канал системы событий снабжён цифровым фильтром, который управляется полем DIGFILT[2:0] регистра CHnCTRL. При использовании цифрового фильтра высокий логический уровень на входе мультиплексора канала системы событий должен оставаться в течении (DIGFILT + 1) тактов до того, как событие будет передано через канал системы событий приёмнику.

Цифровой фильтр обычно используется при опросе линий портов ввода/вывода, чтобы предотвратить несколько последовательных событий, вызванных дребезгом контактов или электрическим шумом.

3.2 Квадратурное декодирование

Система событий имеет в своем составе расширение, которое позволяет использовать таймер-счётчик как квадратурный декодер. Квадратурные энкодеры обычно используются в качестве датчиков положения в моторах, а так же в других роторных датчиках, таких как трекер шарика компьютерной мыши. В статье по применению AVR1600 более подробно рассмотрена настройка и использование квадратурного декодера.

4 Примеры

В этой главе приведено несколько примеров использования системы событий. Каждый пример содержит инструкции по настройке каждой части системы. Дополнительные и более подробные примеры можно найти в статьях по применению для конкретных приёмников событий.

4.1 Захват входа

Любой источник событий может быть использован для запуска захвата входа одним из модулей таймеров-счётчиков. Это может быть использовано для измерения временных интервалов между какими либо событиями.

4.1.1 Настройка

Этот пример показывает, как настроить таймер-счётчик TCC0 для захвата входа, инициированного изменением логического уровня на линии PD0 порта ввода/вывода. Для этого необходимо:

  1. Настроить TCC0 на желаемую частоту и период.
  2. Настроить канал 0 системы событий на использование события PD0 в качестве источника событий.
  3. Выбрать канал 0 системы событий в качестве источника событий для TCC0.
  4. Установить для TCC0 действие по событию "захват входа".
  5. Активировать канал сравнения или захвата А.
  6. Настроить PD0 как вход, и срабатывание по обоим (переднему и заднему) фронтам.

Теперь таймер-счётчик TCC0 будет выполнять захват входа каждый раз, когда меняется логический уровень на входе PD0.

4.2 Развёртка четырех каналов АЦП при переполнении таймера-счётчика

АЦП может быть настроен на запуск развёртки четырех каналов при наступлении любого события. В этом примере используется событие переполнения таймера-счётчика. Это может быть очень полезно при генерации ШИМ с помощью таймера-счётчика, так как преобразования АЦП можно синхронизировать с ШИМ.

4.2.1 Настройка

Этот пример демонстрирует настройку запуска развёртки четырех виртуальных каналов ADCA при переполнении таймера-счётчика TCC0, используя канал 0 системы событий. Для этого необходимо:

  1. Настроить TCC0 на желаемую частоту и период.
  2. Выбрать событие переполнения TCC0 в качестве источника событий для канала 0 системы событий.
  3. Настроить ADCA на режим четырехканальной развёртки.
  4. Настроить ADCA для запуска развёртки по событию используя канал 0 системы событий.

4.3 32-разрядный таймер-счётчик с функцией захвата

Иногда полезно иметь таймер-счётчик с разрешением более 16 бит. С помощью системы событий можно каскадировать два 16-разрядных таймера-счётчика и использовать их как один 32-разрядный таймер-счётчик с функцией захвата входа.

Статья по применению AVR1306 содержит более детальную информацию об использовании таймеров-счётчиков в 32-х разрядном режиме.

4.3.1 Настройка

Этот пример демонстрирует алгоритм настройки таймеров-счётчиков TCC0 и TCC1 для работы в качестве одного 32-разрядного таймера-счётчика с каналом захвата A, срабатывающим при изменении логического уровня на линии PD0, а генерируемое при этом событие проходит через канал 1 системы событий. Канал 0 системы событий используется для оповещения о переполнении счётчика. Для этого необходимо:

  1. Настроить линию PD0 как вход, реагирующий на оба фронта сигнала.
  2. Выбрать событие переполнения TCC 0 в качестве источника событий для канала 0 системы событий.
  3. Выбрать события линии PD0 в качестве источника событий для канала 1 системы событий.
  4. Выбрать канал 1 системы событий источником тактового сигнала для TCC1.
  5. Для обоих таймеров установить бит EVACT в регистре CTRLD для выбора в качестве действия по событию захват входа.
  6. Для обоих таймеров-счётчиков установить биты EVSEL в регистре CTRLD таким образом, чтобы был выбран канал 1 системы событий.
  7. Для таймера-счётчика, определяющего старшее слово, установить бит EVDLY в регистре TCC1.CTRLD для задержки события.
  8. Активировать канал захвата A для обоих таймеров-счётчиков.
  9. Выбрать системный тактовый сигнал в качестве тактового сигнала таймера-счётчика TCC0.

Теперь изменение логического уровня на линии PD0 приведёт к захвату 32-разрядного значения канала A таймеров-счётчиков TCC0 и TCC1.

4.4 Подсчёт событий

Существует возможность использовать канал системы событий в качестве источника тактового сигнала для таймера-счётчика. Это может быть использовано для подсчёта количества событий, прошедших через канал системы событий.

В этом примере таймер-счётчик TCC0 используется для подсчета нажатий на кнопку, подключенную к линии PD0. Для этого необходимо:

  1. Настроить линию PD0 как вход, реагирующий на передний или задний фронт сигнала.
  2. Настроить линию PD0 как источник событий для канала 0 системы событий.
  3. Установить максимальное значение для цифрового фильтра канала 0 системы событий.
  4. Настроить канал 0 системы событий как источник тактового сигнала для таймера-счётчика TCC0.

Теперь таймер-счётчик TCC0 будет подсчитывать количество нажатий на кнопку, подключенную к линии PD0.

4.5 Распространение частоты дискретизации

Канал системы событий может быть настроен на распространение частоты дискретизации. Множеству систем управления требуется измерять и выводить данные через равные промежутки времени, называемые частотой дискретизации. Используя один из таймеров-счётчиков в качестве генератора частоты дискретизации можно распространять события переполнения и/или совпадения таймера-счётчика модулям АЦП, ЦАП, ШИМ и другим периферийным модулям, которым необходимо выполнять некоторые действия через равные интервалы времени.

5 Драйвер и примеры

Приложенный к статье драйвер содержит функции для настройки системы событий. Драйвер написан на ANSI® С и должен компилироваться любым компилятором, поддерживающим микроконтроллеры XMEGA.

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