Помогите найти источник задержки
- Войдите на сайт для отправки комментариев
Здравствуйте. Оговорюсь сразу, я не програмист. Кое-какое представление имею, но не более того. Написал я вот такой код:
int InputVoltage = 0; int Sound = 0; int Visual = 1; float vin = 0; void setup() { pinMode (Sound, OUTPUT); pinMode (Visual, OUTPUT); pinMode (5, INPUT); analogReference (DEFAULT); } void loop() { vin = analogRead (InputVoltage); if (vin > 835){ MySound (); } else { noTone (Sound); digitalWrite(Visual, LOW); } } void MySound () { tone (Sound, 3000); digitalWrite(Visual, HIGH); delay(1000); digitalWrite(Visual, LOW); delay(1000); digitalWrite(Visual, HIGH); delay(1000); digitalWrite(Visual, LOW); delay(1000); }
Несоответствие заявленного пина и analogRead не смотрите - это особенность диджиспарка.
Суть в чем: код смотрит уровень на пине 5 и в зависимости от величины включает\не включает пищалку и мигает встроенным светодиодом.
В отдельную функцию процедура пищания/мигания вынесена для того, что-бы не прекращать снятие показаний с пина 5.
И вот тут происходит задержка: При снижении уровня, пищалка срабатывает с задержкой, на время примерно равное периоду мигания светодиода, указанного у функции. Т.е. 4 секунды, а не две, выдаваемые командой delay. Хотя сам светодиод не мигает, соответственно код указанный в функции вроде-бы не выполняется.
Данная проблема для меня не критична, мигание чем-либо в итоге будет убрано вообще. Но в самообразовательных целях хотелось-бы понять.
Заранее спасибо.
Причина задержки - delay(). Хоть выноси его в функцию, хоть не выноси - это блокирующая вычислительный процесс функция.
Помогите найти источник задержки
Да, пожалуйста, сразу четыре: строки №№ 26, 28, 30 и 32.
В отдельную функцию процедура пищания/мигания вынесена для того, что-бы не прекращать снятие показаний с пина 5.
Вынос в отдельную функцию никак не обеспечит "не прекращать снятие показаний с пина 5." Пока функция не завершится новые показания не снимет. Ищите по сайту и форуму блинк без делея.
Чушь какая-то получается: При неудовлетворении условию IF половина команд не выполняется (digitalWrite), а половина выполняется (delay). Так что-ли ?
При неудовлетворении условию IF у Вас выполняються только эти две строчки. Никакие другие и не должны выполняться. noTone (Sound); digitalWrite(Visual, LOW);
Надо чтение аналогового пина вынести в отдельную функцию - аналог "делая". Тогда Вы не потеряете восприятие "неправильной структуры" своего скетча.
Чушь какая-то получается: При неудовлетворении условию IF половина команд не выполняется (digitalWrite), а половина выполняется (delay). Так что-ли ?
Выполняются все команды.
Правда, Ардуина одновременно может выполнять только одну команду.
Соответственно, когда выполняется delay(), другие команды выполняться не могут.
А digitalWrite() тоже выполняется всегда, когда написана в программе. Но, вероятно, выполняется не тогда, когда бы Вам хотелось, из-за того, что в это время выполняется команда delay().
Вам уже правильно посоветовали: избавляться от delay(), для чего разобрать и понять, как работает blink without delay.
PS. Программа всегда работает так, как написана, а не так, как ее хотели написать.
А digitalWrite() тоже выполняется всегда, когда написана в программе. Но, вероятно, выполняется не тогда, когда бы Вам хотелось, из-за того, что в это время выполняется команда delay().
Вам уже правильно посоветовали: избавляться от delay(), для чего разобрать и понять, как работает blink without delay.
Избавится-то не проблема, блинк мне вообще не нужен. Я в данный момент хочу понять зачем программа лезет в ту область, которая не удовлетворяет условию if и выполнятся не должна.
При неудовлетворении условию IF у Вас выполняються только эти две строчки. Никакие другие и не должны выполняться. noTone (Sound); digitalWrite(Visual, LOW);
О чем я и говор. И никаких delay там нет.
Вы уверены, что Ваш код "смотрит уровень на пине 5"? А если проверить?
Уровень она смотрит. Изменение напряжения влияет на работу программы. Она пищит или перестает пищать.
А то, что она лезет.... Ну, по прикидкам задержка у меня в районе 3-4 сек, а других delay, тем более с похожим временем, у меня нет вообще.
Вставляете в Вашу программу
B и спокойно смотрите, что у Вас происходит - всё видно как на ладони и безо всякихприкидок.
Если понадобится, то в каждую из печатей добавьте ещё и вывод millis(), чтобы ещё и время события знать.
Делайте. думаю. когда посмотрите, во всём разберётесь. А не разбеоётесь, выкладывайте свежий скетчи копипасту протокола - чего печатает.
Евгений, вопрос где я увижу эту печать ? Учитывая что Serial монитора у нее нет, а цеплять внешний текстовый - неохота, ей богу.
Да и попадание/непопадание, повторюсь, прекрасно слышно по писку. Вот только застревает он где-то на 4 секунды, с погасшим светодиодом.
Залейте на обычную ардуину - проверьте. Код наипростейший, застревать в нем негде. Непонятно, правда, зачем там float.
Залейте на обычную ардуину - проверьте. Код наипростейший, застревать в нем негде. Непонятно, правда, зачем там float.
Да нет у меня обычной. AVR 328 есть, можно конечно в нее засунуть, попробую, досуг только появится.
float - честно говоря не сильно задумывался, взял из попавшего скетча вольтметра.
Ладно, будем ковырять эту фигню, благо до лета она врят-ли понадобится. Если причина выплывет - напишу.
неохота, ей богу.
Ну, так охота хуже неволи. Просили помочь - я сказал Вам что и как надо делать. неохота - дело хозяйское.
Кстати, интересно, если Вам самому лень заниматься Вашей проблемой, чего Вы нас-то напрягаете? Или потому и напрягаете, что самому лень?
Да как вам сказать... Человек катаясь по трассе, может потратить год, на то что-бы заметить, понять что это ошибка и проанализировать их. Или я посмотрю 5 минут на его езду и выдам где и в чем его ошибки. А вот принять и осмыслить выданную ему информацию - это уже труд человека.
Тут - ИМХО аналогично.
И введите какой-нить гистерезис в алгоритм, а то как начнет флапать около границы переключения - с ума сведет.
Ну, так и делайте, что Вам говорят, печатайте, смотрите, понимайте и осмысливайте. Если условие не выполняется, то программа никак не может пойти в ветку под if. Вы в этом сомневаетесь, так убедитесь. А если неохота, так ... кто ж Вас заставит.
Если у Вас нет ардуины, кто Вам мешает запустить эту программу на PC? Берёте протеус, выбираете там модель UNO, запускаете и смотрите всё, что нужно. Кроме протеуса есть ещё с десяток моделирующих программ, которые умеют ардуину моделировать. Берите и запускайте. Никто за Вас этого делать не будет.
Короче вроде разобрался.
Похоже это какая-то особенность именно Digispark'а - при смене сенсорного пина на другой задержка исчезла.
Попутно (при тестировании на живых кошках) еще и знак неравенства не в ту сторону нашел. Я олень :-)
Я олень :-)
Хуже. Ты алень, нарисованный на чайнике.