[ Главная страница] [ Назад]

Часы реального времени

Основное назначение часов - это непрерывный отсчет времени cуток даже в тот период, когда компьютер выключен, а также извещение процессора о наступлении определенного времени (режим будильника). Часы реального времени реализованы на базе микросхемы типа Motorola МС 146818 (RT/CMOS RAM Chip) и обеспечивают непрерывный отсчет времени при выключении питания на компьютере за счет аккумуляторной батареи. Эта микросхема включает также память, содержимое которой сохраняется при исключении питания. Аппаратура часов реального времени использует только первые 14 байт этой памяти, а остальные предназначены для сохранения конфигурации компьютера. В компьютерах класса XT часы реального времени и память для сохранения конфигурации компьютера отсутствуют.
Часы позволяют генерировать три типа прерываний по линии 0 второго контроллера прерываний (IRQ 8), что соответствует в IBM PC прерыванию 70h:

  1. периодические прерывания с интервалом 976.562 мкс;
  2. прерывание от будильника;
  3. прерывание по окончанию обновления значения часов.

Регистры часов

Как уже говорилось ранее, часы используют первые 14 байт памяти микросхемы типа Motorola MC146818, которые будем в дальнейшем называть регистрами часов. Чтобы считать любой памяти микросхемы, в том числе и данные из регистра часов необходимо выполнить следующие шаги:

  1. записать адрес считываемого регистра в порт 70h;
  2. считать данные регистра из порта 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 имеет следующий формат:
76543210
UIPDVRS

Бит UIP определяет момент обновления показаний часов и может быть установлен в 0 - часы доступны для чтения или - 1 - аппаратура выполняет обновление показаний часов. Для правильного чтения или записи значений часов эти операции необходимо выполнять, когда значение бита UIP равно 0.
Биты DV задают значение частоты для обновления показаний часов. Для правильного функционирования часов данные питы должны быть установлены в значение 010, что соответствует частоте 32.768 Кгц. Это единственная частота, обеспечивающая правильное время в часах.
Биты RS позволяют выбрать делитель выходной частоты. Для правильного функционирования эти биты должны быть усыновлены в значение 0110, что соответствует выходной частоте прямоугольных колебаний 1.024 Кгц и интервалу времени между периодическими прерываниями 976.562 мкс.
Формат регистра состояния 2 приведен ниже:
76543210
UPDPIEAIEUIESQWEDMCFDSE

Бит 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 доступен только по чтению. Он содержит текущий статус прерывания от часов и имеет следующий формат:
76543210
INTPIAIUIРезерв

Бит INT указывает на наличие прерывания (0 - нет прерывания, 1 - выработано прерывание).
Биты PI, АI и UI уточняют тип прерывания, выработанного часами. Единичное значение бита PI указывает, что выработано периодическое прерывание. Аналогично, единичное значение бита AI сигнализирует о генерации прерывания от будильника, а бита UI - прерывания об окончании обновления показаний часов.
Обработчик прерывания по линии IRQ8 должен прочитать регистр состояния 3. Иначе, следующее прерывание не будет выработано.
Регистр состояния 4 доступен только по чтению и имеет следующий формат:
76543210
VRBРезерв

В этом регистре состояния задействован только бит VRB который сигнализирует о состоянии аккумуляторной батареи. Единичное значение говорит о нормальном питании. Нулевое значение указывает, что батарея разряжена и данные в часах недостоверны.

Программирование часов

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

Функции 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.
На выходе: не используются.
Эта функция позволяет сбросить будильник, например, для того чтобы установить его заново на другое время.

Hosted by uCoz