|
MОДУЛЬ БЫСТРОГО ВЫВОДАМодуль быстрого вывода (HSO) формирует и выдает выходные события в определенное время с использованием счетчика 1 или 2 как базового. На рисунке 6.3 показана блок-схема модуля HSO.
Рис. 6.3. Структурная схема модуля HSO В состав модуля HSO входят регистры специальных функций HSO_COMMAND, HSO_TIME, IOS0, IOS2, разряды 6 и 7 регистра IOC2 и разряды 0-3 регистра IOS1, мультиплексор (K), компаратор, контроллер и ассоциативное запоминающее устройство (CONTENT_ADDRESSABLE MEMORY - CAM), содержащее 8 24-разрядных ячеек, и входной регистр (Holding Registr). Файл CAM - основной компонент модуля HSO. Этот файл сохраняет до 8 команд. Каждая строка в файле САМ содержит 24 бита. 16 битов, определяющих время формирования события, загружаются из регистра HSO_TIME, и 8 битов - из регистра HSO_COMMAND, в котором заданы тип события, генерируется ли прерывание и какой из счетчиков, 1-й или 2-й, является базовым. Все ячейки CAM последовательно, с периодом 16Tcr переводятся в активное состояние на время 2Tcr. HSO сравнивает с помощью компаратора все восемь записей в файле САМ со значением базового счетчика, выбранного мультиплексором. Когда значение базового счетчика совпадает с запрограммированным значением времени, контроллер модуля HSO выполняет заданное в строке действие. Внешние события выдаются на выводы HSO0-HSO5. Внутренние выходные события представляют собой сигналы запуска АЦП (ADC Start), сброса счетчика 2 (T2RST) и сигналы срабатывания до 4 программных временных задержек (SWT0-SWT3). Все эти события устанавливают флаги, которые могут генерировать определенные прерывания. Внешние события вырабатывают прерывание High Speed Output (INT03); внутренние - прерывание Software Timer (INT05). Четыре программных счетчика имеют возможность вырабатывать прерывания в заранее заданное время, при этом модуль HSO устанавливает флаги SWTF0-SWTF3 в 0-3 разряды регистра IOS1. В общем случае программные счетчики используются для вызова подпрограмм обслуживания прерывания, которые должны повторяться с определенными интервалами. Если больше одного программного счетчика срабатывает в пределах одного временного фрагмента, устанавливается несколько разрядов в регистре состояния. Подпрограмма обслуживания прерывания может проверить регистр IOS1, чтобы определить, какой программный счетчик (или счетчики) вызвал прерывание. Программирование модуляТаблица 6.6 показывает регистры, которые влияют на работу и на функции мо-дуля HSO. Таблица 6.6
Содержимое регистров HSO_TIME и HSO_COMMAND вместе описывают каждое событие HSO. Регистр HSO_TIME определяет время выполнения команды HSO. Аббревиатура - HSO_TIME Размер - 2 байта Находится по адресу 05/04H Использовать для записи в окне HWindow 0 Использовать для чтения в окне HWindow 15
Аббревиатура - HSO_COMMAND Размер - 1 байт Находится по адресу 06H Использовать для записи в окне HWindow 0 Использовать для чтения в окне HWindow 15
Биты 0-3 регистра HSO_COMMAND содержат команду, которая определяет, какое событие (или события) HSO будет вызвано в определенное время. Таблица 6.7 описывает коды команд HSO. Бит 4 (HSOINT_ENA) определяет, будет ли событие вызывать прерывание:
Бит 5 (PIN_CMD) определяет, выполняет ли команда CMD_TAG установку или очистку соответствующего вывода (выводов):
Бит 6 (TIMER_SEL) выбирает базовый счетчик для команд HSO:
Бит 7, когда разряд IOC2.6 установлен, управляет сохранением команд в САМ или удалением после выполнения:
Записывая "1" в разряд IOC2.7, удаляем все строки в CAM, как при сбросе МК.
Таблица 6.7
* В этой конфигурации два (или более) вывода устанавливаются или очищаются одновременно.
Примечания: 1. Перед программированием регистров HSO_COMMAND и HSO_TIME необходимо прочитать или IOS0.7, или IOS0.6, чтобы убедиться, что входной регистр HSO пустой. Если IOS0.7 очищен, то входной регистр пуст. Если IOS0.6 очищен, то входной регистр пуст и, по крайней мере, один регистр САМ пуст. Запись в HSO_TIME, когда входной регистр не пустой, вызывает потерю предыдущего значения входного регистра.
Для того, чтобы ввести команду в файл САМ, первым записывается регистр HSO_COMMAND, чтобы описать событие, и затем записывается регистр HSO_TIME, чтобы определить время, когда произойдет событие. При записи в регистр HSO_TIME загружается значение входного регистра HSO. Команда сохраняется во входном регистре до тех пор, пока невозможна запись в файл САМ, при освобождении строки CAM команда переписывается в файл. Может потребоваться 8 временных состояний для перемещения команды из входного регистра в файл САМ. Таким образом, всегда необходимо иметь по крайней мере 8 временных состояний между последовательными записями в регистры HSO_COMMAND и HSO_TIME. В противном случае команда во входном регистре может быть потеряна.
2. Команда во входном регистре не будет выполняться, даже если ee время подошло. Команды для их выполнения должны находиться в файле САМ.
Слово в HSO_TIME может быть или заданным значением счетчика, или величиной смещения относительно текущего значения счетчика. Используйте стандартные команды загрузки, чтобы запрограммировать определенное время, и трехоперандную команду АDD, чтобы определить значение, которое является смещением относительно текущего значения счетчика.
LDB HSO_COMMAND, #what_to_do ; Пересылает команду
ADD HSO_TIME,TIMER1, #when_to_do_it ; Добавляет ADD_3op
Для обеспечения правильной синхронизации минимальное время, которое может быть загружено в счетчик, должно быть равно current_time_value+2. Меньшее значение может быть причиной того, что событие осуществится на 65536 тактов позже, чем требуется. Это ограничение касается обоих счетчиков.
Внимательно программируйте регистры HSO_COMMAND и HSO_TIME. Прерывание может осуществляться после записи команд в HSO_COMMAND и перед записью значения времени в HSO_TIME. Если подпрограмма обработки прерывания также использует эти регистры, команда основной программы в файле САМ перекрывается, поэтому команда основной программы никогда не выполнится. Запрещение прерываний перед записью в модуль HSO решает эту проблему.
Установка бита HSOINT_ENA (HSO_COMMAND.4) разрешает событию HSO генерировать прерывание.
Модуль HSO может генерировать два различных прерывания:
Внешние события вызывают прерывание High-Speed Output, если оно разрешено (INT_MASK.3 установлен).
Биты состояний IOS2.0-IOS2.5 связаны с прерыванием High-Speed Output. Биты состояний
IOS1.0-IOS1.3 используются с прерыванием Software Timer для команд программных таймеров,
а IOS2.6-IOS2.7 - для сброса счетчика 2 и старта A/D преобразователя соответственно.
Когда прерывание произошло, необходимо считать биты в регистрах состояния IOS1 и IOS2,
чтобы определить, какое событие вызвало прерывание. Чтение регистра IOS1 очищает биты 0-5;
чтение регистра IOS2 очищает все биты. По этой причине рекомендуется копировать содержимое
регистров в рабочие регистры и затем выполнять команды тестирования битов, такие как JBC
или JBS, с рабочими регистрами.
Бит LOCK_ENA в регистре IOC2 (IOC2.6) разрешает или запрещает сохранение строки
с командой. Когда этот бит установлен, бит CAM_LOCK (HSO_COMMAND.7) управляет либо сохранением
команд в файле CAM (единичное значение), либо их удалением после выполнения (запись "0").
Сохранение команд обеспечивает возможность программирования периодических или повторяющихся событий. Одним из наиболее полезных применений является использование сохранения команд для генерации повторяющихся импульсов с задаваемой длительностью (PWM) с минимумом программных затрат. Сохранение команды A/D преобразования вызывает многократное выполнение A/D преобразования. Когда счетчик 2 используется как базовый в HSO, сохранение команды T2RST может вырабатывать периодические события; события со значением HSO_TIME меньшим, чем значение времени, при котором значение счетчика 2 сбрасывается, осуществляются повторно с каждым новым сбросом счетчика 2. Сохранение команд программного счетчика может организовать повторяющийся вызов программных задач; подпрограммы обслуживания прерывания могут выполнять задачи без использования других команд программного счетчика модуля HSO.
Три события могут удалить команду из файла CAM:
Чтобы удалить сохраненные события, установите бит CAM_CLR в регистре IOC2 или сбросьте устройство. Любое из этих действий очистит весь файл CAM.
Вы можете отменить внешнее событие, записав противоположное событие с тем же временем в CAM. Например, если команда устанавливает HSO.1, когда TIMER1=1234, то следует записать команду, которая очищает HSO.1, когда TIMER1=1234, тогда HSO.1 не изменится. Однако обе команды остаются в CAM до тех пор, пока или TIMER1 не будет равен 1234 (если сохранение незапрограммировано), или устройство не будет сброшено, или не будет установлен бит CAM_CLR в регистре IOC2.
Вы можете отменить внутреннее событие только установкой бита CAM_CLR (IOC2.7) или сбросом устройства.
|