FOR statement and MILLIS
- Войдите на сайт для отправки комментариев
Вс, 17/04/2016 - 20:59
вечер добрый
что за ерунда творится с фором.
как только ставлю иф все прекрасно работает как только ставлю фор то переменные хранящие миллис больше не работают.
...здесь код for (;stop < start+1000;) // 1 sec block { if (digitalRead(trig)) {break;} stop = millis(); } ... здесь другой код
старт и стоп миллисы. не обновляются.
нужен фор т.к. если ифами сильно код усложняется. потому что надо чтоб всю секунду (или инное время) указатель не выходил из этой области...
пока ничего не приходит в голову
что за ерунда творится с фором.
Ничего с ним не творится. "Разруха, она в головах".
А как-то поцелее код нельзя показать? Не такой маленький огрызок?
Что Вы понимаете под "переменные не работают"? Можно сказать как Вы хотите и как получается?
Наконец, приведите код с if (где "переменные работают") для сравнения.
И, ещё, зачем for, у которого первое и третье выражение пусты? Он полностью эквивалентен while с менее идиотским синтаксисом.
Да пребудет с Вами While Всемогущий :
первое и третье потому что не нужны :)
Antaris думал от переменны мест слаг-оперируемых ничего не поменяется. ок сейчас проверю while и отпишусь
а то было уже собирался if-goto юзать
первое и третье потому что не нужны :)
Так и юзайте while
думал от переменны мест слаг-оперируемых ничего не поменяется
Изучите арифметику в дополнительном коде. Так как Вы написали сломается при переполнении, а так, как коллега - нет.
ок сейчас проверю while и отпишусь
Когда не получится, всё-таки выложите нормальный код и нормально объясните что именнно не работает.
да нет. ничего не поменялось. внутри while/for millis не растет
получается это связано
ИЛИ с тем что - пока фор/ваил не закончится основной ардуиновский луп замораживается
ИЛИ с тем что - https://123d.circuits.io где я проверяю код глючит
последний пункт сейчас проверю в другой виртуалке
ИЛИ с тем что - пока фор/ваил не закончится основной ардуиновский луп замораживается
Так и есть. А Вы чего ждали?
В общем, если бы Вы выложили код, как я Вас просил час назад, проблема давно была бы решена, но Вы хотите решать её самостоятельно. Удачи!
от помощи не отказываюсь но и самому думать надо ведь :)
вот весь код. изначально и был весь код но вот теперь прям весь весь :)
не хватает смекалки програмиста профессионала, чтобы легко и не принужденно изменить мой кусочек кода при котором и "фокус" не будет убегать и миллис будет работать
Так и есть. А Вы чего ждали?
я ждал не смотря на "замкнутость" форыча что миллис работать будет. а почему ему бы не работать !? форыч может быть на 1 мин или 1 час! и значит миллис тоже растет все это время
я понимаю что форыч на час может не совсем рациональный код. но и делей при блинкинге не запрещается хоть и не приветствуется
noInterrupts(); в приведённом скетче с какой целью в loop() вставлено ?
чтоб не отвлекались мощности МК на проверку прерываний. необходима продолжительная работа от батареек. с засыпаниями потом буду разбираться. сейчас с форычем загвоздка
Спросите-ка себя, а нет ли тут тайного влияния noInterrupts() на millis() ?
Или просто почитайте http://stackoverflow.com/questions/17135805/does-arduinos-clock-millis-continue-counting-in-the-background-during-interru
хм. спасибо почитал. в принципе по линке про noInterrupts ни слова и речь только что при длительных прирываниях (более 1 мс) будет смещение у миллиса. правда не говорится какое.
НО
я убрал noInterrupts и все работает как надо. поставил и опять не растет миллиса внутри форыча :)
спасибо но тогда вопрос как НЕ убирая noInterrupts сделать так чтобы миллис работал правильно. пусть даже изменив красиво код ?
как НЕ убирая noInterrupts сделать так чтобы миллис работал правильно. пусть даже изменив красиво код ?
На какое-то малое время придётся-таки разрешать прерывания.
Если позволите, замечу, что noInterrupts() в качестве средства экономии электроэнергии мне представляется, мягко говоря, бесполезным.
возможно вы и правы.
noInterrupts почитал вырубает все прервывания. а миллис одно из них. теперь понятно спасибо.
впринципе можно я думаю обойтись счетчиком циклов. зная частоту МК можно примерно прикинуть сколько циклов в 1мс. самодельный таймер инкрементный сделать так сказать. что скажите ? какие подводные камни
Смысла не вижу, от слова "совсем". Я бы посоветовал просто убрать noInterrupts() из этого скетча.
вот как раз "засыпания" у тебя и будут по прерываниям
если хочешь энергосбережения почитай про спящий режим
да и делай все блоками, а то ты думал об одном и тут же сюда влепил кусок от другой идеи
ну вот я и хотел уйти от них. раз приходиться оставлять их включенными... тогда событие
-alarm (или нажатие кнопки или цифровой датчик какойнить)
-trig (кнопка сброса)
повешу на прерывание, но не понимаю как сделать (тем более в ардуино) чтоб до наступления алармы МК тупо спал. спал все время пока прерывание не сработает.
видел в ардуино както вставляют вроде СИшные куски кода... вот наверно ими надо усыпить МК пока прерывание его не пробудит.
натолкните на мысль ?
http://arduino.ru/forum/obshchii/spyashchii-rezhim
вот почитай