![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Алгоритм расчета миллисекунд Формула [D7, 2003]
Иупштук © (2013-10-18 18:41:00)Подскажите пожалуйста алгоритм расчета миллисекунд.
Вот псевдокод, на самом деле я пока незнаю как его оформить, но смысл не в нем а в формуле расчета для переменной Pause
procedure Calk;
begin
rim := Random(6000)+1000;
Pause := ???
end;
procedure Blink;
begin
F := True; //зажгли лампочку
Sleep(100);
F := False; //потушили лампочку
Sleep(Pause);
end;
не соображу как лучше спросить.
Собс-но нужно как-то раcсчитать Pause так, что бы если процедура Blink будет вызываться как-то так
while true do Blink; и при rim = 1000 то Pause должно ровняться 900, при rim = 2000 -- Pause = 400
т.е. цикл блинк должен быть 1000 миллисекунд. При rim = 1000 -- лампочка должна моргнуть 1 раз в секунду 100 (горит) + 900 (не горит)
при rim=2000 лампочка моргает два раза 100+100 - и не горит 400+400 = 1000 миллисекунд.
при rim=3000 лампочка моргает три раза 100+100+100 и не горит 700/3 = 233 мск
Как-то вот так. как расчитать Pause? расчет должен быть актуальный и для например rim = 1678 или rim = Random(6000)+1000;
на самом деле rim не скачет по рандому, но меняется плавно или более резко в указанных пределах - типа спидометра на авто (скорость) или тахометра.
лампочка как бы должна моргать чем выше rim тем чаще.
Pause расчитывается как бы для цикла мигания лампочки в течении секунды, но на самом деле ждать секунду и моргать нет смысла. Просто от текущего значения rim расчитать новую pause и один раз моргнуть. Но если представить что rim замер то для его значения pause должна быть такая, чтобы подходило условию 1 мырг в секунду для 1000 rim
не знаю, понятно объяснил или нет. но если что поясню или отвечу на уточняющие вопросы. Заранее спасибо за понимание.
Туповатый (2013-10-23 14:58:00) [21]переформулируйте вопрос.
например так:
Как изменять период импульсов (Duty cycle)?
тогда получите примерно такой ответ:
Duty cycle (D) - отношение длительности импульса к периоду их следования.
D = t/T, где t -длительность импульса, T - период.
Иупштук (2013-10-23 14:17:00) [22]
> Inovet © (23.10.13 11:01) [26]
Ничего не иначе Длительность одной вспышки всегда одинаковая 100 мск, а вот пауза между вспышками разная. И если например rim = 3555 то в секунду будет 3 целых вспышки по 100 мск, а еще пол с чуточкой вспышки паузами между вспышками компенсируется....
а в [25] - это я привел Ваши мысли. И они не правильные. Ибо отнимать нужно 100, 200, 300, 400.... а не прибавлять.
[ВладОшин] (2013-10-23 12:10:00) [23]>> Туповатый © (23.10.13 12:03) [27]
нормаль :)) как представлю:
Стоят такие два мырга.. небритые, с битами
- Это наши лампочки и мы их будем зажигать! Вали давай, ынтилигент вшивый..
Туповатый (2013-10-23 12:03:00) [24]
> на 1000 rim 1 мырг лампочкой в секунду т.е. 100 миллисекунд
> горит и 900 не горит
>
> на 2000 rim 2 мырга лампочкой в секунду т.е. 200 миллисекунд
> горит и 800 не горит
период, скважность, длительность, коэффициент заполнения - вот необходимая терминология.
Inovet (2013-10-23 11:01:00) [25]> [25] Иупштук (23.10.13 10:28)
Уже всё иначе, чем в прошлом посте.
Иупштук (2013-10-23 10:28:00) [26]
> ну пусть. 100 + будет для rim
для rim=1000 + 100
для rim=2000 + 200
для rim=3000 + 300
для rim=1500 + 100
для rim=2999 + 200
case rim of
0..1999: +100;
2000..2999: +200;
3000..3999: +300;
.....
Inovet (2013-10-22 00:52:00) [27]> [22] Иупштук (21.10.13 23:22)
> Фух.... не знаю как еще объяснить :)
Так прежде чем писать программу, надо бы объяснить хотя бы себе, что она должна делать.
Inovet (2013-10-22 00:51:00) [28]> [21] Иупштук (21.10.13 23:19)
> 100 - это постоянная величина. Время в миллисекундах сколько
> лампочка горит за один мырг. а вот 900 для 1000, 400 для
> 2000, 233 для 3000
Так 100 уже постоянная величина, ну пусть. 100 + будет для rim = 11000?
Иупштук (2013-10-21 23:22:00) [29]
> на 2000 rim 2 мырга лампочкой в секунду т.е. 200 миллисекунд
> горит и 800 не горит 200 на два мырга по 100 и 800 между
> ними не горит два раза по 400
ну т.е. за секунду 100 мск горит затем 400 не горит, а далее не повторяется а высчитывается новая пауза, но если rim так и останется 2000, то пауза будет опять 400 и будет казаться, что лампочка моргает 2 раза в секунду...
на самом деле моргает один раз с новой паузой....
Фух.... не знаю как еще объяснить :)
Ну да ладно.... вроде решился вопрос.
Иупштук (2013-10-21 23:19:00) [30]
> Inovet ©
Ё-моё... ну что же Вы как не сообразите :)
на 1000 rim 1 мырг лампочкой в секунду т.е. 100 миллисекунд горит и 900 не горит
на 2000 rim 2 мырга лампочкой в секунду т.е. 200 миллисекунд горит и 800 не горит 200 на два мырга по 100 и 800 между ними не горит два раза по 400
:)
100 - это постоянная величина. Время в миллисекундах сколько лампочка горит за один мырг. а вот 900 для 1000, 400 для 2000, 233 для 3000, 600 для 1500 нужно было рассчитать. ну и для любого rim конечно же...
Inovet (2013-10-21 23:02:00) [31]> [19] Иупштук (21.10.13 22:39)
> формулу, по которой высчитать паузу
> [18] Иупштук (21.10.13 22:35)
> rim равно 2000
> [18] Иупштук (21.10.13 22:35)
> 100мск горит + 400мск
Откуда 100 и 400? Почему не 250 и 250 или не 10 и 490?
Иупштук (2013-10-21 22:39:00) [32]А, ну да.... изначально мне нужно было формулу, по которой высчитать паузу. Теперь понятно? :)
Иупштук (2013-10-21 22:35:00) [33]
> Inovet ©
Представь моргающую лампочку. Она моргает с частотой зависимой от rim.
чем выше rim тем чаще моргает. Зависимость такая при rim = 1000 лампочка моргает 1 раз в секунду.
Rim число меняющее в пределах 0 - 10000. примерно
Возьмем к примеру rim равно 2000 и на 5 сек замерло на этом этапе.
лампочка будет моргать так:
100мск горит + 400мск не горит + 100мск горит + 400мск не горит = секунда
т.е. два раза моргнула в секунду. и так пять раз...
Но мне не нужно знать о том сколько rim будет держаться мне просто нужно высчитать для текущего rim паузу, ее выдержать, за это время rim смениться его считать и на основе полученного нового rim высчитать новую паузу.... и т.д.
Inovet (2013-10-21 22:11:00) [34]А я так и не понял, что же ты считаешь.
Иупштук (2013-10-21 21:26:00) [35]Хех.... вот так вроде.... конечно сомневаюсь, но вроде все верно:
procedure Calk;
var rim, Kol, Pause: Integer;
begin
//rim:=Random(6000)+1000;
rim:=3476;
Kol:= (rim div 1000) * 100;
Pause:= (((1000 - Kol) * 1000) div rim); //=201
end;
Спасибо)
stas (2013-10-21 11:24:00) [36]ой
fcnt:= rim div 1000
stas (2013-10-21 11:23:00) [37]
procedure Calk;
var fcnt:integer
begin
fcnt:= rim mod 1000
fcnt:= Round(rim / 1000)
так ?
Иупштук (2013-10-21 10:25:00) [38]Подскажите, реально ли переделать это:
procedure Calk;
begin
//rim:=Random(6000)+1000;
rim:=3476;
fcnt:= rim / 1000;
cnt:=trunk(fcnt)*100;
Pause:= (1000 - cnt) / fcnt; //=201
end;
Т.е. зная rim - целое число (например = 3476). Вычислить Pause (в данном случае должно получится 201) тоже целое не используя при этом вещественных типов, только целые?
Inovet (2013-10-19 01:14:00) [39]> [11] Иупштук (19.10.13 00:35)
> это не правильно и нужно сделать по другому?
Ты там написал "вроде", что означает неуверенность.
Иупштук (2013-10-19 00:35:00) [40]
> Inovet ©
Т.е. ты хочешь сказать, что в [6] где я сам себе ответил - это не правильно и нужно сделать по другому?