Вверх ↑
Этот топик читают: Гость
Ответов: 5446
Рейтинг: 323
#16: 2011-08-06 22:39:01 ЛС | профиль | цитата
1nd1g0, мне кажется, что под "реальным временем" имеется в виду отображение на форме некой цифири, показывающей время, прошедшее с предыдущего импульса, и обновляющейся чаще, чем приходят эти импульсы (напр., если между импульсами проходит около секунды, то на форме показывается число прошедших миллисекунд, изменяющееся каждые 100 мсек - быстрее всё равно не углядишь)
карма: 1

0
Ответов: 12
Рейтинг: 1
#17: 2011-08-06 22:43:17 ЛС | профиль | цитата
Реальное время, т.е. как прошел сигнал, сразу запустился секундомер и перед глазами "бегут циферки", потом опять пришел сигнал и по этому сигналу уже таймер должен остановиться. Точность должна быть до миллисекунд.
Мне кажется, если использовать таймер, то точность будет страдать из-за пары или тройки итераций.

Леонид, сигнал с порта будет больше 20 миллисекунд 100%.
карма: 0

0
Ответов: 3889
Рейтинг: 362
#18: 2011-08-06 22:45:24 ЛС | профиль | цитата
bro, Вот, я Вам на скорую руку написал код, получающий значение текущего системного таймера (в InlineCode):

Add(MainForm,8086831,336,133)
{
Width=284
Height=172
Point(Handle)
}
Add(InlineCode,2961482,245,84)
{
VarPoints=#6:MyTime|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|38:uses kol,Share,Debug,Windows,mmsystem;|0:|4:type|28: THiAsmClass = class(TDebug)|9: public|44: procedure MyTime(var dt:TData; idx:word);|5: end;|0:|14:implementation|0:|29:procedure THiAsmClass.MyTime;|5:begin|28: dtInteger(dt,timeGetTime);|4:end;|0:|4:end.|
}
Add(DoData,9875333,245,133)
{
link(onEventData,8086831:doCaption,[])
link(Data,2961482:MyTime,[])
}
Add(MMTimer,5088309,133,133)
{
link(onTimer,9875333:doData,[])
}

Думаю, точнее вы уже не найдёте.
карма: 1

0
Ответов: 5446
Рейтинг: 323
#19: 2011-08-06 22:47:08 ЛС | профиль | цитата
[offtop]
Однако, угадал...
[/offtop]
карма: 1

0
Ответов: 3889
Рейтинг: 362
#20: 2011-08-06 22:50:29 ЛС | профиль | цитата
bro, схему чтобы "бежали циферки" делаете отдельно на таймере, благо считать с нуля, шаг известен и точность совершенно не важна, а финальный результат показываете по TimeCounter (он основан на том же таймере, что и мой IC выше, точность до единиц мсек).
карма: 1

0
Ответов: 8976
Рейтинг: 825
#21: 2011-08-06 22:58:44 ЛС | профиль | цитата
1nd1g0, однако не угадал! Сколько раз говорить, что системный таймер имеет шаг 1/64 сек! Напишите IC на тики
------------ Дoбавленo в 22.58:
используя QueryPerformanceCounter, QueryPerformanceFrequency
карма: 19

0
Ответов: 12
Рейтинг: 1
#22: 2011-08-06 23:00:55 ЛС | профиль | цитата
1nd1g0, а каким образом работает приведенный код выше? Я запустил и посмотрел. Начинает считать с 369xxxxx и опять вроде секунды считаются.

А каким образом можно сделать через TimeCounter? Хорошо, пусть даже без дисплея. Схема должна работать так: я нажимаю кнопку ожидание сигнала и после поступления сигнала должен запускаться таймер и считать. Может сделать это через условия? Т.е. 1ка с кнопки = 1ке с lpt или это не так?
карма: 0

0
Ответов: 3889
Рейтинг: 362
#23: 2011-08-06 23:14:42 ЛС | профиль | цитата
Леонид писал(а):
системный таймер имеет шаг 1/64 сек

Пардон, но я использую так называемый "мультимидийный" таймер и тесты говорят о погрешности в единицы миллисекунд (а не в 15):

code_24819.txt
------------ Дoбавленo в 23.11:
bro, с нижней точки того InlineCode в любой момент времени можно получить значение текущего мультимидийного таймера, сейчас ещё более точную версию по заказу Леонида попробую изобразить.
------------ Дoбавленo в 23.14:
bro писал(а):
А каким образом можно сделать через TimeCounter?

Опрашиваете в вечном цикле порт, при появлении нужного бита запускаете счётчик первой точкой, остановите - второй. Проблема только - очень часто опрашивать порт.
карма: 1

