Форум: "Потрепаться";
Текущий архив: 2002.05.23;
Скачать: [xml.tar.bz2];
ВнизЧасы реального времени Найти похожие ветки
← →
1111 (2002-04-16 13:42) [0]Надо запрограммировать будильник часов реального времени и по прерыванию сделать что-либо. Я записываю заданное время в соответствующие регистры CMOS, устанавливаю бит разрешения прерывания от будильника (бит 5 в регистре 0Bh), и перехватываю прерывание 4Ah (IRQ8). Но время переходит через заданное, а обработчик не вызывается.
Если использовать int 1Ah для установки будильника, обработчик прерывания запускается сразу же после запуска программы, а потом комп зависает.
В чем может быть ошибка? (кроме кривых рук :)
Может, обработчик должен считывать какие-то регистры CMOS?
Или надо перепрограммировать контроллер прерываний?
← →
Alexandr (2002-04-16 13:54) [1]ОС какая?
← →
111 (2002-04-16 19:34) [2]MS DOS, разумеется :)
← →
Anatoly Podgoretsky (2002-04-16 19:51) [3]А дельфи причем?
← →
1111 (2002-04-16 20:09) [4]Дельфи не при чем, просто очень хочется получить ответ :)
Тем более, что я заметил, что в "Потрепаться" очень часто обсуждаются темы, связанные с низкоуровневым программированием
И Anatoly Podgoretsky, наверное, есть что сказать по этому поводу.
Заранее спасибо за ответы
← →
Anatoly Podgoretsky (2002-04-16 20:32) [5]Не есть, а было, забыл уже все
← →
111 (2002-04-16 23:00) [6]Может, знатоки ассемблера хоть что-нибудь скажут?
← →
Вася Пупкин (2002-04-17 02:29) [7]> перехватываю прерывание 4Ah (IRQ8) ??? так 4АН или IRQ8 ;)
program test;
uses Dos,crt;
var
IntSave:Pointer;
Flag:Boolean;
Error:boolean;
Hour, Min, Sec: byte;
{$F+,S-W-}
Procedure TimerHandler;interrupt;
begin
Flag:=true;
end;
{$F-,S+}
Begin
asm
mov ah,06h
mov ch,Hour
mov cl,Min
mov dh,Sec
int 1Ah
jc @err
jmp @ok
@err: mov error,1
@ok: clc
end;
GetIntVec($4A,IntSave);
SetIntVec($4A,Addr(TimerHandler));
writeln("Press anykey to exit");
repeat
if Flag then
begin
Flag:=False;
Sound(220);Delay(1000);NoSound;
Writeln("Oops !");
end;
until keypressed;
SetIntVec($4A,IntSave);
asm
mov ah,07h
int 1Ah
end;
end.
← →
Вася Пупкин (2002-04-17 02:32) [8]ps Проверка error не написана сознательно ;)
← →
Вася Пупкин (2002-04-17 03:33) [9]pps Упс... забыл написать (правда, это подразумевается;) ):
Begin
Hour:=...
Min:=...
Sec:=...
// не помню, инициализирует ли ВР глобальные переменные, поэтому лучше написать
Flag:=false; Error:=False;
...
Не забудь, что часы, минуты и секунды надо записывать в упакованном формате BCD, т.е., например, 15 минут: Min:=$15;
При ошибке (error=true) надо сбросить "будильник":
asm
mov ah,07h
int 1Ah
end;
а потом повторить установку.
Уффф... теперь вроде бы всё...
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2002.05.23;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c