Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.10.12;
Скачать: CL | DM;

Вниз

Алгоритм расчета миллисекунд Формула   Найти похожие ветки 

 
Иупштук   (2013-10-18 18:41) [0]

Подскажите пожалуйста алгоритм расчета миллисекунд.

Вот псевдокод, на самом деле я пока незнаю как его оформить, но смысл не в нем а в формуле расчета для переменной 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-18 18:48) [1]

я ничо не понял )


 
Иупштук   (2013-10-18 18:56) [2]

представьте моргающую лампочку.
чем больше rim тем чаще моргает лампочка... т.е. меньше Pause
как для текущего rim вычислить Pause для одно вызова Blink;


 
Ega23 ©   (2013-10-18 18:58) [3]

Windows не является системой реального времени.


 
Иупштук   (2013-10-18 19:02) [4]

Да я в курсе.... мне просто алгоритм нахождения данного числа нужен :)
А объяснил как смог) Спасибо.


 
Иупштук   (2013-10-18 19:18) [5]

по математике двойка была..... шутка. Не, ну серьезно, что-то никак не соображу. Самому стыдно.
Для rim = 1500 pause должна быть такой, что бы лампочка моргнула три раза за две секунды


 
Иупштук   (2013-10-18 19:49) [6]

Хм.. вроде вот так получилось
procedure Calk;
begin
 rim:=Random(6000)+1000;
 fcnt:= rim / 1000;
 cnt:=trunk(fcnt)*100;
 Pause:= (1000 - cnt) / fcnt;
end;

Спасибо за помощь. но если будут комментарии - давайте


 
все арамисы, а я Дартаньян   (2013-10-18 20:12) [7]

на бумажке нарисуй график, чего ты хочешь, а из него и выводи формулы.


 
Inovet ©   (2013-10-18 22:59) [8]

Может ШИМ хочешь?


 
Иупштук   (2013-10-18 23:16) [9]


> Широтно-импульсная модуляция (ШИМ) — один из способов снижения
> воспринимаемой яркости в дисплеях, работающий путём быстрого
> циклического включения и выключения подсветки.

нет, мне просто необходимо моргать лампочкой прпорционально числу rim


 
Inovet ©   (2013-10-18 23:49) [10]

> [9] Иупштук   (18.10.13 23:16)

Какая разница дисплей или глаз циклопа. Ты написал многа букафф, а не понятно из писанного, что надо. Ты же приводишь какие-то соотношения, вот и объясни внятно - что там от чего зависит. Дисплей... Вот читай:

http://ru.wikipedia.org/wiki/%D0%A1%D0%BA%D0%B2%D0%B0%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C
и это читай
http://ru.wikipedia.org/wiki/%D0%A7%D0%B0%D1%81%D1%82%D0%BE%D1%82%D0%B0


 
Иупштук   (2013-10-19 00:35) [11]


> Inovet ©

Т.е. ты хочешь сказать, что в [6] где я сам себе ответил - это не правильно и нужно сделать по другому?


 
Inovet ©   (2013-10-19 01:14) [12]

> [11] Иупштук   (19.10.13 00:35)
> это не правильно и нужно сделать по другому?

Ты там написал "вроде", что означает неуверенность.


 
Иупштук   (2013-10-21 10:25) [13]

Подскажите, реально ли переделать это:
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) тоже целое не используя при этом вещественных типов, только целые?


 
stas ©   (2013-10-21 11:23) [14]

procedure Calk;
var fcnt:integer
begin


fcnt:= rim mod 1000
fcnt:= Round(rim / 1000)

так ?


 
stas ©   (2013-10-21 11:24) [15]

ой
fcnt:= rim div 1000


 
Иупштук   (2013-10-21 21:26) [16]

Хех.... вот так вроде.... конечно сомневаюсь, но вроде все верно:
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;

Спасибо)


 
Inovet ©   (2013-10-21 22:11) [17]

А я так и не понял, что же ты считаешь.


 
Иупштук   (2013-10-21 22:35) [18]


> Inovet ©

