О_О

Клапауций 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, то я тут ничем не помогу. Правильный ответ уже давно написан. Ок, подождем ТВОЙ правильный ответ.

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


А тебя?

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, то все, теперь принимается только вариант мигания с любым периодом.

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
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

xgy5x3.gif?w=800

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

bizzon пишет:

Америкосы аплодируют стоя новому названию своей столицы.

Хайль Трамп!

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

дожились Arduino Web Editor

*купил попкорн, пиво и биту в ожидании стада леммингов у которых в веб-редакторе что-то не так происходит.

Joiner
Offline
Зарегистрирован: 04.09.2014

Загадка

Нашел в интернете скетч для управления светодиодной лентой при помощи ШИМ. Автор рассказал, что глаз воспринимает моргание светодиода под управлением ШИМ совсем нелинейно, и предложил записывать значение value  в analogWrite(pin, value) не подряд, а из предложенной им таблицы в массиве. Я скачнул скетч, чтобы посмотреть вживую, как это выглядит.....но

скетч не работает!

[code]
#define PIN1 5 // пин со светодиодом 1 
#define PIN2 6 // пин со светодиодом 2 

int level = 0;      // уровень яркости 
int levelStep = 1;  // шаг изменения уровня яркости 


// таблица экспоненциальной коррекции яркости 
const int logPwm[256] = { 
  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  3, 
  3,  3,  3,  3,  4,  4,  4,  4,  4,  5,  5,  5,  5,  5,  6,  6, 
  6,  6,  6,  7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  9,  9,  9, 
  9,  10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 
  13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 
  17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 21, 21, 21, 
  21, 22, 22, 22, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 26, 26, 
  26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 31, 
  32, 32, 32, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 37, 37, 37, 
  38, 38, 39, 39, 40, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 44, 
  45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 51, 51, 52, 52, 53, 
  53, 54, 55, 55, 56, 56, 57, 58, 58, 59, 59, 60, 61, 62, 62, 63, 
  64, 64, 65, 66, 67, 67, 68, 69, 70, 71, 71, 72, 73, 74, 75, 76, 
  77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 88, 89, 90, 91, 93, 94, 
  96, 97, 98, 100,102,103,105,107,109,111,113,115,117,120,122,125, 
  127,130,134,137,141,145,149,154,159,165,173,181,191,204,223,255 
}; 


void setup(){} 


void loop() { 
  level += levelStep;               // увеличиваем или уменьшаем яркость на один шаг 
  if (level >= 255 || level <= 0)   // если яркость максимальная или минимальная 
    levelStep *= -1;                // меняем направление изменения уровня яркости 

  
  analogWrite(PIN1, level);         // ШИМ для светодиода 1 
  analogWrite(PIN2, logPwm[level]); // ШИМ для светодиода 2 
  delay(10);                        // ничего не делаем 
}

[/code]

Вроде все правильно написано, но не работает!  А если вместо PIN1 и PIN2 в строчках где про analogWrite написать 5 и 6, то все прекрасно работает.

Спецы! Подскажите в чем дело?

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

В последних релизах ИДЕ в arduino.h реализованы собственные определения для PIN.. скорее всего глючит с ними.

Joiner
Offline
Зарегистрирован: 04.09.2014

Arhat109-2 пишет:

В последних релизах ИДЕ в arduino.h реализованы собственные определения для PIN.. скорее всего глючит с ними.

Я пробовал определять как int PIN1=5; Но все равно не работает.

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

  Заставил себя проверить скетч на Nano v3, работает. IDE 1.6.12

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

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017
 
 
в очередной раз пытается заставить себя начать читать хоть какой-то учебник по C++
читает название главы "Вывод сообщений на экран"
закрывает...
Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

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

P.S. Не канонично, надо было назвать TITANIUM BICYCLE.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

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

с названием всё в порядке.

Ну я к тому, что не совпадает с оригинальным названием :-)

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

запостил схему подключения, ссылку на пакет библиотеки, код примера - желают, что бы я им отвечал на английском.

не русофобия, а английский фашизм - разделили всех ползателей по языковому признаку и требуют в "Английской секции" английского языка.

На самом деле такое встречается на многих форумах. Видел и обратную ситуацию - на русскоязычном форуме отдельно раздел для иностранцев, пишущих на английском. Типа так удобнее, чтобы не смешивать темы на разных языках.

Я когда-то публиковал исходники на зарубежном сайте - комментарии в коде дублировал на русском и английском. Типа, чтобы всем удобней было (ну или для ленивых переводить). Как-то так...

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

Jeka_M пишет:

Я когда-то публиковал исходники на зарубежном сайте - комментарии в коде дублировал на русском и английском. Типа, чтобы всем удобней было (ну или для ленивых переводить). Как-то так...

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