FOR statement and MILLIS

alexbmd
Offline
Зарегистрирован: 15.01.2016

вечер добрый

 

что за ерунда творится с фором.

как только ставлю иф все прекрасно работает как только ставлю фор то переменные хранящие миллис больше не работают.

...здесь код
for (;stop < start+1000;) // 1 sec block
{
if (digitalRead(trig)) {break;}
stop = millis();
}
... здесь другой код

 

старт и стоп миллисы. не обновляются.

нужен фор т.к. если ифами сильно код усложняется. потому что надо чтоб всю секунду (или инное время) указатель не выходил из этой области... 

пока ничего не приходит в голову

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

alexbmd пишет:

что за ерунда творится с фором.

Ничего с ним не творится. "Разруха, она в головах".

А как-то поцелее код нельзя показать? Не такой маленький огрызок?

Что Вы понимаете под "переменные не работают"? Можно сказать как Вы хотите и как получается?

Наконец, приведите код с if (где "переменные работают") для сравнения.

И, ещё, зачем for, у которого первое и третье выражение пусты? Он полностью эквивалентен while с менее идиотским синтаксисом.

Araris
Offline
Зарегистрирован: 09.11.2012

alexbmd пишет:
надо чтоб всю секунду (или инное время) указатель не выходил из этой области... 

Да пребудет с Вами While Всемогущий :

start = millis();
while ( millis() - start <= 1000 )
{

// всё, что пожелаете в течение секунды, или иного промежутка времени
// с breakом и танцовщицами...

}

 

 

alexbmd
Offline
Зарегистрирован: 15.01.2016

первое и третье потому что не нужны :)

Antaris думал от переменны мест слаг-оперируемых ничего не поменяется. ок сейчас проверю while и отпишусь

а то было уже собирался if-goto юзать

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

alexbmd пишет:

первое и третье потому что не нужны :)

Так и юзайте while

alexbmd пишет:

думал от переменны мест слаг-оперируемых ничего не поменяется

Изучите арифметику в дополнительном коде. Так как Вы написали сломается при переполнении, а так, как коллега - нет.

alexbmd пишет:

ок сейчас проверю while и отпишусь

Когда не получится, всё-таки выложите нормальный код и нормально объясните что именнно не работает.

 

 

alexbmd
Offline
Зарегистрирован: 15.01.2016

да нет. ничего не поменялось. внутри while/for millis не растет

получается это связано

ИЛИ с тем что - пока фор/ваил не закончится  основной ардуиновский луп замораживается 

ИЛИ с тем что - https://123d.circuits.io где я проверяю код глючит

 

последний пункт сейчас проверю в другой виртуалке

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

alexbmd пишет:

ИЛИ с тем что - пока фор/ваил не закончится  основной ардуиновский луп замораживается 

Так и есть. А Вы чего ждали?

В общем, если бы Вы выложили код, как я Вас просил час назад, проблема давно была бы решена, но Вы хотите решать её самостоятельно. Удачи!

alexbmd
Offline
Зарегистрирован: 15.01.2016

от помощи не отказываюсь но и самому думать надо ведь :)

void loop()
  {
	noInterrupts();
	if (digitalRead(dHum)) //alarm
		{
			digitalWrite(led,!digitalRead(led));
			digitalWrite(buz,HIGH);
			unsigned long start = millis();
			while (millis()-start < 1000) //focus 15 min
				{
				if (digitalRead(trig)) {break;} //extra exit
                                //some code
				}
		}
	digitalWrite(buz,LOW);
  }

 

вот весь код.   изначально и был весь код но вот теперь прям весь весь :)

 

не хватает смекалки програмиста профессионала, чтобы легко и не принужденно изменить мой кусочек кода при котором и "фокус" не будет убегать и миллис будет работать

alexbmd
Offline
Зарегистрирован: 15.01.2016

ЕвгенийП пишет:

 

Так и есть. А Вы чего ждали?

 

 

я ждал не смотря на "замкнутость" форыча что миллис работать будет. а почему ему бы не работать !?  форыч может быть на 1 мин или 1 час!  и значит миллис тоже растет все это время

 

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

Araris
Offline
Зарегистрирован: 09.11.2012

noInterrupts(); в приведённом скетче с какой целью в loop() вставлено ?

alexbmd
Offline
Зарегистрирован: 15.01.2016

чтоб не отвлекались мощности МК на проверку прерываний. необходима продолжительная работа от батареек. с засыпаниями потом буду разбираться. сейчас с форычем загвоздка

Araris
Offline
Зарегистрирован: 09.11.2012

Спросите-ка себя, а нет ли тут тайного влияния noInterrupts() на millis() ?

Или просто почитайте http://stackoverflow.com/questions/17135805/does-arduinos-clock-millis-continue-counting-in-the-background-during-interru

alexbmd
Offline
Зарегистрирован: 15.01.2016

хм. спасибо почитал. в принципе по линке про noInterrupts ни слова и речь только что при длительных прирываниях (более 1 мс)  будет смещение у миллиса. правда не говорится какое.

НО

я убрал noInterrupts и все работает как надо. поставил и опять не растет миллиса внутри форыча :)

спасибо но тогда вопрос как НЕ убирая noInterrupts сделать так чтобы миллис работал правильно.  пусть даже изменив красиво код ?

Araris
Offline
Зарегистрирован: 09.11.2012

alexbmd пишет:

как НЕ убирая noInterrupts сделать так чтобы миллис работал правильно.  пусть даже изменив красиво код ?

На какое-то малое время придётся-таки разрешать прерывания.

Если позволите, замечу, что noInterrupts() в качестве средства экономии электроэнергии мне представляется, мягко говоря, бесполезным.

alexbmd
Offline
Зарегистрирован: 15.01.2016

возможно вы и правы.

noInterrupts почитал вырубает все прервывания. а миллис одно из них. теперь понятно спасибо.

впринципе можно я думаю обойтись счетчиком циклов. зная частоту МК  можно примерно прикинуть сколько циклов в 1мс. самодельный таймер инкрементный сделать так сказать. что скажите ? какие подводные камни

Araris
Offline
Зарегистрирован: 09.11.2012

Смысла не вижу, от слова "совсем". Я бы посоветовал просто убрать noInterrupts() из этого скетча.

James
Offline
Зарегистрирован: 26.02.2016

вот как раз "засыпания" у тебя и будут по прерываниям

если хочешь энергосбережения почитай про спящий режим

да и делай все блоками, а то ты думал об одном и тут же сюда влепил кусок от другой идеи

alexbmd
Offline
Зарегистрирован: 15.01.2016

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

-alarm  (или нажатие кнопки или цифровой датчик какойнить)

-trig  (кнопка сброса)

повешу на прерывание, но не понимаю как сделать (тем более в ардуино) чтоб  до наступления алармы МК тупо спал. спал все время пока прерывание не сработает.

видел в ардуино както вставляют вроде СИшные куски кода... вот наверно ими надо  усыпить МК пока прерывание его не пробудит.

натолкните на мысль ?

James
Offline
Зарегистрирован: 26.02.2016