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:
Сделал замеры.Сопоставил работу программы-"пустышки" с часами на компе Пока не знаю зачем и как я и что собираюсь высчитывать и как применять это но пока замеры такие часы компа - 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:
Во втором таймере добавлен макрос
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/ |