OSDev Wiki
Регистрация
Advertisement

Программируемый интервальный таймер (Programmable Interval Timer, PIT) — один из компонентов системной платы первых ПК, для совместимости присутствующий и в современных компьютерах (как правило, сейчас он входит в состав южного моста чипсета).

История[]

На первых персональных компьютерах фирма IBM использовала в качестве таймера популярную микросхему Intel 8253 (советский аналог — К580ВИ53) или её улучшенный вариант 8254. Эти кристаллы включали в себя три независимых таймера-счётчика. Нулевой канал использовался для генерации прерываний по линии IRQ0 и назывался системным таймером (System Timer), первый — для генерации запросов на регенерацию динамической оперативной памяти компьютера (Refresh Request Signal), второй — для генерации звука определённой частоты на системном динамике (Speaker Tone).

В современных компьютерах первый канал реального применения не находит: нынешняя оперативная память выполнена на микросхемах псевдостатического ОЗУ (динамическое ОЗУ, схемы регенерации которого входят в состав самих микросхем памяти, из-за чего отпадает необходимость в применении для этих целей внешней логики). Правда, по крайней мере в некоторых чипсетах (например, Intel P45) состояние выхода канала 1 отражается значением бита REF_TOGGLE порта 61h, однако практической пользы от этого нет. Нулевой и второй каналы сохранили своё назначение, хотя в качестве источника прерываний от таймера сейчас можно использовать более современные устройства, например, таймер APIC.

Некоторые компьютеры периода «войны шин» (эпоха микропроцессоров 80386 и 80486) оснащались двумя микросхемами таймеров, что в сумме давало шесть независимых каналов. Однако подобное решение не получило широкого распространения, и все современные ПК включают в свой состав лишь один трёхканальный таймер.

Принципы работы[]

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

На вход канала подаются тактовая частота синхронизации; на ПК она одинакова для всех трёх каналов и равна 1,19318 МГц, что соответствует периоду сигнала около 838 нс. Каждый период синхронизации происходит уменьшение на единицу содержимого внутреннего счётчика канала, начальное значение которого устанавливается программно. По достижении нулевого значения состояние выхода канала меняется в соответствии с запрограммированным режимом работы. На работу канала оказывает влияние внешний сигнал разрешения счёта CE: когда на нём удерживается низкий уровень, счёт в канале не выполняется. На ПК на входы CE всех трёх каналов постоянно подаётся высокий уровень, благодаря чему они работают безостановочно.

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

Всего предусмотрено шесть режимов. В режимах 0 и 4 по достижении нулевого значения счёт останавливается и может быть возобновлён программной загрузкой в канал нового начального значения счётчика. В режимах 1 и 5 счёт начинается заново каждый раз, когда на линии разрешения счёта CE фиксируется переход с низкого (запрещающего) в высокий (разрешающий) уровень, т.е. CE играет роль запускающего импульса. Поскольку на ПК эти линии постоянно подключены к высокому уровню, режимы 1 и 5 использоваться не могут. В режимах 2 и 3 после достижения счётчиком нулевого значения он автоматически загружается последним программно установленным начальным значением, и операция счёта начинается сначала.

В режиме 0 обратный отсчёт начинается после программной записи начального значения счётчика, при этом на выход канала выдаётся низкий уровень. Когда содержимое счётчика станет равным нулю, на выходе канала появится высокий уровень, а счёт остановится до тех пор, пока в счётчик не будет загружено новое значение, причём всё это время на выходе будет удерижваться 1. Если новое значение будет загружено до окончания текущего счёта, он будет запущен заново. Сигнал CE может использоваться для приостановки счёта. Минимально допустимое исходное значение счётчика в этом режиме — 2.

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