0
файлы: 1code_24819.txt [989B] [142]
Ответов: 8976
Рейтинг: 825
#24: 2011-08-06 23:21:09 ЛС | профиль | цитата
bro, работая с LPT портом надо иметь ввиду, что время от времени Windows имеет обыкновение опрашивать порт,
------------ Дoбавленo в 23.18:
прерывая работу других программ на 20--40 мсек и Вы можете пропустить Ваш сигнал. Умный Galkov научил:
------------ Дoбавленo в 23.18:
перед запуском Windows воткнуть свой разъём с заземлённой ногой "Ошибка" (насколько помню №15),
------------ Дoбавленo в 23.18:
при запуске Windows десяток раз обратится к порту, получит Ошибку и вычеркнит его из своего оборудования и более обращатся к нему не будет.
------------ Дoбавленo в 23.21:
1nd1g0, в Вашей схеме выставте интервал 1 мсек и запишите сотню полученных значений и посмотрите на них не торопясь и анализируя
карма: 19

0
Ответов: 3889
Рейтинг: 362
#25: 2011-08-06 23:26:57 ЛС | профиль | цитата
Леонид, не подменяйте понятия, получив результаты, отстоящие друг от друга на 15-30 мсек вы лишь докажете ограничение срабатывания события таймера в системе. Это никак не связано с точностью timeGetTime, который я использовал (и про который говорил).

Однако, исключительно интереса ради я таки сделал вариант IC, выдающий данные с точностью до микросекунд. Чтобы было


Add(InlineCode,2961482,434,91)
{
VarPoints=#6:MyTime|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|38:uses kol,Share,Debug,Windows;|0:|4:type|28: THiAsmClass = class(TDebug)|9: public|44: procedure MyTime(var dt:TData; idx:word);|5: end;|0:|14:implementation|0:|29:procedure THiAsmClass.MyTime;|31:var MyPerfCntr,MyPerfFrq:int64;|5:begin|39: QueryPerformanceCounter(MyPerfCntr);|40: QueryPerformanceFrequency(MyPerfFrq);|38: MyPerfFrq := MyPerfFrq div 1000000;|51: dtInteger(dt,integer(MyPerfCntr div MyPerfFrq));|4:end;|0:|4:end.|
}

Это к заказу вида
Леонид писал(а):
Напишите IC на тики
------------ Дoбавленo в 22.58:
используя QueryPerformanceCounter, QueryPerformanceFrequency

карма: 1

0
Ответов: 8976
Рейтинг: 825
#26: 2011-08-06 23:51:34 ЛС | профиль | цитата
1nd1g0, ну здравствуйте, Вы же в Вашей схемке поставили MMTimer, который выдаёт 1000 событий в секунду при уставке 1 мсек. И получаем из Вашего IC 1000 значений в секунду, но 15--16 подряд одинаковых
------------ Дoбавленo в 23.48:
1nd1g0, ну здравствуйте, Вы же в Вашей схемке поставили MMTimer, который выдаёт 1000 событий в секунду
------------ Дoбавленo в 23.50:
1nd1g0, совсем другое дело (просто я не переношу неточностей )
------------ Дoбавленo в 23.51:
-- про заказ вида....
карма: 19

0
Ответов: 3889
Рейтинг: 362
#27: 2011-08-06 23:57:32 ЛС | профиль | цитата
Леонид писал(а):
5--16 подряд одинаковых

У разных систем - разная точность таймеров, выше я давал схему, где нарочно опрашиваю timeGetTime с разрывом в 2-3 мсек и значения не совпадают (на моей системе).

А про MMTimer, я просто не сразу понял, что Вы про него (я "мультимедийным" назвал timeGetTime, mea culpa), вы же в той же фразе просили перейти на тики, что недвусмысленно намекало, что речь о точности timeGetTime, а он относительно точен (на разных системах может очень сильно варьироваться). Тики, кстати, работают не на всех системах, хотя сейчас это уже трудно встретить.
карма: 1

0
Ответов: 8976
Рейтинг: 825
#28: 2011-08-07 13:27:47 ЛС | профиль | цитата
1nd1g0, (кстати о формате integer -- int64 в этом формате не отображается ) Схемка не выкладывается
карма: 19

0
Ответов: 12
Рейтинг: 1
#29: 2011-08-07 14:19:30 ЛС | профиль | цитата
1nd1g0 писал(а):
Опрашиваете в вечном цикле порт

Как я писал выше мне нужно, чтобы только в определенный момент программа считывала сигнал с порта. Т.е. я нажал кнопку "Ожидание сигнала" и программа ждет его. А после получения сигнала начинает запускаться секундомер. Реально ли это сделать через условия?

1nd1g0 писал(а):
code_24819.txt

Пишет просто 1...

1nd1g0 писал(а):


код


Здесь пишет 2009, 2010 и так постоянно...

Разве не реально дописать SecondsCounter, чтобы он отображал миллисекунды? А то тут, как я понял, заморочек куча...
карма: 0

0
Ответов: 3889
Рейтинг: 362
#30: 2011-08-07 14:27:18 ЛС | профиль | цитата
bro, это не готовые схемы, решающие Вашу задачу, это лишь тесты разных способов вычисления прошедшего с момента запуска ПК времени. Как я уже писал Выше, они вычисляют точность таймеров. Например, там где "пишет просто 1" - показательный пример того, что точность до единиц миллисекунд. А последний компонент выдаёт микросекунды, прошедшие с момента запуска. Вернее, теоретически должен был выдавать, но размерность integer слишком мала и старшая часть обрезается, уж простите)
карма: 1

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)