[ Главная страница] [ Назад]
Часы реального времени
Основное назначение часов - это непрерывный отсчет времени cуток даже в тот период, когда компьютер выключен, а также извещение процессора о наступлении определенного времени (режим будильника). Часы реального времени реализованы на базе микросхемы типа Motorola МС 146818 (RT/CMOS RAM Chip) и обеспечивают непрерывный отсчет времени при выключении питания на компьютере за счет аккумуляторной батареи. Эта микросхема включает также память, содержимое которой сохраняется при исключении питания. Аппаратура часов реального времени использует только первые 14 байт этой памяти, а остальные предназначены для сохранения конфигурации компьютера. В компьютерах класса XT часы реального времени и память для сохранения конфигурации компьютера отсутствуют.
Часы позволяют генерировать три типа прерываний по линии 0 второго контроллера прерываний (IRQ 8), что соответствует в IBM PC прерыванию 70h:
- периодические прерывания с интервалом 976.562 мкс;
- прерывание от будильника;
- прерывание по окончанию обновления значения часов.
Регистры часов
Как уже говорилось ранее, часы используют первые 14 байт памяти микросхемы типа Motorola MC146818, которые будем в дальнейшем называть регистрами часов. Чтобы считать любой памяти микросхемы, в том числе и данные из регистра часов необходимо выполнить следующие шаги:
- записать адрес считываемого регистра в порт 70h;
- считать данные регистра из порта 71h.
Например, следующие команды используются для чтения регистра 0 часов реального времени:
mov al,0 ; Записать адрес регистра
out 70h,al
jmp short $+2
in al,71h ; Считать регистр
Аналогично, для записи значения в регистр часов требуется занести адрес модифицируемого регистра в порт 70h, после чего вывести в порт 71h записываемое значение. Например:
mov al,0 ; Записать адрес регистра
out 70h,al
jmp short $+2
mov al,20h ; Занести новое значение
out 71h,al
Следует отметить, что чтение и запись данных порта 71h должны выполняться немедленно после записи номера регистра в порт 70h. Кроме того, в процессе операций ввода-вывода с регистрами часов должны быть запрещены прерывания, что позволит избежать модификации порта 70h процедурой обработки прерывания до чтения или записи данных.
Адресация регистров часов приведена в таблице:
Адрес регистра | Назначение регистра |
00h | Секунды |
01h | Секунды для будильника |
02h | Минуты |
03h | Минуты для будильника |
04h | Часы |
05h | Часы для будильника |
06h | День недели |
07h | Дата |
08h | Месяц |
09h | Год |
0Ah | Регистр состояния 1 |
0Bh | Регистр состояния 2 |
0Ch | Регистр состояния 3 |
0Dh | Регистр состояния 4 |
32h | Столетие |
Регистры времени 00h-09h и 32h содержат время в двоично-десятичном формате (например, дата 26 хранится в виде 26h). Столетие задастся в виде первых двух цифр полного номера года (например, 19h). На машинах PS/2 байт столетия расположен по адресу 37h.
Регистр состояния 1 имеет следующий формат:
Бит UIP определяет момент обновления показаний часов и может быть установлен в 0 - часы доступны для чтения или - 1 - аппаратура выполняет обновление показаний часов. Для правильного чтения или записи значений часов эти операции необходимо выполнять, когда значение бита UIP равно 0.
Биты DV задают значение частоты для обновления показаний часов. Для правильного функционирования часов данные питы должны быть установлены в значение 010, что соответствует частоте 32.768 Кгц. Это единственная частота, обеспечивающая правильное время в часах.
Биты RS позволяют выбрать делитель выходной частоты. Для правильного функционирования эти биты должны быть усыновлены в значение 0110, что соответствует выходной частоте прямоугольных колебаний 1.024 Кгц и интервалу времени между периодическими прерываниями 976.562 мкс.
Формат регистра состояния 2 приведен ниже:7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
UPD | PIE | AIE | UIE | SQWE | DM | CF | DSE |
Бит UPD используется для обновления показания часов. Когда он устанавливается в 1, внутренний цикл обновления часов прекращается, и программа может инициализировать любой регистр часов. Для запуска часов надо установить этот бит в 0.
Бит PIE управляет генерацией периодических прерываний t интервалом 976.562 мкс. Когда он установлен в 0, прерывания запрещены. При установке этого бита в 1, периодические прерывания разрешены.
Аналогично, бит AIE задает, разрешены ли прерывания от будильника, а бит UIE разрешает или запрещает прерывания при завершении цикла обновления показаний часов.
Бит SQWE разрешает или запрещает генерацию прямоугольных колебаний (см. биты RS в регистре состояния 1). Функция генерации прямоугольных колебаний не используется в компьютере и бит устанавливается в 0.
DM определяет формат времени и даты. Если этот бит установлен в 0, то используется двоично-десятичный формат. При единичном значении бита данные представляются в двоичном виде. Для IBM PC этот бит установлен в 0.
Бит CF задаст формат представления времени. Значение О указывает, что используется 12-ти часовой формат, а значение 1 - 24-х часовой формат. В компьютерах IBM PC используется 24-х часовой формат.
Бит DSE установлен в 1, если в часы заносится летнее время и программы, пользующиеся показаниями часов, осуществляют пересчет времени. Обычно эта функция не используется, и бит установлен в 0.
Регистр состояния 3 доступен только по чтению. Он содержит текущий статус прерывания от часов и имеет следующий формат:
Бит INT указывает на наличие прерывания (0 - нет прерывания, 1 - выработано прерывание).
Биты PI, АI и UI уточняют тип прерывания, выработанного часами. Единичное значение бита PI указывает, что выработано периодическое прерывание. Аналогично, единичное значение бита AI сигнализирует о генерации прерывания от будильника, а бита UI - прерывания об окончании обновления показаний часов.
Обработчик прерывания по линии IRQ8 должен прочитать регистр состояния 3. Иначе, следующее прерывание не будет выработано.
Регистр состояния 4 доступен только по чтению и имеет следующий формат:
В этом регистре состояния задействован только бит VRB который сигнализирует о состоянии аккумуляторной батареи. Единичное значение говорит о нормальном питании. Нулевое значение указывает, что батарея разряжена и данные в часах недостоверны.Программирование часов
Помимо чтения текущего времени с помощью часов можно выполнять функции отсчета времени, используя периодическое прерывание, или получать управление в заранее определенное время, используя функцию будильника. Следует отметить, что все эти функции поддерживаются средствами BIOS. Поэтому, как правило, непосредственного программирования часов не требуется. Остановимся только на общих принципах программирования часов реального времени:
-
самая простая функция часов - это установка и чтение времени. Чтение времени необходимо производить только между интервалами обновления часов, т.е. когда бит UIP в регистре состояния 1 равен 0. Установку времени и даты лучше выполнять, запретив сначала работу часов, т. с. установив в регистре состояния 2 единичное значение бита UPD . При этом часы останавливаются. После этого можно загрузить все значения в часы и выполнить в необходимый момент их пуск, установив бит UPD в нулевое значение. Следует отметить, что Стандартные функции BIOS не позволяют установить значение в поле «день недели». Поэтому, обычно, это значение часов недостоверно;
- функция будильника позволяет вырабатывать прерывание при совпадении значений часов и будильника. Запись значения будильника можно производить только между интервалами обновления часов, т. е. когда бит UIP в регистре состояния 1 равен 0. Для получения прерывания от будильника необходимо разрешить генерацию этого , прерывания, установив единичное значение бита AIE в регистре состояния 2. При возникновении этого прерывания устанавливается в единичное значение бит AI регистра состояния 3;
- средства часов реального времени позволяют генерировать периодические прерывания с интервалом 976.562 мкс. Для разрешения этого прерывания необходимо установить в 1 бит PIE регистра состояния 2. При возникновении прерывания устанавливается в единичное значение бит PI в регистре состояния 3;
- прерывание по окончании цикла обновления часов вырабатывается каждую секунду при продвижении значения часов. Обычно это прерывание не используется для программирования. Для разрешения этого прерывания необходимо установить бит UIE регистра состояния 2 в единичное значение. При возникновении прерывания устанавливается в единичное значение бит UI регистра состояния 3.
Функции BIOS: Прочитать показания часов реального времени
На входе: AH = 02h.
На выходе: CH = часы в BCD-формате (например,13h означает 13 часов);
CL = минуты в BCD-формате;
DH = секунды в BCD-формате;
CF = CY = 1, если часы реального времени не установлены.
Установить часы реального времени
На входе: AH = 03h;
CH = часы в BCD-формате (например,13h означает 13 часов);
CL = минуты в BCD-формате;
DH = секунды в BCD-формате;
DL = 1, если необходимо использовать летнее время
На выходе: не используются.
Прочитать дату из часов реального времени
На входе: AH = 04h.
На выходе: CH = столетие в BCD-формате ;
CL = год в BCD-формате (например, CX=1991h означает 1991 год);
DH = месяц в BCD-формате;
DL = число в BCD-формате;
CF = CY = 1, если часы реального времени не установлены.
Установить дату в часах реального времени
На входе: AH = 05h;
CH = столетие в BCD-формате ;
CL = год в BCD-формате (например, CX=1991h означает 1991 год);
DH = месяц в BCD-формате;
DL = число в BCD-формате;
На выходе: не используются.
Установить будильник
На входе: AH = 06h;
CH = часы в BCD-формате;
CL = минуты в BCD-формате;
DH = секунды в BCD-формате.
На выходе: CF = CY = 1, если часы реального времени не установлены.
Эта функция позволяет установить будильник на заданное время. Когда будильник "зазвенит", будет вызвано прерывание INT 4Ah (это прерывание вызывают модули BIOS после прихода аппаратного прерывания от часов реального времени IRQ8, т.е. прерывания с номером 70h). Программа, использующая функцию будильника, должна подготовить обработчик прерывания INT 4Ah, завершающий свою работу выполнением команды IRET.
Программа может установить только один будильник.
Сброс будильника
На входе: AH = 07h.
На выходе: не используются.
Эта функция позволяет сбросить будильник, например, для того чтобы установить его заново на другое время.