smooth blink
- Войдите на сайт для отправки комментариев
Вс, 02/05/2021 - 13:47
Купил я себе у китайцев платку с контроллером STM32F411 с завода она идет с прошитым загрузчиком под STMDUINO. При включении обнаружилось, что светодиод на этой плате плавно загорается а затем гаснет. Делает это загрузчик или прошитый для примера скетч, я тогда разбираться не стал, но эффект мне понравился.
Сейчас праздники, есть немного свободного времени. Вспомнил я про этот эффект и захотелось мне его повторить, но уже на обычной ардуинке. В качестве подопытного мыша, у меня, выступает китайский клон "SparkFun Pro Micro". Если у Вас другая Aduino, подправьте в первой строке привязку к выводу управляющему светодиодом.
#define LED LED_BUILTIN_RX #define INTERVAL1 (23u) #define INTERVAL2 (24u) void setup() { pinMode (LED, OUTPUT); } void loop() { static uint8_t clk1 = 0, clk2 = 0; static uint8_t led_state = 0; uint8_t now = millis(); if (INTERVAL1 < (uint8_t)(now - clk1)) { clk1 += INTERVAL1; led_state ^= 1; } if (INTERVAL2 < (uint8_t)(now - clk2)) { clk2 += INTERVAL2; led_state ^= 1; } digitalWrite(LED, ((0 == led_state) ? LOW : HIGH)); }
Всех с праздником.
Стандартный из Examples Fade не такой ? По описанию похоже.
Всё не так.
Например millis() совсем не uint8_t, а совсем даже unsigned long. Можно очень даже нарваться.
Почитайте лучше "блинк без делей".
Всё ок. Просто код нарывается на переполнение байта, а не дворда, более того, это не баг, это фича.
ну не знаю, если поменять:
вроде более читабельный код, да и по памяти:
Не всё так однозначно, где найдёшь, где потеряешь )))
Всё ок. Просто код нарывается на переполнение байта, а не дворда, более того, это не баг, это фича.
Фича - это косяк. Идею понял, но не одобряю.
Мы расстроены, продолжайте держать нас в курсе :)
На самом деле, нормально. И delay использовать нормально. И даже goto (хоть оно, конечно, почти никогда и не нужно). Реальный мир - он того, не такой, как проповедуют великие теоретики, он полон компромиссов, и неудобностей, и прочего, и хоть я их (теоретиков) и уважаю, но свою голову-то на плечах тоже надо иметь.
А я вообще не понимаю этих перестраховщиков.
Простейший скетч и столько поноса.(
Green, прежде чем ругать чужой, работающий код, да еще с таким наездом, подумали бы хорошенько. Если чего не понятно могли бы спросить и вам бы ответили.
А так, вы только свою безграмотность продемонстрировали.
Green, прежде чем ругать чужой, работающий код, да еще с таким наездом, подумали бы хорошенько. Если чего не понятно могли бы спросить и вам бы ответили.
А так, вы только свою безграмотность продемонстрировали.
nibelung - а что так резко-то? Критики не любите?
"Работающий код" не принято ругать в одном случае - когда он делает что-то важное, что до него никому не удавалось. Вы выложили элементарнейшую мигалку на эффекте интерференции - а ведете себя так, будто как минимум теорему Ферма решили...
Что касакется "безграмотности" - я бы поспорил. Попытайтесь обосновать, зачем вы написали 23u
Попытайтесь обосновать, зачем вы написали 23u
Чтобы объяснить компилятору, что это unsigned константа. По умолчанию все константы имеют тип int (знаковый).
nibelung - а что так резко-то? Критики не любите?
А где там критика? Только самоутверждение за счет новичка. Вот этого не люблю.
Нибелунг! Ща я встану и напишу пост в защиту тебя. Все у тебя правильно. Может слегка избыточно, но правильно и красиво.
Не будь нежным таким, как кожа на залупе, только больше троллить станут.
Некоторые перегибают в чморении новичков. Прости им. ;))
Спасибо на добром слове.
Им простил :))
Чтобы объяснить компилятору, что это unsigned константа. По умолчанию все константы имеют тип int (знаковый).
где ты увидал в этом выражении константу?
Ну вот, троллинг продолжается :)))
где ты увидал в этом выражении константу?
А где ты увидал в этом выражении переменную?
Не будь нежным таким, как кожа на ....
Сразу представилось общение тертого жизней члена форума с молодым и нежным.
"избыточно" и "красиво" вряд ли могут быть синонимами, когда мы говорим о программировании.
Добавление скобок и "u" к величине, применяемой не в составе выражения. а отдельно - скорее свидетесльствует о том, что автор не понимает, что пишет.
Изначально еще хотел написать о избыточности явного приведения разности двух байт к типу uint8_t - но подумал, что сам, наверно, написал бы так же - просто на автомате, чтобы не задумыватся о том, какой тип тут примет компилятор. Но вряд ли такой кастинг "на всякий случай" говорит в пользу "грамотности". скорее просто лень :)
Изначально еще хотел написать о избыточности явного приведения разности двух байт к типу uint8_t - но подумал, что сам, наверно, написал бы так же - просто на автомате, чтобы не задумыватся о том, какой тип тут примет компилятор.
Вот это, кстати, интересное замечание. Написал так, именно на автомате. Потом убрал приведение типа, ибо выглядит немного громоздко. Убедился, что компилятор, ожидаемо, ошибся. И вернул приведение типа на место.
Короче. Влад.
когда встанешь - с радостью выслушаю твою лекцию, зачем тут в выражении
скобки и "u" . Только не вообще, а конкретно в этом коде, из первого сообщения.
PS нибелунг - вопрос конкретному человеку, не вам
Так себе код. Если добавить другую нагрузку, то будет работать плохо. Даже как учебный не годится - слишком специфичный и мудреный.
Короче. Влад.
когда встанешь - с радостью выслушаю твою лекцию, зачем тут в выражении
скобки и "u" . Только не вообще, а конкретно в этом коде, из первого сообщения.
PS нибелунг - вопрос конкретному человеку, не вам
По поводу неуместности Фединого toggle() в данном коде вопросов нет, надеюсь? Ок.
Сразу ответ: в этом конкретном случае ни скобки ни u не нужны. "Но есть один нюанс!" ;))
Это очень правильный подход - всегда ставить скобки и явное указание типа константы в макросах.
Макросы, в отличии от констант и константных выражений не позволяют указать тип иным способом. Макрос подставляется просто графически, как есть. Сколько уже тут было "вычислителей" времени в макросах с криками: "Памагити ниработаит!"? Так вот явное указание типа не меняет размер или скорость кода, но делает его читаемым и легко сопроводжаемым. То же касается скобок. Ставь их вообще всегда, не задумываясь, иначе будет, как в эпическом фейле Архата с его макросом, который работал ТОЛЬКО потому, что Архат, по дурости, скобки не поставил. ;)))
То есть скобки и "u" - это просто полезные привычки, как комментарии, расстановка фигурных скобок, скобки вокруг единственного оператора в if, while, for и прочее. Указывать на это, как на ошибку - высокомерие, больше похожее на дурость, уж прости.
Ух ты! Да, получилось не красиво. nibelung, я извиняюсь. По трезвому выглядит совсем иначе.(
Изначально еще хотел написать о избыточности явного приведения разности двух байт к типу uint8_t - но подумал, что сам, наверно, написал бы так же - просто на автомате, чтобы не задумыватся о том, какой тип тут примет компилятор.
Вот это, кстати, интересное замечание. Написал так, именно на автомате. Потом убрал приведение типа, ибо выглядит немного громоздко. Убедился, что компилятор, ожидаемо, ошибся. И вернул приведение типа на место.
Компилятор ошибся? - он у вас китайский. наверно...
проверим? - первое условие - без приведения типа, второе - с оным.
результат
как видите, результат одинаков на всех возможных значениях
Green, я тоже немного погорячился, Простите если обидел.
То есть скобки и "u" - это просто полезные привычки, как комментарии, расстановка фигурных скобок, скобки вокруг единственного оператора в if, while, for и прочее.
с этим согласен. Но это как раз те самые замечания "вообще", которых я просил избежать. В конкретном коде эти элементы не обязательны, согласен? и потому Грин не так уж неправ - и уж точно его не за что было обвинять в "беграмотности".
А если рассматривать вообще :) - то подавать свой элементарный код как что-то, "отлитое в бронзе", где уже нельзя поправить ни одну букву - вот это как раз глупость и заносчивость...
Изначально еще хотел написать о избыточности явного приведения разности двух байт к типу uint8_t - но подумал, что сам, наверно, написал бы так же - просто на автомате, чтобы не задумыватся о том, какой тип тут примет компилятор.
Вот это, кстати, интересное замечание. Написал так, именно на автомате. Потом убрал приведение типа, ибо выглядит немного громоздко. Убедился, что компилятор, ожидаемо, ошибся. И вернул приведение типа на место.
Компилятор ошибся? - он у вас китайский. наверно...
проверим? - первое условие - без приведения типа, второе - с оным.
результат
как видите, результат одинаков на всех возможных значениях
Так уж и "на всех возможных значениях"?
"clk1" вы менять поленились, а ошибки проявляются, когда происходит переполнение.
Так уж и "на всех возможных значениях"?
"clk1" вы менять поленились, а ошибки проявляются, когда происходит переполнение.
Свою точку зрения кодом я подтвердил.
Если не согласны - давайте сделаем так. Вы выкладываете коротенький код, который демонстрирует, что с приведением типа и без него условие if формирует разный результат - тогда и обсудим.
Немного поправил ваш код.
разница совсем небольшая, только clk1 инициализировал отличным от нуля значением.
а вот вывод
как видите не везде результат одинаков.
ок, очко в вашу пользу
ок, очко в вашу пользу
Упрямый, но честный! ;))
Это же история, как раз из той области, в которой был мой срач с Андриано. Неявное преобразование между знаковым и беззнаковым. Если не поставить явное преобразование, то будут эти самые грабли. Как же можно забыть такую тему? ;))))
Код на интерференции двух волн не элементарный, а красивый, признай. Много тут новичков, способных выдать такое?
И нормально оформленное. Поправить "ради красоты" там можно только строчку:
заменив на:
или просто
;))))))
Я намекал на такое. Хотя знаю, что Влад это не приветствует.
Я намекал на такое. Хотя знаю, что Влад это не приветствует.
Такое тоже работать будет, но есть маааленький косячок.
Когда условия по INTERVAL1 и INTERVAL2 выполнятся на одном проходе Loop, у вас на диоде получится очень короткий импульс, а по задумке его там быть не должно.
Я намекал на такое. Хотя знаю, что Влад это не приветствует.
Такое тоже работать будет, но есть маааленький косячок.
Когда условия по INTERVAL1 и INTERVAL2 выполнятся на одном проходе Loop, у вас на диоде получится очень короткий импульс, а по задумке его там быть не должно.
Вот именно про это я написал, когда сказал, что Федин toggle() неуместен.
И еще
Это, все таки, объявление глобальных переменных с областью видимости, ограниченной, функцией Loop. Их желательно явно инициализировать.
И еще
Это, все таки, объявление глобальных переменных с областью видимости, ограниченной, функцией Loop. Их желательно явно инициализировать.
а тут ты неправ... ;))) хороший тон, но необязательно. Ну и слово "глобальные" совершенно не к месту и не в тему.
Пожалуйста объясните, зачем объявлять переменные локально для проектов на МК. Я понимаю зачем для ББ, но МК? Программа память не экономит. Несколько подпрограмм и так разберуться какие переменные используются, а если про волатильные вспомнить - всё равно приходится глобальными объявлять. На хороший тон не ссылаться. Есть ли какие ни будь другие преимущества? В циклах можно областью видимости обойтись.
И еще
Это, все таки, объявление глобальных переменных с областью видимости, ограниченной, функцией Loop. Их желательно явно инициализировать.
а тут ты неправ... ;))) хороший тон, но необязательно. Ну и слово "глобальные" совершенно не к месту и не в тему.
Дык я и написал "желательно", а не "обязательно". Именно хороший тон.
По поводу слова "глобальный" спорить не буду.
staticheskie-lokalnye-peremennye
"Когда static применяется к локальной переменной, это приводит к тому, что компилятор создает долговременную область для хранения переменной почти таким же способом, как это делается для глобальной переменной. Ключевое различие между статической локальной и глобальной переменными заключается в том, что статическая локальная переменная остается известной только в том блоке, в котором она была объявлена. Проще говоря, статическая локальная переменная - это локальная переменная, сохраняющая свое значение между вызовами функций."
Пожалуйста объясните, зачем объявлять переменные локально для проектов на МК. Я понимаю зачем для ББ, но МК? Программа память не экономит. Несколько подпрограмм и так разберуться какие переменные используются, а если про волатильные вспомнить - всё равно приходится глобальными объявлять. На хороший тон не ссылаться. Есть ли какие ни будь другие преимущества? В циклах можно областью видимости обойтись.
Ни за чем, кроме хорошего тона и удобства сопровождения. Ничто так не кричит об "авторе-чайнике", как обилие глобалов. Даже сам, через (для меня) два-три месяца, уже не помнишь, что и для чего заведено. Объявления статиков там, где они используются, дает возможность вспомнить подробности. Это не говоря про совместную разработку. Тут даже комментировать нечего.
Короче так: если в программе много глобальных переменных - лучше не платить такому автору вообще! ;))) Ну я бы не стал и клиентам бы не посоветовал! ;))
"Когда static применяется к локальной переменной, это приводит к тому, что компилятор создает долговременную область для хранения переменной почти таким же способом, как это делается для глобальной переменной. Ключевое различие между статической локальной и глобальной переменными заключается в том, что статическая локальная переменная остается известной только в том блоке, в котором она была объявлена. Проще говоря, статическая локальная переменная - это локальная переменная, сохраняющая свое значение между вызовами функций."
Это ты дискуссию со мной предлагаешь? ;)) Очень мило, с твоей стороны, но я, пожалуй, воздержусь. ;))
"Когда static применяется к локальной переменной, это приводит к тому, что компилятор создает долговременную область для хранения переменной почти таким же способом, как это делается для глобальной переменной. Ключевое различие между статической локальной и глобальной переменными заключается в том, что статическая локальная переменная остается известной только в том блоке, в котором она была объявлена. Проще говоря, статическая локальная переменная - это локальная переменная, сохраняющая свое значение между вызовами функций."
Это ты дискуссию со мной предлагаешь? ;)) Очень мило, с твоей стороны, но я, пожалуй, воздержусь. ;))
Завсегда приятно поговорить с умным и образованным человеком ;)) Но нет, я же признал, что слово "глобальные" там не совсем в тему.
Это ты дискуссию со мной предлагаешь? ;)) Очень мило, с твоей стороны, но я, пожалуй, воздержусь. ;))
какой-то ты, Влад, сегодня, не такой :) Не заболел? :) не чувствуется привычной бодрости в общении с новичками :)
Это ты дискуссию со мной предлагаешь? ;)) Очень мило, с твоей стороны, но я, пожалуй, воздержусь. ;))
какой-то ты, Влад, сегодня, не такой :) Не заболел? :) не чувствуется привычной бодрости в общении с новичками :)
последствия Короны сказываются и, как показала практика у каждого они свои ...
таки и не понял почему всё таки не?:
таки и не понял почему всё таки не?:
Да можно и так. Ошибкой не будет использование любого варианта. Так что, это из разряда личных предпочтений.
таки и не понял почему всё таки не?:
Да можно и так. Ошибкой не будет использование любого варианта. Так что, это из разряда личных предпочтений.
я бы не был столь категоричным, если тип переменной bool, то это даёт экономию памяти программ 2 байта и памяти ОЗУ байт... если применять не битовую математику для изменения значения переменной...точнее знающие подскажут
таки и не понял почему всё таки не?:
Да можно и так. Ошибкой не будет использование любого варианта. Так что, это из разряда личных предпочтений.
я бы не был столь категоричным, если тип переменной bool, то это даёт экономию памяти программ 2 байта и памяти ОЗУ байт... если применять не битовую математику для изменения значения переменной...точнее знающие подскажут
Я бы с вами согласился, если бы тип int менялся на bool. Но, в данном случае, меняется uint8_t на bool. Оба типа размерностью в один байт, так что экономии не будет.
Если рассматривать данную функцию с точки зрения практического применения, то очевидно, что для нормальной работы она требует стабильного короткого цикла и вызов ее в основном лупе не всегда приведет к корректной её работе. Например в блинке с делеями она работать не будет. Выход - разместить функцию в прерывании таймера, например вариант в TMR0: