О_О

Клапауций 234
Offline
Зарегистрирован: 24.10.2016
Клапауций 234
Offline
Зарегистрирован: 24.10.2016

Мигаем светодиодом без delay() 

void setup() {pinMode(13, OUTPUT);}
void loop() {digitalWrite(13, (millis()/1024)&1);}

 

a5021
Offline
Зарегистрирован: 07.07.2013

Логично. Десятый бит счетчика миллисекунд переключается, как раз с периодом 1с.

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

a5021 пишет:

Десятый бит

младший бит millis()/1024
a5021
Offline
Зарегистрирован: 07.07.2013

Нет не младший. Деленеие на 1024 соответствует сдвигу вправо на десять разрядов. Десятый бит получается.

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

a5021 пишет:

Нет не младший. Деленеие на 1024 соответствует сдвигу вправо на десять разрядов. Десятый бит получается.

ок. деление миллис на 1024 возможно чему-то в этой реальности и соответсвует, но никак не соответвует блинку с периодом в 1 секунду.

блинк раз в секунду:

void setup() {pinMode(13, OUTPUT);}
void loop() {digitalWrite(13, (millis()/1000)&1);}

*на сколько разрядов тут что сдвигается вправо?

a5021
Offline
Зарегистрирован: 07.07.2013

Клапауций 234 пишет:
*на сколько разрядов тут что сдвигается вправо?

Согласен. Действительно, так можно делать блинк с любым периодом. Диапазон ограничен только разрядностью счетчика. В первый раз смутила ровная цифра 1024, что и подтолкнуло к мысли насчет сдвигов. Сейчас вижу, что тут это малость не то. Результат деления будет увеличиваться на единицу всякий раз, когда счетчик миллисов будет достигать значений кратных делителю. Ну а раз результат меняется на единичку, то младший бит всякий раз тоже меняет свое значение. Совсем простая арифметика, хотя идея, безусловно, интересная. Плохо, что деление является не самой легкой операцией для ардуины.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Нормальный blink, никаких delayев. Абсолютно пофиг для блинка 1 секунда или 1.024 сек, потому логичней делить не на 1000, а на 1024. Можно на 512, 256 и т.п. Ничего особенного, в общем.

 

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

a5021 пишет:

В первый раз смутила ровная цифра 1024

kisoft пишет:

логичней делить не на 1000, а на 1024. Можно на 512, 256 и т.п.

конкурс невнятных ответов на вопрос: "почему же лучше 1024 или 512, 256... ?" продлён до правильного ответа.

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

a5021 пишет:

Плохо, что деление является не самой легкой операцией для ардуины.

¯\_(ツ)_/¯

void setup() {pinMode(13, OUTPUT);}
void loop() {digitalWrite(13, (millis()>>10)&1);}

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Если тебе непонятно, чем 1024 отличается от 1000, то я тут ничем не помогу. Правильный ответ уже давно написан. Ок, подождем ТВОЙ правильный ответ.

 

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

kisoft пишет:

Если тебе непонятно, чем 1024 отличается от 1000, то я тут ничем не помогу. Правильный ответ уже давно написан. Ок, подождем ТВОЙ правильный ответ.

если не можешь, кто тебя, вообще, за язык тянул писать невнятные комменты в этой теме.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Вау .. кузявый код, годный. Моргалка с частотой 1.024сек .. так? :)

Кстати, если заменить millis() на timer_ovf_count (кажется так) то будет ещё "кузявее", нет? :)

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

Arhat109-2 пишет:

Вау .. кузявый код, годный. Моргалка с частотой 1.024сек .. так? :)

с частотой - от 1 до 1/2 максимального значения счётчика.

Arhat109-2 пишет:

Кстати, если заменить millis() на timer_ovf_count (кажется так) то будет ещё "кузявее", нет? :)

ну, нарой в недрах дуино разных счётчиков и мигай ими, если миллис не устраивает.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Клапауций 234 пишет:

kisoft пишет:

Если тебе непонятно, чем 1024 отличается от 1000, то я тут ничем не помогу. Правильный ответ уже давно написан. Ок, подождем ТВОЙ правильный ответ.

если не можешь, кто тебя, вообще, за язык тянул писать невнятные комменты в этой теме.


А тебя?

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

kisoft пишет:
А тебя?

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

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Я потерялся? Ты уверен?

a5021
Offline
Зарегистрирован: 07.07.2013

Клапауций 234 пишет:

¯\_(ツ)_/¯

void setup() {pinMode(13, OUTPUT);}
void loop() {digitalWrite(13, (millis()>>10)&1);}

[/quote]

Не-не-не. Так мы получим только степени двойки, т.е. периоды в 2.048с, 1.024с, 0.512с и все в таком роде. Раз уж началось деление на 1000, то все, теперь принимается только вариант мигания с любым периодом.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Мы тут гости, мы тут никто

Arhat109-2
Offline
Зарегистрирован: 24.09.2015
uint16_t mul = 3;
uint16_t div = 10; // for shift only!

void setup() {pinMode(13, OUTPUT);}
void loop() {digitalWrite(13, (mul*millis()>>div)&1);}

Ну не любые .. но все натуральные дроби в разумном пределе поддерживаются .. :)

Nosferatu
Offline
Зарегистрирован: 04.11.2012

Arhat109-2 пишет:

Значит полупериод 1 секунда будет uint16_t mul = 1024 / 1000;

Nosferatu
Offline
Зарегистрирован: 04.11.2012

uint16_t это же целочисленное вроде.

Nosferatu
Offline
Зарегистрирован: 04.11.2012

Лучше возьму себе на вооружение пример Клапауцийя, с делением и без округления.

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

a5021 пишет:

Не-не-не. Так мы получим только степени двойки, т.е. периоды в 2.048с, 1.024с, 0.512с и все в таком роде.

ну, в болиде формулы-1 скоростя так переключаются. :D

*желаешь плавного комфорта - юзай первый пример.

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

продолжаем конкурс #8

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Клапауций 234 пишет:

продолжаем конкурс #8

Приз какой?

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

1$

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Ты победил, забирай

Клапауций 823
Offline
Зарегистрирован: 13.01.2017

xgy5x3.gif?w=800