Сравнение с функцией millis()

  Рет қаралды 17,812

Arduino и прочие питомцы

Arduino и прочие питомцы

Күн бұрын

Пікірлер: 49
@TyurinAlexey
@TyurinAlexey 5 жыл бұрын
Скачал на всякий случай ролик, такая годнота на ютюбе не часто!!! Понимаю все со скрипом, читаю книги и пересматриваю ролики и с каждым разом все больше и больше понимания материала. Спасибо вам!!!
@NeObzor58
@NeObzor58 6 жыл бұрын
Спасибо, не придавал значения таким тонкостям, а теперь буду! хотя в нашей деревне электричество вырубают регулярно, заботятся видимо, чтоб не было переполнения))
@Тортоворот
@Тортоворот 6 жыл бұрын
Отключения происходят каждые ~50 дней? Наверняка так и есть. =)
@1wonderus841
@1wonderus841 5 жыл бұрын
видимо delay и break срабатывает
@DDRcom
@DDRcom 6 жыл бұрын
спасибо, все аргументированно и доступно объяснено. С первым видом записи был знаком и сознательно использовал, а вот второй вариант с приведением к знаковому- хорошая идея. Еще раз благодарен за идею.
@romafeelcame7982
@romafeelcame7982 4 жыл бұрын
Статья на хабре недавно выходила. Как в самолетах боинг борются с переполнением? Решение очень "элегантное": они перезапускают электронику самолета каждые 274 дня ;-)
@iNurble
@iNurble 6 жыл бұрын
Продолжения бы годных проектов. Далеко не все тут программисты. В расчете на адекватное осознание этого комментария.
@АндрейЛенин-п2у
@АндрейЛенин-п2у 3 жыл бұрын
что бы небыло переполнений, можно ли сделать на устройстве режим выкл, когда с выходов ничего не пойдет, произойдет безопасное отключение периферии и в конце сделать сброс таймера, это актуально для систем которые обесточиваются в конце дня или при выключении питания счетчики обнуляются?
@rogo7330
@rogo7330 3 жыл бұрын
Насколько стандартные настройки этих всяких ардуиновских millis и micro надёжно работают при передаче данных на больших скоростях, допустим при взаимодействии с радиомодулем или по usb с компом на больших скоростях? (больших - это например 1.5 Мбит/с, не жалкие 9600 стандартных бод в каждом проекте)
@alexmorozov73
@alexmorozov73 3 жыл бұрын
Функции работают на отсчетах аппаратного таймера, т.е. сами по себе отсчеты точны. Но учитывая время исполнения кода на 16 МГц 8 битах... Предельно короткие задержки даже на ассемблере трудно сделать стабильными.
@rogo7330
@rogo7330 3 жыл бұрын
@@alexmorozov73 хмм, ну ладно. Просто хотелось бы избежать перепиливания ардуиновских библиотек в работоспособное для этих целей состояние, но, если вы правы, проще свою оптимизацию сделать
@denisk4989
@denisk4989 3 жыл бұрын
Чем цикл отличается от delay? И там и там бесполезно обращатся к процессору, пока цикл не закончится.
@alexmorozov73
@alexmorozov73 3 жыл бұрын
Для ESP8266 delay() обеспечивает поддержку стека WiFi и кормление сторожевого пса, там длинные циклы - верный путь к перезагрузке или потере пакетов WiFi.
@SergeyBelotserkovskiy
@SergeyBelotserkovskiy 6 жыл бұрын
Спасибо было интересно, если я правильно понял millis() можно использовать для своего таймера, так что-бы милисекунды считались с момента запуска функции таймера, а при каждом новом вызове, просто обновлять стартовое значение полученное из millis(). Допустим если программа будет работать как простые часы, что произойдет через 49 дней с такими часами?
@alexmorozov73
@alexmorozov73 6 жыл бұрын
Через 49,7 дней "часы" видимо вернутся в "прошлое" и так по кругу.
@avazart614
@avazart614 4 жыл бұрын
Да все просто заводятся доп. переменные для дней,часов, минут. Но на практике это не нужно ведь есть довольно точные модули часов реального времени с батарейкой которые решают почти все проблемы.
@TyurinAlexey
@TyurinAlexey 5 жыл бұрын
Ответьте на единственный вопрос. Так как millis не очень корректно на ардуино работает, как я понимаю можно использовать micros по такому же алгоритму?
@alexmorozov73
@alexmorozov73 5 жыл бұрын
А что не так с millis? И millis и micros работают на таймерах. Соответственно, разница только в точности. И 32-х битный micros может считать всего на 71.5 мин. в отличие от 49+ суток миллисекунд в millis. А само сравнение с переполнением, естественно, будет одинаковым.
@TyurinAlexey
@TyurinAlexey 5 жыл бұрын
@@alexmorozov73 Дело в том что я на Драйве читал статьи и люди фото прилагали что с миллис время за сутки на ардуино с реальным отсчетом не совпадает более чем на 10 минут, с микрос дела лучше. Потом посмотрел это видео kzbin.info/www/bejne/o2S5moehrrWIgdE 16:14 рассказывает о том что на ардуино не гарантирован по точности счетчик, то есть если запрошено 3 миллисекунды то они могут истечь через 1 миллисекунду, как по вашим наблюдениям есть такая проблема? Спасибо за ответ!
@alexmorozov73
@alexmorozov73 5 жыл бұрын
Макетируйте! Добавьте к AVR RTC-часы и раз в час сверяйте время из часов и показания millis. Сами все узнаете. А на конкретных платах и кварц может быть нестабильным, и питание ненадежным, все это может оказать влияние на стабильность таймеров.
@TyurinAlexey
@TyurinAlexey 5 жыл бұрын
@@alexmorozov73 Все понятно, спасибо большое!
@avazart614
@avazart614 4 жыл бұрын
@@TyurinAlexey Честно говоря я тоже смотрел это видео и так и не понял что Автушенко имел ввиду.
@АлександрЗаг-м9о
@АлександрЗаг-м9о 6 жыл бұрын
Сколько этих функций может работать одновременно? Как обнулить эту функцию?
@alexmorozov73
@alexmorozov73 6 жыл бұрын
Что за абсурдные вопросы? Вы ВЫЗЫВАЕТЕ функцию, она не работает, а просто при очередном вызове возвращает текущее значение на основании таймера. Зачем ее обнулять?
@АлександрЗаг-м9о
@АлександрЗаг-м9о 6 жыл бұрын
Alex Morozov Давайте разберём на примере. Имеется концевик и пир датчик. Из нагрузки освещение и вентилятор. Свет зависит от датчиков а вентилятор от времени. Дэлэй невыгоден - можно пропустить срабатывания датчиков. С функцией милис весь цикл работать должен без сбоев и остановок.
@КлайвСинклер-е6ю
@КлайвСинклер-е6ю 6 жыл бұрын
Автору: Совет - для перехода на слово вперед/назад юзай стрелки + Ctrl - для выделения слова к вышеуказанному добавь Shift. Не будет лишних движений (так сказать не будем оленями :) )
@alexmorozov73
@alexmorozov73 6 жыл бұрын
"А мужики то не знают!" (С) :) Меня и так ругают, что я слишком быстро что-то делаю. Чаще всего я делаю что-то неоптимальным образом просто чтобы подумать, что сказать дальше, потому что снимаю без "черновиков" и плана.
@КлайвСинклер-е6ю
@КлайвСинклер-е6ю 6 жыл бұрын
Ясно. В целом лекции отличные. И даже меньше по обьему за раз идут на пользу. Лет 15 назад я говорил, что С не для меня (писал исключительно на Дельфи) Но увлечение программированием и контроллерами сделали свое дело - вот я уже и программирую ардуино, потому как легче сделать самому, чем найти действительно грамотного человека. С вашими уроками стало полегче в понимании С++ за что ОГРОМНОЕ СПАСИБО. Буду премного благодарен, если рассмотрите вопрос общения нескольких *дуин по интерфейсу RS-485, потому как опыта мало и написание сей возможности идет пока совково :(
@КлайвСинклер-е6ю
@КлайвСинклер-е6ю 6 жыл бұрын
Да и еще забыл - может вы знакомы с модулем Yun Shield ? - (трудности с пониманием его программирования)
@alexmorozov73
@alexmorozov73 6 жыл бұрын
Yun не видел. Так что увы. Живу по заветам Медведа, т.е. держусь. :)
@drago285
@drago285 5 жыл бұрын
Прошу помощи, пожалуйста разжуйте мне как это понять: stepTime = 1; void loop(){ millisStart = millis(); while(millis() - millisStart < stepTime){ do{ ... }while(условие) millisStart = 0L; } ... } плюс возможно увеличение / уменьшение stepTime во время выполнения кода. Как (millis() - millisStart < stepTime) может оставаться истиной, или когда оно может быть истиной?
@alexmorozov73
@alexmorozov73 5 жыл бұрын
Это что за поток сознания? :) За 1 мс. процессор на 16 МГц выполняет до 16 млн. простейших операций (в среднем по 2-4 такта на операцию, т.е. 4-8 млн. операций). Значит первый while до 1 мс. может повторяться без проблем. А чтобы менять переменную условия цикла в самом цикле и точно не зависеть от оптимизации компиллятора, ее можно объявить с ключевым словом volatile, что запретит оптимизировать код с ней.
@drago285
@drago285 5 жыл бұрын
@@alexmorozov73 Вот как я понимаю: присваиваем millisStart текущее значение millis(), и допустим это абстрактные 28 микросекунд, далее переходим к следующей процедуре, и наверняка значение millis увеличилось, ну допустим до 29 микросекунд, так вот : while нас спрашивает: (millis() - millisStart < stepTime), то есть (29-28
@alexmorozov73
@alexmorozov73 5 жыл бұрын
Миллисекунды! Еще раз говорю, millis() увеличится через 1 мс. Это не так уж и мало. Код выглядит странно в любом случае. Особенно присвоение 0 переменной, которая из millis() вычитается, делая сравнение бессмысленным, вместо break, если уж нужно из цикла выйти. А само исполнение кода от кривизны реализации не зависит и оно очевидно. Не понимаю в чем вопрос. Вы и так описали как оно работает.
@drago285
@drago285 5 жыл бұрын
@@alexmorozov73 если я правильно описал как оно работает, то теперь и я задаюсь вопросом: а чё не break? спасибо за помощь
@avazart614
@avazart614 4 жыл бұрын
А откуда этот код? Что там за "условие"?
@romafeelcame7982
@romafeelcame7982 4 жыл бұрын
//1) вариант первый. простой #define TIMEOUT 60000 uint32_t start = millis(); while(millis() - start < TIMEOUT) {/*_*/} // //2) вариант второй. когда TIMEOUT сложное и хочется определить его заранее uint32_t Timeout = 1000*60; uint32_t stop = millis() + Timeout; while((int32_t)(millis() - stop) < 0) {/*_*/} //изм.
@alexmorozov73
@alexmorozov73 4 жыл бұрын
Второй вариант нерабочий полностью, более того, компилятор цикл с условием беззнаковое меньше 0 скорее всего вообще выкинет. Если сравнивать с окончательным значением, то оба аргумента надо приводить к знаковому типу, тогда переполнение не страшно.
@avazart614
@avazart614 4 жыл бұрын
Если коротко - на практике нет никакой проблемы переполнения. Очень мало вероятно что интервалы которые нужно будет будут близки к ~49дням Естественно если проверяется правильным способом через if(millis()-start >= interval) { // timeout event } И главное конечно использовать unsigned long, а не какие то левые типы.
@androidpasha
@androidpasha 4 жыл бұрын
Ага, диспетчерская аэропорта как то переполнилась и на несколько часов потеряла видимость самолётов.
@androidpasha
@androidpasha 4 жыл бұрын
Stop=millis()+timeout; while(millis()
@alexmorozov73
@alexmorozov73 4 жыл бұрын
В одно ухо влетело, из другого вылетело?
@АлексейСергеев-з9м
@АлексейСергеев-з9м 4 ай бұрын
...тупо сравниваем,остро вычитаем,нежно делим, сладко используем.Где найти аписание аленьей логики?
@vladimirsagabalk1364
@vladimirsagabalk1364 4 жыл бұрын
(Сначала дисклаймер: если автор адекватный, то поймет, а если нет, то может не читать этот коммент) Спасибо! Понимаю, что Вам мое спасибо, как клизма мертвому, но мне похрен, я спасибо не для Вас говорю, а для себя.. Но если вы человек с толстой душевной организацией (не ООО и не ИП, а OAO ну или хотя б ЗАО). Блин я запутался.. ну да хрен с ним. Крч. Спасибо.. реально годный материал! // !сарказм
@MrDacnick
@MrDacnick Жыл бұрын
isTimer(unsigned long startTime, unsigned long period) { unsigned long currentTime; currentTime = millis(); if (currentTime>= startTime) { return (currentTime>=(startTime + period)); } else { return (currentTime >=(4294967295-startTime+period)); } }
Размер структур и классов в программах на ESP8266
26:48
Arduino и прочие питомцы
Рет қаралды 4,4 М.
Уроки Arduino: энергосбережение и сон
19:03
Заметки Ардуинщика
Рет қаралды 121 М.
Каха и лужа  #непосредственнокаха
00:15
Motorbike Smashes Into Porsche! 😱
00:15
Caters Clips
Рет қаралды 17 МЛН
Фишки Arduino, о которых ты не знал!
13:37
Заметки Ардуинщика
Рет қаралды 114 М.
#16.2 Millis Таймер. Arduino
24:56
Maksym Hrom
Рет қаралды 14 М.
PlatformIO или прощай, Arduino IDE
35:23
Arduino и прочие питомцы
Рет қаралды 158 М.
Работа с функциями времени Ардуино
24:34
Dmitry Kuznetsov
Рет қаралды 1,8 М.
Убийца Arduino
10:12
Паяльник TV
Рет қаралды 125 М.
Советский мультфильм про нашу жизнь !
13:49
Дедушка Аргентинца
Рет қаралды 6 МЛН
Уроки Ардуино. Прерывания по таймеру
9:04
Заметки Ардуинщика
Рет қаралды 108 М.
Каха и лужа  #непосредственнокаха
00:15