Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
сист. таймер.rtf
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
242.21 Кб
Скачать
  1. Программирование таймеров на уровне портов

Системному таймеру отведено четыре порта ввода/вывода, имеющих адреса 40h, 41h, 42h, 43h,. Эти порты задействованы слудующим образом:

043h - управляющий регистр

040h - канал 0 или счетчик 0 - системные часы (генерация IRQ 0 каждые 54,936 мс=18,206Гц), режим 3, LSB/MSB, Binary, счетчик = 0 (соответствует 65536).

041h - канал 1 или счетчик 1 - регенерация памяти (логика регенерации для АТ). Режим 2, LSB, Binary, счетчик = 12h(18).

042h - канал 2 или счетчик 2 - генератор звука. Вход GATE от бита 0 порта В і8255 (XT) (061h). Режим 3, LSB/MSB, Binary.

Формат управляющего регистра:

7 6 5 4 3 2 1 0

SC RW M BCD

где:

поле SC, биты 7-6 выбор счетчика 0, 1 ,2:

00 - канал 0 (счетчик 0);

01 - канал 1 (счетчик 1);

10 - канал 2 (счетчик 2);

11 - код команды RBC (чтение состояния счетчика).

поле RW , биты 5-4 режим обращения:

00 - код команды CLC (заполнить CE или защелка текущего значения);

01 - чтение/запись только младшего байта (LSB);

10 - чтение/запись только старшего байта (MSB);

11 - LSB/MSB, чтение/запись сначала младшего, затем старшего байта.

поле М, биты 3-1 определяет режим работы микросхемы і8254 (режим счетчика):

000 - прерывание от таймера (режим 0);

001 - программируемый ждущий мультивибратор (одновибратор), (режим 1);

х10 - программируемый генератор импульсов (частоты), (режим 2);

x11 – генератор меандра (генератор прямоугольных импульсов), (режим 3);

100 - программно-запускаемый одновибратор (счетчик событий с разрешением), (режим 4);

101 - аппаратно-запускаемый одновибратор (счетчик событий с перезапуском), (режим 5).

поле BCD, бит 0 вид счета:

0 - двоичный счет (Bin);

1 - двоично-десятичный счет (BCD).

Поскольку в компьютере в каналах 0 и 2 используется режим 3 , рассмотрим его подробнее.

Поле RW, как отмечалось, определяет способ загрузки констант через однобайтный порт. Если в этом поле задано значение 00, это управляющее слово будет использоваться для фиксации текущего содержимого регистра счетчика CE (рис.2) в буферном регистре OL с целью чтения его программой.

Код команды CLC - фиксация регистров. Код канала, для которого будет выполняться фиксация, должен быть указан в поле SC (биты 7,6), поля М и BCD при этом не используются. Поле SC определяет номер канала, для которого предназначено управляющее слово.

Формат команды RBC (чтения слова состояния канала):

7 6 5 4 3 2 1 0

биты:

0 = 0

1 = 1 - выбор канала 0

2 = 1 - выбор канала 1

3 = 1 - выбор канала 2

STAT: 0 - читать состояние каналов;

1 - не читать состояние каналов;

CNT: 0 - запомнить текущее содержи-

мое СЕ;

1 - не запомнить ---- // ----;

код команды RBC = 11

С помощью команды RBC можно выполнять операции чтения состояния каналов либо запоминание регистра счетчика СЕ каналов. Можно выполнять эти операции как для отдельных каналов, так и для всех одновременно (установка битов 1-3 в 1).

Формат слова состояния канала напоминает формат регистра управляющего слова, исключая два старших разряда 7 и 6.

7 6 5 4 3 2 1 0

BCD: 0 - двоичный счет;

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

счет;

поле М

поле RW

FN: флаг перезагрузки констант;

OUT: состояние выхода OUT

Разряд FN используется в основном в режимах 1 и 5 для определения, произошла ли загрузка констант из регистра CR в регистр счетчика СЕ.

Разряд OUT позволяет определить состояние выходной линии канала OUT в момент выполнения команды RBC.

Для программирования канала таймера необходимо выполнить следующую последовательность действий:

  • вывести в порт управляющего регистра с адресом 43h управляющее слово;

  • требуемое значение счетчика посылается в порт канала (адреса 40 h, 41h, 42h), причем вначале вводится младший, а затем старший байт значения счетчика.

Сразу после этого канал таймера начинает выполнять требуемую функцию.

Для чтения текущего содержимого счетчика СЕ необходимо выполнить следующее:

  • вывести в порт управляющего регистра код команды CLC (команда запоминания содержимого регистра СЕ);

  • вывести в порт управляющего регистра код команды запуска на чтение/запись в регистры канала (поле RW должно содержать 11);

  • двумя последовательными командами ввода из порта нужного канала ввести младший и старший байты текущего состояния счетчика СЕ.

Пример: Программа, отображающая слово состояния и содержимое счетчика для всех трех каналов таймера:

# include <stdio.h>

# include <conio.h>

main ( ) {

unsigned i;

printf (“\n\n канал 0

\n -----------”

\n”);

// читаем слово состояния канала,

// команда 0хе2=1100010В

outp (0x43, 0xe2);

printf (“\ n Слово состояния канала: % 02.2Х”,

inp (0x40));

// читаем текущее состояние регистра счетчика

// канала. Для этого вначале выдаем команду CLC

// для канала 0. Код этой команды 0х00

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 Слово состояния канала: %2.2Х”, inp(0x41));

outp (0x43,0x40);

i=inp (0x41);

i=(inp(0x41)<<8)+i;

printf (“\n Регистр счетчика: %4.4Х”, i);

printf (“\n\n Канал 2

\n-------------”);

outp (0x43,xe8);

printf (“\n Слово состояния канала : % 02.2х”, inp (0x42));

outp (0x43,0x80);

i=inp (0x42);

i=(inp(0x42)<<8)+i;

printf (“\n Регитр счетчика: %4.4x”,i);

exit (o);

}