PC-01 Lviv
http://pc01.lviv.ua/forum/

Программа "ЧАСЫ", процедуры задержки и т.д.
http://pc01.lviv.ua/forum/viewtopic.php?f=3&t=398
Page 1 of 1

Author:  als [ 12 May 2021, 21:25 ]
Post subject:  Программа "ЧАСЫ", процедуры задержки и т.д.

Работая над МАДЛ02, viewtopic.php?f=20&t=394&p=5452#p5452
решил "заморочится" на процедурах задержки. :-)
Походу написал программу "ЧАСЫ".
Которую буду отрабатывать (на точность) и проверять процедуры задержек.

Для начала программа "ЧАСЫ" без каких либо задержек.

Author:  als [ 12 May 2021, 21:33 ]
Post subject:  Re: Программа "ЧАСЫ", процедуры задержки и т.д.

Code:
program TimerT1; uses  uMD01u in 'uMD01u.pas';
const PosX=11;PosY=10;
VAR H1, H2, M1, M2, S1, S2,
Loop1, L2, L3, L4, L5, L6, L7 :TLabelLV;

               //F809 - Вывод символа на экран
procedure MACRO1; begin Ap(48);CrA;CALL($F809);end;
procedure MACRO2(var P:TLabelLV); begin Ar_(P);MACRO1; end;

{Вывод ":"}
procedure {":"}MACRO_TD; begin Ar(10);MACRO1; end;

{Присвоить ИДентификатору типа Byte число}
procedure IDr(var P:TLabelLV;B:Byte); begin  Ar(B);_rA(P); end;

// вывод времени на экран
procedure MACRO_WriteTime;
begin
 //	BE3E - (00...1F) номер позиции в строке;
Ar(PosX);_rA($BE3E);
//      4.Прямая адресация курсора Точка входа F82D.
CALL($F82D);

MACRO2(H1); MACRO2(H2);  {":"}MACRO_TD;
MACRO2(M1); MACRO2(M2); {":"}MACRO_TD;
MACRO2(S1); MACRO2(S2);
end;



BEGIN
INITCompiler;