Представь моргающую лампочку. Она моргает с частотой зависимой от rim.
чем выше rim тем чаще моргает. Зависимость такая при rim = 1000 лампочка моргает 1 раз в секунду.
Rim число меняющее в пределах 0 - 10000. примерно
Возьмем к примеру rim равно 2000 и на 5 сек замерло на этом этапе.
лампочка будет моргать так:
100мск горит + 400мск не горит + 100мск горит + 400мск не горит = секунда
т.е. два раза моргнула в секунду. и так пять раз...
Но мне не нужно знать о том сколько rim будет держаться мне просто нужно высчитать для текущего rim паузу, ее выдержать, за это время rim смениться его считать и на основе полученного нового rim высчитать новую паузу.... и т.д.


 
Иупштук   (2013-10-21 22:39) [19]

А, ну да.... изначально мне нужно было формулу, по которой высчитать паузу. Теперь понятно? :)


 
Inovet ©   (2013-10-21 23:02) [20]

> [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 23:19) [21]


> 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 конечно же...


 
Иупштук   (2013-10-21 23:22) [22]


> на 2000 rim 2 мырга лампочкой в секунду т.е. 200 миллисекунд
> горит и 800 не горит 200 на два мырга по 100 и 800 между
> ними не горит два раза по 400

ну т.е. за секунду 100 мск горит затем 400 не горит, а далее не повторяется а высчитывается новая пауза, но если rim так и останется 2000, то пауза будет опять 400 и будет казаться, что лампочка моргает 2 раза в секунду...
на самом деле моргает один раз с новой паузой....
Фух.... не знаю как еще объяснить :)
Ну да ладно.... вроде решился вопрос.


 
Inovet ©   (2013-10-22 00:51) [23]

> [21] Иупштук   (21.10.13 23:19)
> 100 - это постоянная величина. Время в миллисекундах сколько
> лампочка горит за один мырг. а вот 900 для 1000, 400 для
> 2000, 233 для 3000

Так 100 уже постоянная величина, ну пусть. 100 + будет для rim = 11000?


 
Inovet ©   (2013-10-22 00:52) [24]

> [22] Иупштук   (21.10.13 23:22)
> Фух.... не знаю как еще объяснить :)

Так прежде чем писать программу, надо бы объяснить хотя бы себе, что она должна делать.


 
Иупштук   (2013-10-23 10:28) [25]


> ну пусть. 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-23 11:01) [26]

> [25] Иупштук   (23.10.13 10:28)

Уже всё иначе, чем в прошлом посте.


 
Туповатый ©   (2013-10-23 12:03) [27]


> на 1000 rim 1 мырг лампочкой в секунду т.е. 100 миллисекунд
> горит и 900 не горит
>
> на 2000 rim 2 мырга лампочкой в секунду т.е. 200 миллисекунд
> горит и 800 не горит


период, скважность, длительность, коэффициент заполнения - вот необходимая терминология.


 
[ВладОшин] ©   (2013-10-23 12:10) [28]

>> Туповатый ©   (23.10.13 12:03) [27]
нормаль :)) как представлю:
Стоят такие два мырга.. небритые, с битами
- Это наши лампочки и мы их будем зажигать! Вали давай, ынтилигент вшивый..


 
Иупштук   (2013-10-23 14:17) [29]


> Inovet ©   (23.10.13 11:01) [26]

Ничего не иначе Длительность одной вспышки всегда одинаковая 100 мск, а вот пауза между вспышками разная. И если например rim = 3555 то в секунду будет 3 целых вспышки по 100 мск, а еще пол с чуточкой вспышки паузами между вспышками компенсируется....

а в [25] - это я привел Ваши мысли. И они не правильные. Ибо отнимать нужно 100, 200, 300, 400.... а не прибавлять.


 
Туповатый ©   (2013-10-23 14:58) [30]

переформулируйте вопрос.
например так:
Как изменять период импульсов (Duty cycle)?

тогда получите примерно такой ответ:
Duty cycle (D) - отношение длительности импульса к периоду их следования.
D = t/T, где t -длительность импульса, T - период.


 
[ВладОшин] ©   (2013-10-23 16:49) [31]

Так может проще сказать сколько раз в секунду надо моргать?


секунда - (раз * мырг)
----------------------
        раз