В режиме 2 канал работает как делитель частоты. Счётчик непрерывно уменьшает своё значение от исходной величины до нуля, при этом на выходе канала удерживается высокий уровень. Когда содержимое счётчика стало равным нулю, на выходе канала на один период синхронизации устанавливается низкий уровень, после чего счётчик автоматически перезагружается исходным значением, на выходе вновь устанавливается 1 и отсчёт начинается заново. Таким образом, частота синхронизации, подаваемая на вход канала, делится на исходное значение счётчика. Перезагрузка счётчика новым значением во время счёта возымеет действие только со следующего счёта. Положительный перепад на линии CE начинает отсчёт заново. Минимально допустимое начальное значение счётчика равно 2. В ПК режим 2 обычно использовался для первого канала, управлявшего регенерацией динамической памяти.

В режиме 3 счётчик непрерывно уменьшается на 2 каждый такт синхронизации, а при достижении нулевого значения или при переполнении состояние выхода канала меняется на противоположное, и счёт начинается с начала. Таким образом, в режиме 3, как и в режиме 2, исходная частота синхронизации делится на значение счётчика. Разница между ними заключается в том, что в режиме 3 генерируется «квадратный» выходной сигнал: время удержания на выходе канала высокого и низкого уровней будет одинаковым, в то время как в режиме 2 низкий уровень появляется лишь на один период синхронизации, а всё остальное время на выходе присутствует высокий уровень. Минимально допустимое исходное значение счётчика в этом режиме равно 4. В ПК этот режим обычно используется для каналов 0 и 2.

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

Режим 5 подобен режиму 4, однако запуск счётчика выполняется положительным перепадом на линии CE, а не путём программной загрузки нового исходного значения. Загрузка нового значения во время обратного отсчёта не влияет на текущий счёт. Положительный перепад на линии CE во время счёта запускает его с начала. В ПК этот режим использоваться не может.

Программирование[]

Программирование таймера осуществляется через четыре порта. Порты 40h, 41h и 42h предназначены для записи начальных значений счётчиков каналов 0, 1 и 2 соответственно, а также для считывания состояния каналов и текущих значений их счётчиков. Порт 43h доступен только для записи и предназначен для программирования режимов работы каналов. Порты 40h–43h имеют «псевдонимы» в диапазоне 50h–53h.

С примерами программирования таймера можно ознакомиться здесь.

Установка режима[]

Байт, управляющий режимом работы канала, записывается в порт 43h и задаёт режим работы указанного в нём канала. Назначение его разрядов следующее.

Биты Назначение
7:6 Выбор канала:


  • 00 — канал 0
  • 01 — канал 1
  • 10 — канал 2
  • 11 — команда считывания (см. ниже)
5:4 Режим чтения/записи:


  • 00 — команда фиксации текущего содержимого счётчика (см. ниже)
  • 01 — чтение/запись только младшего байта
  • 10 — чтение/запись только старшего байта
  • 11 — чтение/запись сначала младшего, а затем старшего байта
3:1 Режим работы канала:


  • 000 — режим 0
  • 001 — режим 1
  • x10 — режим 2
  • x11 — режим 3
  • 100 — режим 4
  • 101 — режим 5
0 Вид счёта:


  • 0 — двоичный счёт
  • 1 — двоично-десятичный счёт

После установки режима необходимо загрузить в счётчик канала начальное значение. Это выполняется через «личные» порты каналов — 40h–42h. Какие именно байты должны быть загружены, определяется битами 5:4 байта установки режима канала.

Установка начального значения счётчика[]

Установка начального значения счётчика выполняется в любой момент после установки режима. Она заключается в записи одного или двух байт (столько, сколько было указано при установке режима) в «личный» порт канала (40h–42h). Это значение сохраняется во внутреннем регистре канала и может использоваться многократно для перезагрузки счётчика, что используется режимами работы 1—3 и 5. Режимы 0 и 4 требуют программной перезагрузки начального значения после окончания каждой операции счёта.

Команда считывания[]

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

Биты Назначение
7:6 Содержат код команды «считывание» и должны быть равны 11
5 0 — текущие значения выбранных счётчиков фиксируются для последующего считывания

