Программирование таймера на уровне портов
Для чего вам может понадобиться перепрограммирование каналов таймера? Если вам надо повысить точность измерения времени, выполняемого с помощью канала 0 таймера, вы можете увеличить частоту генерируемых этим каналом импульсов (стандартно 18,2 Гц). По окончании измерений режим работы канала необходимо восстановить для правильной работы системы. Канал 2, подключенный к громкоговорителю, вы можете использовать для генерации различных звуков или музыки, о чем мы расскажем немного позже. Этот же канал пригодится и для генерации случайных чисел. Таймеру соответствуют четыре порта ввода/вывода со следующими адресами: · 40h - канал 0; · 41h - канал 1; · 42h - канал 2; · 43h - управляющий регистр Формат управляющего регистра Приведем формат управляющего регистра:
Поле BCD определяет формат константы, использующейся для счета - двоичный или двоично-десятичный. В двоично-десятичном режиме константа задается в диапазоне 1-9999. Поле M определяет режимы работы таймера: · 0 - прерывание от таймера; · 1 - программируемый ждущий мультивибратор; · 2 - программируемый генератор импульсов; · 3 - генератор меандра; · 4 - программно-запускаемый одновибратор; · 5 - аппаратно-запускаемый одновибратор Мы будем рассматривать только режим 3, так как именно он используется в каналах 0 и 2. Поле RW определяет способ загрузки констант через однобайтовый порт. Если в этом поле задано значение 00, это управляющее слово будет использоваться для фиксации текущего содержимого регистров счетчика CE в буферном регистре OL с целью чтения программой. Это код команды CLC - фиксация регистров. Код канала, для которого будет выполняться фиксация, должен быть указан в поле SC. Поля M и BCD при этом не используются. Поле SC определяет номер канала, для которого предназначено управляющее слово. Если в этом поле задано значение 11, будет выполняться чтение состояния канала. Формат команды чтения слова состояния канала С помощью команды чтения слова состояния канала вы можете выполнять операции чтения состояния каналов либо запоминание регистра счетчика CE каналов. Можно выполнять эти операции как для отдельных каналов, так и для всех каналов одновременно . Приведем формат команды RBC чтения слова состояния канала:
Формат слова состояния канала Формат слова состояния канала напоминает формат регистра управляющего слова, за исключением двух старших разрядов 7 и 6:
Разряд FN используется, в основном, в режимах 1 и 5 для определения, произошла ли загрузка константы из регистра CR в регистр счетчика CE. Разряд OUT позволяет определить состояние выходной линии канала OUT в момент выполнения команды RBC. Последовательность действий Для программирования канала таймера необходимо выполнить следующую последовательность действий: · вывести в порт управляющего регистра с адресом 43h управляющее слово; · требуемое значение счетчика посылается в порт канала (адреса 40h-42h), причем вначале выводится младший, а затем старший байты значения счетчика. Сразу после этого канал таймера начнет выполнять требуемую функцию. Для чтения текущего содержимого счетчика CE необходимо выполнить следующее: · вывести в порт управляющего регистра код команды CLC (команда запоминания содержимого регистра CE); · вывести в порт управляющего регистра код команды запроса на чтение/запись в регистры канала (поле RW должно содержать 11); · двумя последовательными командами ввода из порта нужного канала ввести младший и старший байты текущего сосотояния счетчика CE. Программа TIMERST Приведем исходный текст программы TIMERST, отображающей слово состояния и содержимое счетчика для всех трех каналов таймера (листинг 1.1). Листинг 1.1. Файл timerst\timerst.с #include <stdio.h> #include <conio.h> Int main() { unsigned i; printf("\n\nКанал 0\n-------\n"); // Читаем слово состояния канала, // команда 0xe2 = 11100010B outp(0x43, 0xe2); printf("\nСлово состояния канала: %02.2X", inp(0x40)); // Читаем текущее состояние регистра счетчика // канала. Для этого вначале выдаем команду CLC // для канала 0. Код этой команды - 0x00 outp(0x43, 0x00); // Вводим младший и старший байты счетчика // и отображаем его. i = inp(0x40); i = (inp(0x40) << 8) + i; printf("\nРегистр счетчика: %04.4X",i); // Повторяем те же действия для 1 и 2 каналов. printf("\n\nКанал 1\n-------\n"); outp(0x43, 0xe4); printf("\nСлово состояния канала: %02.2X",inp(0x41)); outp(0x43, 0x40); i = inp(0x41); i = (inp(0x41) << 8) + i; printf("\nРегистр счетчика: %04.4X",i); printf("\n\nКанал 2\n-------\n"); outp(0x43, 0xe8); printf("\nСлово состояния канала: %02.2X",inp(0x42)); outp(0x43, 0x80); i = inp(0x42); i = (inp(0x42) << 8) + i; printf("\nРегистр счетчика: %04.4X",i); return 0; }
4 Задание 1 Определить отображающее слово состояния и содержимое счетчика для всех трех каналов таймера.
5 Контрольные вопросы 1 Микросхемы таймера 8253 и 8254. 2 Режимы работы таймера. 3 Каналы таймера.
Популярное: Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе... Почему стероиды повышают давление?: Основных причин три... Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (467)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |