
- •Лабораторная работа
- •Стандартный обработчик прерываний таймера
- •Регистровая организация и режимы работы Микросхемы таймера 8254.
- •Программирование таймеров на уровне портов
- •4. Средства bios для работы с таймером
- •Средства ms-dos для работы с таймером
- •6.Таймер и музыка
- •Генерация случайных чисел
- •Варианты индивидуальных заданий к лабораторной рабо“системный таймер”.
- •Порядок выполнения работы.
- •Содержание отчета.
- •Контрольные вопросы.
- •Литература:
Программирование таймеров на уровне портов
Системному таймеру отведено четыре порта ввода/вывода, имеющих адреса 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);
}