Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2014, 19:20   #1
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
Смущение Звуковой сигнал

Добрый день!
Не по глазам... Звуковой сигнал, который срабатывает через определенное время прерывается в любом случае через 9 секунд. Что я упустил из вида.

В процедуру передается два параметра: timer (например 1 сек.) и bud (например 30 сек.)

Код:
{$M $1000, 0, 0}
Program Budilnick;
 
Uses Crt, Dos;
 
Const
     takt = 20;
     tik = 0.5;      { Длительность звуового сигнала - "ТИКАНЬЯ" = 0.5 доли секунды }
     timePisk = 20;  { Время "писка" }
 
Var     Key            : Procedure;
        pisk           : Boolean;
        code1, code2   : Integer;
          t, b           : String;
          time, sec, timer     : Integer;
        bud            : Real;
 
{$F+}
Procedure Budiln;
Interrupt;
Begin
     time := time + 1;
     if time > takt then
     Begin
          time := 0;
          sec := (sec + 1);
          writeln(' - ', sec, ' сек. - ');
          if pisk = false then
          Begin
               if (sec mod timer) = 0 then
                  sound(2000);
               if (sec - bud) = 0 then
               Begin
                    write('Включение будильника!');
                    sound(1000);
                    pisk := true;
               End;
          End
          else
          if (sec - bud - timePisk) = 0 then
          Begin
               nosound;
               write('Отключение будильника');
               pisk := false;
               sec := 0;
          End;
     End;
     if ((sec mod timer) = 0) and (time > tik) and (pisk = false) then
     Begin
          nosound;
     End;
     Key;
End;
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 22.09.2014, 22:58   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

А происходит-то чего?
Я гляжу, это обработчик прерывания.
Резидентная прога под DOS?
Это чо ваще? Если это лаба, то как звучит задание в оригинале?

Одни вопросы...
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 23.09.2014, 02:56   #3
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

min@y™ без паники!
Это консольный будильник. Тикает и в определенное время срабатывает пищалка, но как я уже говорил спустя 9 сек замолкает, хотя этот параметр у меня регулируется.
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 23.09.2014, 08:14   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Bugrimov, не скромничайте, выкладывайте программу целиком.
Тут же и половины нет.
Вот, например, процедура key() - она для чего? пробовали её закомментить?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.09.2014, 09:07   #5
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Что-то вроде этого...
Код:
{$M $1000, 0, 0}
Program Budilnick;
 
Uses Crt, Dos;
 
Const
     takt = 20;
     tik = 0.5;      { Длительность звуового сигнала - "ТИКАНЬЯ" = 0.5 доли секунды }
     timePisk = 20;  { Время "писка" }
 
Var     Key            : Procedure;
        pisk           : Boolean;
        code1, code2   : Integer;
          t, b           : String;
          time, sec, timer     : Integer;
        bud            : Real;
 
{$F+}
Procedure Budiln;
Interrupt;
Begin
     time := time + 1;
     if time > takt then
     Begin
          time := 0;
          sec := (sec + 1);
          writeln(' - ', sec, ' сек. - ');
          if pisk = false then
          Begin
               if (sec mod timer) = 0 then
                  sound(2000);
               if (sec - bud) = 0 then
               Begin
                    write('Включение будильника!');
                    sound(1000);
                    pisk := true;
               End;
          End
          else
          if (sec - bud - timePisk) = 0 then
          Begin
               nosound;
               write('Отключение будильника');
               pisk := false;
               sec := 0;
          End;
     End;
     if ((sec mod timer) = 0) and (time > tik) and (pisk = false) then
     Begin
          nosound;
     End;
     Key;
End;
Begin
  writeln;
	write(' Введите временной интервал (наприм. 1-2 сек.): ');
	readln(t);
  val(t, timer, code1);

  write(' Введите время через которое срабат. БУДИЛЬНИК (наприм. 2 мин. или 0.5 мин): ');
	readln(b);
  val(b, bud, code2);

  { Проверка на корректность введенных данных }
  if (timer <= 0) or (bud <= 0) or (code1 <> 0) or (code2 <> 0) then
	Begin
		writeln(' Введены ошибочные данные!');
		exit;
	End;

  time := 0;
  sec := 0;
  pisk := false;
  bud := bud * 60;

	{ $8 - прерывание таймера }
	GetIntVec($8, @Key);
	{ Переназначаем стандартный обработчик на процедуру Budiln }
	SetIntVec($8, Addr(Budiln));
	Keep(0);
End.
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 23.09.2014, 09:47   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

логика работы вашего обработчика пока мне не понятно (уж как-то очень сложно).
Но сразу могу сказать, то, что не понравилось.
Зачем Вы трогаете прерывание 8h ?!
Для пользовательских программ есть специальное прерывание INT 1Ch, которое вызывается из 8h (например, тыц)
Я бы повесился на него...

второе.
а почему у Вас takt = 20;
таймер же срабатывает 18.2 раза в секунду. takt = 18 поточнее будет...

третье. зачем вообще такая сложная логика?
Можно же легко и просто получить доступ к счётчику тиков:
Код:
function GetTickCount: longint;
var
  Ticks: LongInt absolute 0: $46C;
begin
  GetTickCount := Ticks
end;
достаточно к текущему значению прибавить секунды * 18.2 - и получить время выключения звука.
я не прав?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.09.2014, 09:56   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Лучше давайте спросим аффтара про самое главное!
Зачем ему именно резидентный будильник именно под голый DOS?
Чото подозрительно!

Аффтар, колись, негодник, что за монстра пишешь и зачем!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 23.09.2014, 10:36   #8
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
достаточно к текущему значению прибавить секунды * 18.2 - и получить время выключения звука.
я не прав?
Вы правы, навели на интересную мысль. Слишком намудрил. НЕСЕТ......
Сложновато, согласен. Ваш вариант решения в общем понятен.
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Bugrimov; 23.09.2014 в 10:39.
Bugrimov вне форума Ответить с цитированием
Старый 23.09.2014, 10:37   #9
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Лучше давайте спросим аффтара про самое главное!
Зачем ему именно резидентный будильник именно под голый DOS?
Чото подозрительно!

Аффтар, колись, негодник, что за монстра пишешь и зачем!
Скажем так, спортивный интерес.
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 23.09.2014, 10:45   #10
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Скажем так, спортивный интерес.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать звуковой сигнал треугольной и пилообразной формы JekaDefer Мультимедиа в Delphi 8 30.04.2013 18:03
Assemler, не могу установить звуковой сигнал. FieldyTR Помощь студентам 0 29.03.2012 16:07
Звуковой сигнал (писк) aank10 Общие вопросы C/C++ 2 05.05.2011 11:37
Звуковой сигнал Eugenio Microsoft Office Excel 9 18.03.2009 17:24
сигнал WindowsBeep ben95 Общие вопросы Delphi 8 13.05.2008 19:12