SetFullNameLVTfile('TimerT1.LVT');
SetNameInternalKOI(#$20+#$20+#$20+#$20+#$20+#$20);

SetAddrRAM($0000);

    REM('StartProgram;');
    StartProgram;

//	BE38 - 00 рамки нет
//  13.Очистка экрана Точка входа F836.
Ar(0);_rA($F838);   CALL($F836);

//   ДЛЯ   4.Прямая адресация курсора Точка входа F82D.
//	BE3F - (00...17) номер строки;
Ar(PosY);_rA($BE3F);      Ar($FF);_rA($BE3D);

// Обнулим все знаки часов
Ar($00);_rA(S1);_rA(S2);_rA(M1);_rA(M2);_rA(H1);_rA(H2);

// {ТЕСТ} Ar(1);_rA(H1);Ar(9);_rA(H2); Ar(5);_rA(M1);Ar(5);_rA(M2);


///++++++++++++++++++++++++++++++++++++++++++++++++++++
{Loop1 - ЦИКЛ ЧАСОВ}
LabelA(Loop1);
// вывод времени на экран
MACRO_WriteTime;

{ТУТ БУДЕТ ЗАДЕРЖКА}

{Обработка...}
{Секунды}
           Ar_(S2);Ap1;Acmp(10);GotoUnp(L2);_rA(S2);GOTO_(Loop1);
LabelA(L2);IDr(S2,0);Ar_(S1);Ap1;Acmp(6);GotoUnp(L3);_rA(S1);GOTO_(Loop1);
{Минуты}
LabelA(L3); IDr(S1,0);  Ar_(M2);Ap1;Acmp(10);GotoUnp(L4);_rA(M2);GOTO_(Loop1);
LabelA(L4); IDr(M2,0);  Ar_(M1);Ap1;Acmp(6);GotoUnp(L5);_rA(M1);GOTO_(Loop1);
{ЧАСЫ}
LabelA(L5); IDr(M1,0);  Ar_(H2);Ap1;Acmp(10);GotoUnp(L6);_rA(H2);GOTO_(L7);
LabelA(L6); IDr(H2,0);  Ar_(H1);Ap1;_rA(H1);GOTO_(Loop1);

{Ограничение по часам 24, для этого теста 99}
LabelA(L7);
Ar_(H1);Acmp($09);GotoUnm(Loop1);
Ar_(H2);Acmp($09);GotoUnm(Loop1);
{Обнуление "часы"}
Ar($00);_rA(H1);_rA(H2);
GOTO_(Loop1); {Loop1 - ЦИКЛ ЧАСОВ}
///++++++++++++++++++++++++++++++++++++++++++++++++++++

{Резметка и обнуление}
LabelA(H1);DB($00);LabelA(H2);DB($00);
LabelA(M1);DB($00);LabelA(M2);DB($00);
LabelA(S1);DB($00);LabelA(S2);DB($00);


FINALCompiler;
END.

Author:  als [ 12 May 2021, 21:35 ]
Post subject:  Re: Программа "ЧАСЫ", процедуры задержки и т.д.

Attachment:
TimerT1.7z [1.74 KiB]
Downloaded 892 times
Сделал замеры.
Сопоставил работу программы-"пустышки" с часами на компе
Пока не знаю зачем и как я и что собираюсь высчитывать и как применять это
но пока замеры такие
часы компа - 1:00:00 = 3600 сек
часы "пустышки = 55:46:13 = 151813 циклов

151813 / 3600 = 42,170277777777777777777777777778 циклов/сек
3600 / 151813 = 0,023713384229282077292458485109971 секунд/цикл


Author:  als [ 13 May 2021, 15:50 ]
Post subject:  Re: Программа "ЧАСЫ", процедуры задержки и т.д.

Attachment:
TimerT2.7z [2.32 KiB]
Downloaded 884 times
Во втором таймере добавлен макрос
Code:
procedure MACRO_Delay;
//Задержка в 50 тактов по идее 2 5000 000 /50 = 50000 = 1 сек
begin
    HLr(38425);// величина задержки
// спешат = 38425
//отстают = 38450
LabelA(DelayT);
  Ar_(DelayT){13};Ar_(DelayT);{13}{для коректировки 50 тактов}
HLm1;{5} ArH{5}; AoL{4};
GotoUnNot0(DelayT){10};
end;

вставлен в код сюда
Code:
{ТУТ БУДЕТ ЗАДЕРЖКА}
MACRO_Delay;
Результаты теста (есть в файле TimerT2.dpr)

САС-Емулятор 1.44 (по секундно)
38300 1-я проверка, на компе = 0:10:00 , программа = 00:10:02 - СПЕШАТ!
38350 1-я проверка, на компе = 0:10:00 , программа = 00:10:01 - СПЕШАТ!
38375 1-я проверка. на компе = 0:20:00 , программа = 00:20:01 - СПЕШАТ!
38390 1-я проверка. на компе = 1:20:00 , программа = 01:20:06 - СПЕШАТ!

38400 1-я проверка, на компе = 1:00:00 , программа = 00:59:56 - ОТСТАЮТ!
38400 2-я проверка, на компе = 0:20:00 , программа = 00:20:01 - СПЕШАТ ВСЕ ТАКИ!
38450 , 1-я, на компе = 1:20:00 , программа = 01:19:58 - ОТСТАЮТ!
38425 , 1-я, на компе = 1:25:00 , программа = 1:25:01 - СПЕШАТ!

Устанавливать величину задержки нужно где-то....
HLr(38425);// величина задержки
// спешат = 38425
//отстают = 38450

Во всяком случае так при проверке САС-Емулятором 1.44.
Неплохо бы было, если бы это кто-то проверил на реальном ПК-01 Львов!
В Архиве TimerT2.7z, есть компиляции с разным значением величины задержки
в соответствующих папках 38300, 38350, 38375, 38390, 38400, 38425, 38450

Может попытаюсь убрать из MACRO_Delay одну "Ar_(DelayT);{13}" и тогда длительность макроса снизится 50-13=37 тактов. Если убрать обе то тогда длительность тактов макроса будет 24 такта и величины 65535 не хватит для задержки до 1 секунды. При 24 тактовой задержке величина задержки должна быть около 104166, если я правильно подсчитал.
Поэтому убирать обе "Ar_(DelayT);{13}" из макроса MACRO_Delay в данном случае не резон.

Page 1 of 1 All times are UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/