1 — текущие значения выбранных счётчиков не фиксируется

4 0 — состояние выбранных счётчиков фиксируется для последующего считывания

1 — состояние выбранных счётчиков не фиксируется

3 1 — состояние и/или текущее значение счётчика канала 2 должно быть зафиксировано
2 1 — состояние и/или текущее значение счётчика канала 1 должно быть зафиксировано
1 1 — состояние и/или текущее значение счётчика канала 0 должно быть зафиксировано
0 Зарезервирован, должен содержать 0

После того, как текущее значение счётчика и/или состояние зафиксированы, они хранятся в ожидании считывания, которое проводится через «личный» порт канала (40h–42h). Если одновременно зафиксированы и состояние, и значение счётчика, первым считанным байтом будет состояние, а после него последуют один или два байта счётчика (количество байтов совпадает с установленным при программировании режима работы канала). Новая операция считывания возможна только после завершения уже начатой: регистры-защёлки будут хранить зафиксированные в них значения до тех пор, пока все они не будут считаны.

Команда фиксации счётчика[]

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

Биты Назначение
7:6 Выбор канала:


  • 00 — канал 0
  • 01 — канал 1
  • 10 — канал 2
  • 11 — команда считывания (см. выше)
5:4 Задают команду фиксации и должны быть равны 00
3:0 Зарезервированы и должны быть равны 0000

После того, как значение счётчика зафиксировано, оно должно быть прочитано через «личный» порт канала (40h–42h). Количество подлежащих считыванию байтов совпадает с установленным во время программирования режима работы канала. До тех пор, пока зафиксированное значение не будет считано, новые попытки фиксации будут игнорироваться.

Считывание состояния канала[]

Для считывания состояния того или иного канала необходимо записать команду считывания (описана выше) в порт 43h, указав в ней фиксацию состояния для требуемого канала, после чего произвести считывание байта состояния из «личного» порта этого канала (40h–42h). Если одновременно с состоянием фиксируется значение счётчика канала, байт состояния считывается первым. Назначение разрядов байта состояния приведено в таблице.

Биты Назначение
7 Состояние выхода канала
6 Состояние счётчика. Нулевое значение этого бита показывает, что последнее установленное начальное значение было загружено в счётчик, и его текущее значение может быть считано. Единичное значение говорит о том, что последнее установленное начальное значение ещё не загружалось в счётчик, и текущее значение не может быть считано
5:4 Эти разряды равны битам, записанным в порт 43h при установке режима работы данного канала:


  • 00 — команда фиксации
  • 01 — чтение/запись младшего байта
  • 10 — чтение/запись старшего байта
  • 11 — чтение/запись сначала младшего, а потом старшего байта
3:1 Режим работы канала, записанный в эти же биты порта 43h:


  • 000 — режим 0
  • 001 — режим 1
  • x10 — режим 2
  • x11 — режим 3
  • 100 — режим 4
  • 101 — режим 5
0 Вид счёта, записанный в порт 43h при установке режима работы канала:


  • 0 — двоичный
  • 1 — двоично-десятичный

Считывание счётчика[]

Считывание значения счётчика возможно после выдачи в порт 43h команд считывания или фиксации, а также без специальной команды. Само считывание выполняется из «личного» порта канала (40h–42h), причём из него считываются такие же байты (только младший, только старший или сначала младший, а потом старший), какие записываются в него в соответствии с установленным режимом работы канала.

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



Основные источники информации[]

1] Intel 82C54 CHMOS PROGRAMMABLE INTERVAL TIMER 

Файл: pit8254.pdf; зеркало

2] Intel® 82801EB I/O Controller Hub 5 (ICH5) / Intel® 82801ER I/O Controller Hub 5 R (ICH5R) Datasheet

Файл: 25251601.pdf; Зеркало:

3] 82371AB PCI-TO-ISA / IDE XCELERATOR (PIIX4)

Файл: 290562.pdf Зеркало.

Advertisement