|
|
#1 (ссылка) |
|
Crow indian
Регистрация: 21.02.2009
Возраст: 40
Сообщений: 30,032
Поблагодарил: 398 раз(а)
Поблагодарили 5987 раз(а)
Фотоальбомы:
2576 фото
Записей в дневнике: 698
Репутация: 126089
|
Тема: Система событий микроконтроллеров ATxmegaСистема событий микроконтроллеров ATxmega А. САВЧЕНКО, пос. Зеленоградский Московской обл. В предыдущих поколениях микроконтроллеров производства фирмы Atmel (ATtiny, ATmega) для взаимодействия внутренних модулей микроконтроллера между собой в режиме реального времени можно было применять только один инструмент — систему прерываний процессора. Для неё характерно вовлечение процессора в процесс взаимодействия, что приводит к его отвлечению от выполнения основной программы и, следовательно, к потерям машинного времени. Время передачи воздействия от модуля-источника к модулю-приёмнику достигает десяти и более циклов синхронизации, что для современных высокоскоростных вычислительных систем довольно много. Для устранения отмеченных недостатков межмодульного взаимодействия в микроконтроллерах ATxmega появился весьма удобный механизм оперативного взаимодействия модулей между собой — система событий (англ. Event System, EVSYS). В отличие от системы прерываний, система событий представляет собой аппаратный механизм взаимодействия модулей микроконтроллера между собой без участия процессора. Сигнал о произошедшем событии доставляется от модуля-источника к модулю-приёмнику через сеть маршрутизации событий. Она имеет восемь независимых каналов, что позволяет одно- временно передавать до восьми сигналов о различных событиях. Система событий функционирует как в активном режиме работы микроконтроллера, так и в "спящем" режиме (IDLE). Событием считается изменение состояния модуля-источника, факт которого фиксируют элементы его внутренней структуры. Например, таймер-счётчик фиксирует факт переполнения своего регистра в ходе счёта. Это и есть событие переполнения таймера-счётчика. Генерировать события (выступать в роли модулей-источников) могут таймеры-счётчики, счётчик реального времени, аналого-цифровые преобразователи, аналоговые компараторы, порты ввода—вывода, узел системной синхронизации. Следует заметить, что они генерируют события при тех же условиях, что и запросы прерывания. Кроме того, возможна и программная генерация событий. В этом случае источник события — процессор. Модулями-приёмниками могут быть таймеры-счётчики, аналого-цифровые преобразователи, цифроаналоговые преобразователи, порты ввода—вывода, контроллер ПДП. Полная информация о возможности генерирования событий модулями-источниками и их использовании модулями-приёмниками приведена в [1]. События могут быть сигнальными или информационными. Сигнальное событие сообщает модулю-приёмнику лишь факт того, что состояние модуля-источника изменилось. Информационное событие содержит также дополнительные сведения о произошедшем, которые при необходимости могут быть использованы модулем-приёмником. В процессе передачи сообщений о событиях предусмотрена возможность их цифровой фильтрации и квадратурного декодирования. Если функция цифровой фильтрации активна, сигнал о событии поступит на модуль-приёмник только в том случае, если запрограммированное число (2—8) его отсчётов, взятых с частотой системной синхронизации, имеет одинаковое логическое значение. Понятно, что применять такую фильтрацию имеет смысл лишь к сигналам событий, формируемым асинхронно относительно тактовой частоты микроконтроллера. Это, например, изменения логических уровней на входах портов. Квадратурное декодирование позволяет обрабатывать квадратурные сигналы, поступающие на входы портов микроконтроллера и передавать информационные события об их изменениях таймеру-счётчику. Последний увеличит или уменьшит на единицу содержимое своего счётного регистра. В системе событий имеются три квадратурных декодера, привязанных к каналам событий 0, 2 и 4. Типичные устройства, сигналы которых требуют квадратурной обработки, — широко применяемые в качестве органов управления датчики угла поворота (энкодеры). Обычно энкодер при вращении его вала формирует две последовательности прямоугольных импульсов, сдвинутых по фазе на 90°. Этим сигналам в микроконтроллерах ATxmega присвоены символические имена QDPH0 и QDPH90. Некоторые энкодеры формируют также сигнал QDINDX, свидетельствующий о совершении его валом полного оборота. Возможность его обработки узлом квадратурного декодирования также имеется. В зависимости от конкретной задачи сигнал QDINDX может быть использован для определения абсолютного положения вала, для формирования сигнала ошибки декодирования, для подсчёта числа полных оборотов или для обнуления счётчика. Организация квадратурного декодирования требует конфигурирования как минимум двух линий порта на ввод и одного таймера-счётчика на приём информационного события. После этого из счётного регистра таймера-счётчика можно считывать угол поворота вала энкодера, а также принимать решения о необходимой реакции на изменение сигнала QDINDX. Пример настройки системы событий на обслуживание энкодера будет приведён в конце статьи. Сеть маршрутизации событий представляет собой, по сути, множество связанных между собой многоканальных мультиплексоров — матрицу соединений. Задавая состояния мультиплексоров, можно обеспечить прохождение сигналов событий между модулями микроконтроллера по необходимым маршрутам. Полная схема сети приведена в [1]. Управляющую информацию для этой сети заносят в программнодоступные регистры системы событий: CHnMUX — регистр мультиплексора канала события п. Его содержимое поз- воляет выбрать источник события в соответствии с табл. 1, которая действительна для всех микроконтроллеров ATxmega независимо от того, имеется в них то или иное устройство ввода-вывода или нет. Выбор источником события устройства, которого фактически нет в микроконтроллере, будет проигнорирован. События, сгенерированные программно, имеют приоритет над заданными в регистре CHnMUX и передаются по назначению, даже если в этом регистре записано нулевое значение. В табл. 2. приведены возможные варианты генерации событий таймером-счётчиком. CHnCTRL — регистр управления каналом события п. Разряд 7 этого регистра зарезервирован для будущих разработок. Разряды 6—3 имеются только в регистрах CHOCTRL, CH2CTRL, CH4CTRL. QDIRM[ 1:0] (6, 5) — режим распознавания индекса квадратурной дешифрации. В табл. 3 указано состояние сигналов QDPH0 и QDPH90, по которому следует распознавать индексный сигнал. Эти разряды используют только в случае, если имеется индексный сигнал квадратурного энкодера. QDEN (3) — разрешение квадратурной дешифрации. Запись единицы в этот разряд разрешает работу квадратурного декодера в канале п. DIGFI LT[2:0] (2—0) — в цифровом фильтре будет использовано DIGFILT+1 отсчётов сигнала. DIGFILT = 0 означает отключение цифровой фильтрации. Для программной генерации событий в системе предусмотрены два регистра: STROBE — регистр стробирования события, DATA — регистр данных события. Для генерации сигнального события в канале п необходимо записать 1 в соответствующий разряд регистра STROBE. Например, запись в этот регистр значения &В00000101 приведёт к генерации сигнальных событий в каналах 0 и 2 одновременно. Для генерации информационного события необходимо вначале выполнить запись в регистр DATA, затем в STROBE. Фактическая генерация события произойдёт с задержкой на один цикл тактирования УВВ с момента загрузки регистра STROBE. При этом содержимое разрядов регистров будет интерпретироваться модулем-приёмником в соответствии с табл. 4. Например, если записать &В00000101 в регистр DATA, а затем значение &В00000001 в регистр STROBE, будет порождено информационное событие 03 в канале 0 и информационное событие 01 в канале 2. Обратите внимание на то, что приёмник сигнальных событий получит таковое в канале 0, но в канале 2 событие этого типа порождено не будет. После генерации событий регистры STROBE и DATA автоматически очищаются. Итак, система событий предоставляет максимально возможную оперативность взаимодействия модулей. От момента события в модуле-источнике до момента начала действия модуля-приёмника проходит не более двух тактов синхронизации. Взаимодействие модулей микроконтроллера без участия процессора даёт ему возможность выполнять программу без разрывов во времени, что иногда бывает очень важно. Аппаратно реализованные функции цифровой фильтрации и квадратурной дешифрации позволяют дополнительно разгрузить процессор. ![]() Примеры использования системы событий в программах Программы, реализующие приведённые примеры, подготовлены с помощью системы программирования BASCOM AVR версии 2.0.7.3. Первый пример — использования сигнального события. Допустим, необходимо пересылать массив отсчётов состояний входных линий порта в ОЗУ, используя режим прямого доступа к памяти (ПДП), а затем отображать загруженную информации на индикаторе. Исходные данные Частота системной синхронизации микроконтроллера, МГц 32 Входной порт F Число отсчётов 7200 Начальный адрес буфера Н3000 Темп выдачи отсчётов, МГц 4 Номер используемого канала ПДП 0 Номер используемого канала событий 0 Суть задачи сводится в считыванию байтов из входного регистра порта F с темпом 4 МГц и их загрузке в ячейки ОЗУ с инкрементированием адреса после каждой операции записи. Процесс пересылки с использованием ПДП организуется несложно. Он был подробно описан в [2]. Однако в рассмотренной там программе имелся явный сигнал запуска канала ПДП для передачи каждого байта — запрос прерывания от модуля АЦП, свидетельствующий о готовности очередного отсчёта. Но здесь картина иная. Источник информации (порт) не способен генерировать запросы прерываний или сигналы событий, каким-либо образом привязанные к шкале времени. Следовательно, необходимо найти источник такого сигнала (в соответствии с темой статьи это должен быть сигнал события). Из табл. 1 следует, что такими источниками может быть модуль системной синхронизации или модуль таймера-счётчика. Используем второй вариант. Поскольку все таймеры-счётчики микроконтроллера имеют одинаковые характеристики, можно применить любой из них. Остановимся на таймере-счётчике 0 порта С. Для решения задачи необходимо конфигурировать устройства микроконтроллера, участвующие в выполнении поставленной задачи: порт F, таймер-счётчик 0 порта С, систему событий и контроллер ПДП. Конфигурирование порта сводится к переключению всех его линий на ввод Portf_di г=&в00000000 и установке на них низкого начального логического уровня. Например, чтобы установить такой уровень на входе PF3, нужно включить внутренний резистор, соединяющий этот вывод с общим проводом, выполнив операцию Portf_pi n3ctrl=&в00010000. Аналогично следовало бы поступить с каждой из восьми линий порта. Но можно выполнить те же действия всего двумя строками программы, воспользовавшись регистром маски одинаковой конфигурации нескольких линий порта (подробности описаны в [1]): Portcfg_mpcmask=&Bllllllll Portf_pi n3ctrl=&B00010000 По условиям задачи таймер-счётчик 0 порта С должен генерировать сигнальное событие каждые 0,25 мкс. Проще всего для этого перевести таймер-счётчик в режим нормального счёта (он будет считать импульсы тактовой частоты) и обеспечить его переполнение каждым восьмым импульсом: config Tcc0=Normal, Prescale=l Тсс0_рег=7 Выполнив эти инструкции, таймер-счётчик начнёт работать и генерировать события с нужным периодом. Конфигурирование системы событий сводится к загрузке в регистр мультиплексора нулевого канала событий кода их источника. Согласно табл. 1 и табл. 2, это выполнит следующая строка программы: Evsys_ch0mux=&Bll000000. Контроллер ПДП конфигурируют аналогично примеру, приведённому в [2], с той лишь разницей, что источником запуска для него будет нулевой канал системы событий, а источником информации — регистр ввода порта F (имя этого регистра — Portfjn). Как следует из [2] (табл. 1 и табл. 5), код источника запуска канала ПДП должен быть равен 1. Нужную конфигурацию обеспечит следующий фрагмент программы: config Dma=Enabled,о Doublebuf=Disabled,o cpm=chOrrl23 Adr=&H3000 config DmachO=Enabled,o Burstlen=l,chanrpt=Disabled,o Tci=Hi,Ei1=Lo,o si ngleshot=Enabled,о sar=None,sam=Fi xed,о Dar=Transacti on,Dam=inc,o Trigger=l,Btc=7200,Repeat=l,o sadr=varptr(portf._in) ,Dadr=Adr Здесь, как и в [2], значок 0 в конце строки означает, что она прервана условно и в следующей строке находится её продолжение. Вводить в компьютер их нужно одной строкой, опуская значки 0. На этом конфигурирование устройств закончено. Основная часть программы представляет собой цикл, включающий в себя приём информации в буферную область ОЗУ и её отображение. Первой командой цикла целесообразно перезапустить таймер-счётчик, чтобы он начал отсчёт временных интервалов с нуля: Tcc0_ctr1fset=&B00001000 После этого необходимо разрешить работу нулевого канала ПДП командой: set Dma_ch0_ctrla.7 и дождаться завершения транзакции ПДП Bitwait Dma_intflags.0,set set Dma_intflags.l Процесс отображения для понимания работы системы событий не важен, поэтому просто предположим, что его выполняет процедура по имени Screen: Gosub Screen Задача решена. ![]() В следующем примере рассмотрим программу, использующую информационные события для обслуживания простейшего инкрементного энкодера ЕС12Е24204А, формирующего 24 импульса за каждый оборот вала. Так как микроконтроллер обрабатывает квадратурные сигналы аппаратно, вся программа сводится к конфигурированию двух линий любого порта, на которые поступают квадратурные сигналы с выходов энкодера, на ввод, а также одного канала системы событий (допустимо использование каналов 0, 2 или 4) и одного (любого) таймера-счётчика. ![]() Если энкодер подключён к порту F микроконтроллера по схеме, показанной на рисунке, то линии PF3 (QDPFI0) и PF4 (QDPF190) необходимо сконфигурировать как входы, включить внутренние резисторы микроконтроллера, соединяющие эти линии с плюсом питания, и задать обнаружение низкого уровня: config Portf.3=input config Portf.4=lnput Portf_pi n3ctr1=&B00011011 Portf_pin4ctr1=&B00011011 Чтобы использовать нулевой канал системы событий, необходимо выбрать линию PF3 (QDPHO) в качестве источника событий (см. табл. 1): Evsys_ch0mux=&B01111011 Затем следует разрешить в этом канале квадратурное декодирование и цифровую фильтрацию: Evsys_chOctrl=&В00001001 Возможно, число отсчётоз сигнала, обрабатываемых цифровым фильтром, придётся подбирать опытным путём. Его оптимальное значение зависит от длительности "звона" контактов энкодера. Переходим к настройке таймера счётчика. Выберем, как и в прошлом примере, таймер-счётчик 0 порта С. Настраивая его, необходимо указать, что источник события — канал 0 системы событий, реакция на событие — квадратурное декодирование, а источник синхронизации — также нулевой канал системы событий. Для конфигурирования таймера-счётчика в среде программирования BASCOM AVR предусмотрена директива Config ТСхх, описание которой имеется в разделе помощи среды. В нашем случае эта директива должна выглядеть так: config TccO=Normal,prescalе=Е0,о Event_sou гсе=Е0,Event_acti on=Qdec В регистр периода таймера-счётчика следует записать число N-4-1, где N=24 — число импульсов, формируемых используемым энкодером за полный оборот вала: тсс0_рег=95 С этого момента аппаратура микроконтроллера начнёт отслеживать повороты вала энкодера, а в счётном регистре таймера-счётчика постоянно будет находиться значение, характеризующее текущее угловое положение вала. В момент запуска программы его значение можно установить равным 0. ЛИТЕРАТУРА 1.8-bit Atmel XMEGA A Microcontroller. XMEGA A MANUAL — URL: http://www.atme!. com/lmages/doc8077.pdf (01.10.14). 2. Савченко А. Режим прямого доступа к памяти микроконтроллера ATxmega. — Радио, 2015, №2, с. 27—31. |
|
|
Цитировать 12 |
|
|
#2 (ссылка) |
|
Кандидат в V.I.P.
Регистрация: 04.12.2017
Сообщений: 1
Поблагодарил: 0 раз(а)
Поблагодарили 1 раз(а)
Фотоальбомы:
не добавлял
Репутация: 0
|
Вот код Bascom, позволяющий организовать 16 битный квадратурный счёт:
Настраиваем входы: Код:
Config Pina.0 = Input 'A Config Pina.1 = Input 'B Код:
Config Xpin = Pina.0 , Sense = Rising Config Xpin = Pina.1 , Sense = Rising Код:
Config Event_system = Dummy , Mux0 = Porta.0 , Qd0 = Enabled , Digflt0 = 2 Таймер конфигурируем любой свободный, в Xmega A3 их 7 штук. Код:
Config Tcc1 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec Код:
Tcc1_per = 9999 Код:
DIM EN1 As Word .. .. .. En1= Tcc1_CNT Вот, что у нас получилось: Код:
Config Pina.0 = Input 'A Config Pina.1 = Input 'B Config Xpin = Pina.0 , Sense = Rising Config Xpin = Pina.1 , Sense = Rising Config Event_system = Dummy , Mux0 = Porta.0 , Qd0 = Enabled , Digflt0 = 2 Config Tcc1 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec Tcc1_per = 9999 Do Print Tcc1_cnt Waitms 300 Loop Но и тут мы не на коне ![]() 16 бит счёта - это мало, минимум бы 24, а лучше 32. Аппаратно расширить счёт можно, но нигде и никто не может подсказать как это сделать так, чтоб второй таймер считал не только в плюс, но и в минус. Так-же неизвестно как работать с QDIRM, а без него никак, ведь надо знать эталонное начало счёта. По поводу расширения счёта таймера, делается это тоже через канал события. Берём к примеру канал №1 и настраиваем событие на переполнения таймера который подсчитывает квадратурную дешифрацию: Код:
Config Event_system = Dummy , Mux1 = Tcс1_ovf Код:
Config Tce1 = Normal , Prescale = E1 , Event_source = E1 ![]() А, да, если чего, первый таймер по которому будет расширятся второй таймер, там предусмотрена задержка сигнала, это для того, чтоб второй таймер успел среагировать, задержку можно включить так (Event_delay = Enabled) : Код:
Config Tcc1 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec , Event_delay = Enabled коня.Подскажите, как сбросить счёт по Qdirm? Код:
Config Porta.3 = Input 'A Config Porta.4 = Input 'B Config Porta.5 = Input 'Z Config Xpin = Porta.3 , Sense = Rising Config Xpin = Porta.4 , Sense = Rising Config Xpin = Porta.5 , Sense = Both Config Event_system = Dummy , Mux0 = Porta.0 , Qd0 = Enabled , Qdi0 = Enabled , Qdirm0 = 1 , Digflt0 = 2 Config Tcc1 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec , Event_delay = Enabled Плюсы: Считать квадратурные импульсы оказывается легко, скорость счёта очень быстрая и без ошибочная. ![]() Минусы: Неизвестно как раширить двунаправленный счёт до 32 бит, неизвестно как работать с QDIx.
|
|
|
Цитировать 0 |
| Поблагодарили: |
Данный пост получил благодарности от пользователей
|
|
|
||||
| Тема | Автор | Раздел | Ответов | Последнее сообщение |
| Усовершенствование комбинированного прибора на базе микроконтроллера ATxmega | Admin | Микроконтроллеры | 0 | 06.06.2015 20:54 |
| Визуальная среда программирования микроконтроллеров AVR | Admin | Микроконтроллеры | 0 | 01.06.2015 19:32 |
| [09-2014] Регистрация событий в системе АСОУП-2 | poster334 | xx3 | 0 | 17.05.2015 18:29 |
| [РЖД ТВ] Первое место среди событий 20 марта заняло солнечное затмение | rzd.ru | Новости на сети дорог | 3 | 22.03.2015 20:50 |
| Регистратор событий универсальный (УРС-2) | Admin | Сортировочные горки, счетчики осей | 0 | 14.12.2010 17:23 |
| Ответить в этой теме Перейти в раздел этой темы Translate to English |
| Возможно вас заинтересует информация по следующим меткам (темам): |
| , , |
| Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|