Intel 8253 и 8254 - это программируемые интервальные таймеры (PIT), которые выполняют функции хронирования и подсчета с использованием трех 16-битных счетчиков.
Семейство 825x было в первую очередь разработано для процессоров Intel 8080 / 8085, но позже использовалось в x86-совместимых системах. Чипы 825x или эквивалентные схемы, встроенные в более крупный чип, встречаются во всех IBM PC-совместимых, и советских компьютерах, таких как Vector 06C.
В PC-совместимых, таймерный канал 0 назначен на IRQ -0 (аппаратное прерывание с наивысшим приоритетом). Канал таймера 1 назначен на обновление DRAM (по крайней мере, в ранних моделях до 80386). Канал таймера 2 назначен на динамик ПК.
Вариант Intel 82c54 (c для CMOS логики) обрабатывает тактовые сигналы до 10 МГц.
8253 описан в публикации Intel «Каталог данных компонентов» 1980 года. 8254, описанный как расширенный набор 8253 с более высокими тактовыми частотами, имеет "предварительные" данные в "Каталоге данных компонентов" Intel 1982 года.
8254 реализован в HMOS и имеет команду «Обратное считывание», недоступную на 8253, и позволяет чередовать чтение и запись одного и того же счетчика.
Совместимость с современными ПК либо при использовании системы на кристалле процессоры или дискретные наборы микросхем обычно реализуют полную совместимость с 8254 для обратной совместимости и взаимодействия. Команда Read Back является важной функцией ввода-вывода для взаимодействия с многоядерными процессорами и графическими процессорами.
Таймер имеет три счетчика, пронумерованных от 0 до 2. Каждый канал может быть запрограммирован для работы в одном из шести режимов. После программирования каналы работают независимо.
Каждый счетчик имеет два входных контакта - «CLK» (clock вход) и «GATE» - и один контакт «OUT» для вывода данных.. Три счетчика являются 16-битными счетчиками с обратным отсчетом, независимыми друг от друга, и могут быть легко прочитаны CPU..
Режим работы PIT изменяется установкой вышеуказанных аппаратных сигналов. Например, для записи в регистр управляющего слова необходимо установить CS = 0, RD = 1, WR = 0, A1 = A0 = 1.
Чтобы инициализировать счетчики, микропроцессор должен записать управляющее слово (CW) в этот регистр. Это можно сделать, установив правильные значения для контактов блока логики чтения / записи, а затем отправив управляющее слово в блок буфера данных / шины.
Регистр управляющего слова содержит 8 битов, помеченных как D7..D0 (D7 - это MSB ). Расшифровка несколько сложная. Большинство значений задают параметры для одного из трех счетчиков:
Однако есть две другие формы:
Бит № / Имя | Краткое описание | |||||||
---|---|---|---|---|---|---|---|---|
D7. SC1 | D6. SC2 | D5. RW1 | D4. RW0 | D3. M2 | D2. M1 | D1. M0 | D0. BCD | |
0 | 0 | формат | режим | BCD | Установить режим счетчика 0 | |||
0 | 1 | формат | режим | BCD | Установить режим счетчика 1 | |||
1 | 0 | формат | режим | BCD | Установить режим счетчика 2 (порт 42h) | |||
1 | 1 | count | status | C2 | C1 | C0 | x | Read- команда возврата (только 8254) |
счетчик | 0 | 0 | - x - | Значение счетчика фиксации. При следующем чтении счетчика будет прочитан снимок значения. | ||||
счетчик | 0 | 1 | режим | BCD | Чтение / запись только младшего байта значения счетчика | |||
режим счетчика | 1 | 0 | BCD | Чтение / запись только старшего байта значения счетчика | ||||
режим счетчика | 1 | 1 | BCD | 2 × Чтение / 2x Запись младшего байта, затем старшего байта значения счетчика | ||||
counter | формат | 0 | 0 | 0 | BCD | Режим 0: прерывание по счетчику терминала | ||
формат | 0 | 0 | 1 | BCD | Режим 1: аппаратный перезапуск. Счетчик кадров | |||
формат | x | 1 | 0 | BCD | Режим 2: Генератор скорости | |||
счетчик | формат | x | 1 | 1 | BCD | Режим 3 : Прямоугольный сигнал | ||
счетчик | формат | 1 | 0 | 0 | BCD | Режим 4: запускаемый программный строб | ||
счетчик | формат | 1 | 0 | 1 | BCD | Режим 5: запускаемый аппаратно строб (с возможностью повторного запуска) | ||
счетчик | формат | режим | 0 | Счетчик - это 16-битный двоичный счетчик (0–65535) | ||||
счетчик | формат | режим | 1 | Счетчик представляет собой 4-значное двоично-десятичное счетчик (0–9999) | ||||
1 | 1 | счет | статус | C2 | C1 | C0 | x | Команда обратного чтения (только 8254) |
1 | 1 | 0 | 0 | C2 | C1 | C0 | x | При следующем чтении выбранных счетчиков будет произведено обратное чтение состояние с фиксацией, затем счетчик |
1 | 1 | 0 | 1 | C2 | C1 | C0 | x | Следующее считывание выбранных счетчиков будет считывать счетчик с фиксацией |
1 | 1 | 1 | 0 | C2 | C1 | C0 | x | При следующем чтении выбранных счетчиков будет считываться состояние обратной фиксации |
1 | 1 | 1 | 1 | C2 | C1 | C0 | x | Ничего не делать (ничего не фиксировать на одном или всех счетчиках) |
1 | 1 | count | status | 0 | 0 | 0 | x | Ничего не делать (количество защелок и / или состояние без счетчиков) |
1 | 1 | count | status | 1 | C1 | C0 | x | Команда обратного чтения применяется к счетчику 2 |
1 | 1 | count | status | C2 | 1 | C0 | x | Команда обратного чтения применяется к счетчику 1 |
1 | 1 | count | status | C2 | C1 | 1 | x | Команда обратного чтения применяется к счетчику 0 |
При установке PIT микропроцессор сначала отправляет управляющее сообщение, а затем сообщение счетчика в ПИТ. Процесс подсчета начнется после того, как PIT получит эти сообщения, и, в некоторых случаях, если он обнаружит нарастающий фронт входного сигнала GATE. Формат байта состояния. Бит 7 позволяет программному обеспечению отслеживать текущее состояние вывода OUT. Бит 6 указывает, когда счет может быть прочитан; когда этот бит равен 1, счетный элемент еще не загружен и не может быть считан процессором. Биты с 5 по 0 совпадают с последними битами, записанными в регистр управления.
Номер бита / Имя | Краткое описание | |||||||
---|---|---|---|---|---|---|---|---|
D7. Выход. Состояние | D6. ноль. количество | D5. RW1 | D4. RW0 | D3. M2 | D2. M1 | D1. M0 | D0. BCD | |
0 | Выходной контакт равен 0 | |||||||
1 | Выходной контакт равен 1 | |||||||
0 | Счетчик может быть прочитан | |||||||
1 | Счетчик устанавливается | |||||||
формат | режим | BCD | Биты режима счетчика, определенные для регистра управляющего слова |
Биты D3, D2 и D1 управляющего слова устанавливают режим работы таймера. Всего есть 6 режимов; для режимов 2 и 3 бит D3 игнорируется, поэтому отсутствующие режимы 6 и 7 являются псевдонимами для режимов 2 и 3.
Все режимы чувствительны к входу GATE, высокий уровень GATE вызывает нормальную работу, но эффекты низкого уровня GATE зависят от режима:
Режим 0 используется для генерации точной временной задержки под управлением программного обеспечения. В этом режиме счетчик начнет отсчет от загруженного в него начального значения COUNT, вплоть до 0. Скорость счета равна входной тактовой частоте.
На выводе OUT устанавливается низкий уровень после записи управляющего слова, и отсчет начинается через один такт после программирования COUNT. OUT остается на низком уровне, пока счетчик не достигнет 0, после чего OUT будет установлен на высоком уровне до тех пор, пока счетчик не будет перезагружен или не будет записано управляющее слово. Счетчик внутренне возвращается к 0xFFFF
и продолжает считать, но вывод OUT больше никогда не меняется. Для нормального счета сигнал Gate должен оставаться активным на высоком уровне. Если Gate становится низким, счет приостанавливается и возобновляется, когда он снова становится высоким.
Первый байт нового счетчика при загрузке в счетный регистр останавливает предыдущий счет.
В этом режиме 8253 может использоваться как моностабильный мультивибратор. Вход GATE используется как вход триггера.
OUT изначально будет высоким. OUT перейдет на низкий уровень тактового импульса после запуска однократного импульса и останется на низком уровне, пока счетчик не достигнет нуля. После этого OUT станет высоким и останется высоким до импульса CLK после следующего запуска.
После записи контрольного слова и начального счета счетчик активируется. Триггер приводит к загрузке счетчика и установке низкого уровня OUT для следующего импульса CLK, таким образом, запускается одноразовый импульс. Начальный счет N приведет к одноразовому импульсу длительностью N CLK циклов.
Одноразовый запуск можно перезапустить, поэтому OUT будет оставаться на низком уровне для N импульсов CLK после любого запуска. Одноразовый импульс можно повторить, не перезаписывая тот же счетчик в счетчике. GATE не влияет на OUT. Если новый счетчик записывается в счетчик во время однократного импульса, текущий однократный импульс не изменяется, если счетчик не запускается повторно. В этом случае в счетчик загружается новый счетчик, и импульс единичного импульса продолжается, пока не истечет новый счет.
В этом режиме устройство действует как счетчик деления на n, который обычно используется для генерации прерывания часов реального времени.
Как и в других режимах, процесс подсчета запускает следующий тактовый цикл после отправки COUNT. OUT будет оставаться на высоком уровне до тех пор, пока счетчик не достигнет 1, и станет низким на один тактовый импульс. В следующем цикле счетчик перезагружается, OUT снова становится высоким, и весь процесс повторяется.
Время между высокими импульсами зависит от предварительно установленного счетчика в регистре счетчика и рассчитывается по следующей формуле:
Значение для загрузки в счетчик =
Обратите внимание, что значения в регистре COUNT варьируются от до 1; регистр никогда не достигает нуля.
Этот режим аналогичен режиму 2. Однако длительность высоких и низких тактовых импульсов на выходе будет отличаться от режима 2.
Предположим, что - это число, загруженное в счетчик (сообщение COUNT), выход будет высоким для counts, а low для считает. Таким образом, период будет равен counts, и если нечетный, дополнительный полупериод будет потрачен с ВЫСОКИМ ВЫСОКИМ.
После загрузки управляющего слова и COUNT выходной сигнал будет оставаться высоким до тех пор, пока счетчик не достигнет нуля. Затем счетчик будет генерировать низкий импульс для 1 тактового цикла (строб) - после этого выход снова станет высоким.
GATE low приостанавливает счет, который возобновляется, когда GATE снова становится высоким.
Этот режим аналогичен режиму 4. Однако процесс подсчета запускается входом GATE.
После получения контрольного слова и COUNT на выходе будет установлен высокий уровень. Как только устройство обнаружит нарастающий фронт на входе GATE, оно начнет отсчет. Когда счетчик достигнет 0, на выходе будет низкий уровень на один такт - после этого он снова станет высоким, чтобы повторить цикл на следующем нарастающем фронте GATE.
8253 использовался в совместимых с IBM PC с момента их появления в 1981 году. В наше время этот PIT не включается в качестве отдельного чипа в ПК x86. Скорее, его функциональные возможности включены как часть южного моста набора микросхем материнской платы. В современном наборе микросхем это изменение может проявляться в виде заметно более быстрого доступа к регистрам PIT в пространстве x86 адреса ввода-вывода.
Все совместимые с ПК работают с PIT с тактовой частотой 105/88 = 1,19318 МГц, ⁄ 3 частотой NTSC цветовой синхронизации. Эта частота, разделенная на 2 (самый большой делитель, на который способен 8253), дает прерывание таймера ≈18,2 Гц, используемое в MS-DOS и связанных операционных системах.
В исходных компьютерах IBM PC счетчик 0 используется для генерации прерывания хронометража. Счетчик 1 (A1 = 0, A0 = 1) используется для запуска обновления памяти DRAM. Последний счетчик (A1 = 1, A0 = 0) используется для генерации тонов через динамик ПК.
Более новые материнские платы включают дополнительные счетчики через Advanced Configuration and Power Interface (ACPI), a счетчик на расширенном локальном программируемом контроллере прерываний (Local APIC ) и таймер событий высокой точности. Сам ЦП также обеспечивает функцию счетчика отметок времени (TSC).
На ПК адрес timer0 (чип) находится на порте 40h..43h, а второй timer1 (чип) находится на 50h..53h.
На компьютерах x86 BIOS многих видеокарт и системный BIOS перепрограммируют второй счетчик для собственного использования. Перепрограммирование обычно происходит во время изменений видеорежима, когда может быть запущена видео BIOS, и во время изменения режима управления системой и состояния энергосбережения, когда может быть запущена системная BIOS. Это предотвращает любые серьезные альтернативные варианты использования второго счетчика таймера во многих системах x86.
Таймер, который используется системой на ПК x86, - это канал 0, и его часы отсчитывают теоретическое значение 1193181,8181... Гц, то есть одну треть от NTSC цвет частота поднесущей, которая получается из деления системных часов (14,31818 МГц) на 12. Это пережиток самых первых ПК CGA - они получили все необходимые частоты от единственного кварцевого кристалла , и чтобы сделать ТВ-вывод возможным, этот генератор должен был работать на частоте, кратной частоте цветовой поднесущей NTSC.
Как указано выше, канал 0 реализован как счетчик. Как правило, начальное значение счетчика устанавливается путем отправки байтов в Control, затем регистры порта ввода-вывода данных (значение 36h отправляется на порт 43h, затем младший байт на порт 40h и снова порт 40h для старшего байта). Счетчик ведет обратный отсчет до нуля, затем отправляет аппаратное прерывание (IRQ 0, INT 8) на CPU. Затем счетчик сбрасывается до исходного значения и снова начинает обратный отсчет. Максимально возможная частота прерывания составляет чуть более половины мегагерца. Наименьшая возможная частота, которая также обычно используется компьютерами под управлением MS-DOS или совместимых операционных систем, составляет около 18,2 Гц. В этих операционных системах реального режима BIOS накапливает количество вызовов INT 8, которые он получает по адресу 0040: 006c реального режима, который может быть прочитан программой.
По мере обратного отсчета таймера его значение также можно прочитать напрямую, дважды прочитав его порт ввода-вывода, сначала для младшего байта, а затем для старшего байта. Однако в автономных счетных приложениях, таких как ПК x86, необходимо сначала записать команду latch для желаемого канала в регистр управления, чтобы оба считанных байта принадлежали одному, а такое же значение.
Согласно документу Microsoft 2002 года, «поскольку для чтения и записи на это оборудование [8254] требуется связь через порт ввода-вывода, программирование занимает несколько циклов, что непомерно дорого для ОС. Из-за этого, на практике апериодические функции не используются. "