1 раз: (1000 - 100)/1 = 900
2 раз: (1000 - 200)/2 = 400
3 раз: (1000 - 300)/3  ~ 233,(3)
и т.п.


 
Иупштук   (2013-10-23 18:47) [32]


> [ВладОшин] ©   (23.10.13 16:49) [31]

А как по Вашей формуле сделать для rim = 1500? :) Должна получится пауза  600 мск.


 
Inovet ©   (2013-10-23 19:02) [33]

> [29] Иупштук   (23.10.13 14:17)
> Ибо отнимать нужно 100, 200, 300, 400.... а не прибавлять.

Так где ответ на вопрос: сколько получится для 11000?


 
Inovet ©   (2013-10-23 19:07) [34]

> [30] Туповатый ©   (23.10.13 14:58)

Об этом я спрашивал где-то в начале, но автор не ответил, вернее ответил, что у него всё правильно.


 
Inovet ©   (2013-10-23 19:07) [35]

> [34] Inovet ©   (23.10.13 19:07)

Вот и уточняем - что же такое это правильно.


 
Иупштук   (2013-10-23 19:48) [36]


> Так где ответ на вопрос: сколько получится для 11000?

Прошу прощения - это я не правильно понял ваши мысли)

А ответ для 10000 и выше пауза 0.
Но на самом деле rim не будет столько... От 0 до 9000.


 
[ВладОшин] ©   (2013-10-23 21:54) [37]


> А как по Вашей формуле сделать для rim = 1500? :) Должна
> получится пауза  600 мск.

надо понять что это 2 раза в три секунды (или три раза в две секунды)
а то эти rim-ляня порядком сбивают :)

если надо 3/2 раза мигнуть в секунду, то
(1000 - 1.5 *100)/1.5 ~ 566

если надо 2/3 раза мигнуть в секунду, то
(1000 - 0.66 *100)/0.66 ~ 666


 
[ВладОшин] ©   (2013-10-23 22:11) [38]

а, не :)
если надо 2/3 раза мигнуть в секунду, то

var
 Second: Integer;
 Myrg: integer;
 CountM: Double;
begin
 Second := 1000;
 Myrg := 100;
 CountM := 2/3;
 ShowMessage( FloatToStr( (Second - CountM*Myrg)/CountM  ) );

= 1400
Что логично. еще 100 на мырг, и *2 , и = 3 секунды


 
Иупштук   (2013-10-24 10:09) [39]


> [ВладОшин] ©   (23.10.13 22:11) [3
...
>  CountM: Double;

Там выше было условие не использовать вещественных типов :)


> Туповатый ©   (23.10.13 14:58) [30]
> переформулируйте вопрос.например так:Как изменять период
> импульсов (Duty cycle)?тогда получите примерно такой ответ:
> Duty cycle (D) - отношение длительности импульса к периоду
> их следования.D = t/T, где t -длительность импульса, T -
>  период.

Я смотрел на вики про скважность.... Там на гифке показано как паузы между импульсов изменяются.
Но чем больше пауза, тем короче импульс и наоборот. А мне так не нужно.
Но если честно, не понял как применить данную формулу к задаче.


 
Туповатый ©   (2013-10-24 10:40) [40]


> А мне так не нужно.

так напиши, как нужно. что, в школе не учили писать нечто типа:
a - константа,
x - длительность паузы,
с - длительность импульса
T- период,
T=sqrt(cos((x+c)/a)*Pi)+2  ?



Страницы: 1 2 вся ветка

Текущий архив: 2014.10.12;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.009 c
15-1393587859
alexdn
2014-02-28 15:44
2014.10.12
Как продать программу за рубеж


15-1393593127
ТимоховДА
2014-02-28 17:12
2014.10.12
If (YouLoveVCL = true) then TReadThisNow.Create();


3-1301064980
Galera
2011-03-25 17:56
2014.10.12
DisplayFormat - ,0.0;,0.0;??????;


2-1382560453
Вова
2013-10-24 00:34
2014.10.12
помогите найти косяк


15-1393789594
[ВладОшин]
2014-03-02 23:46
2014.10.12
Плагин. Как это работает?