Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
4-73478
SPeller
2002-03-21 08:06
2002.05.23
Обновление окна. Что при этом происходит ?


14-73375
VCL
2002-04-15 22:12
2002.05.23
Вот...


3-73052
vopros
2002-04-26 12:04
2002.05.23
Как редактировать запрос. База Аксес.


1-73097
Mihan
2002-05-12 15:58
2002.05.23
проблемы с Paramstr(1)


3-73071
Дремучий
2002-04-25 12:25
2002.05.23
Типчики... Создание BLOB поля в Парадоксе через SQL ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский