Прерывания в ардуино (помогите)
- Войдите на сайт для отправки комментариев
Сб, 02/12/2017 - 18:06
Здраствуйте!
Я делаю достаточно большой проект на ардуино мега ( MIDI оркестр) и возникла проблема , что код очень долго выполняется и инструменты отзываются с задержкой . Так вот я подумал , что надо сделать что бы не ардуина вроверяла и считывала в void loop значения , а чтобы например при нажатии на датчик , он сам вызывал блок кода на исполнение . Эта штука вроде называется прерывание , но как с этим работать я не представляю . Помогите пожалуйста !
Да поможет вам Святой millis(), и что бы Злой delay() не испортил вам программу.
Да поможет вам Святой millis(), и что бы Злой delay() не испортил вам программу.
а что за millis() и как им пользоваться
а что за millis() и как им пользоваться
http://arduino.ru/tutorials/BlinkWithoutDelay
я уже посмотрел , что такое millis() , это не то , мне надо , чтобы например если ты нажал на птезодатчик , т он вызывает часть кода , без нажатия , ничего не просиходит
и вопрос заключается в том что такое прерывание и как им поьзоваться ( ну или как решить задачу, описанную выше)
что такое прерывание
http://arduino.ru/Tutorial/Arduino_Interrupts
как им поьзоваться
http://arduino.ru/Reference/AttachInterrupt
Ну и зачем вам объяснять, вы еще очень слепы в своей гордыне. http://arduino.ru/Reference/AttachInterrupt
Прерывание
спасибо за инфориацию , помогло
Григорий, вам намекают, что причина ваших проблем, скорее всего, не в том, что "ардуина не успевает", а просто в кривом коде, в котором медленное исполнение одних частей кода блокирует другие. В этом случае прерывание вам не поможет, а наоборот, только ухудшит ситуацию, так как в прерывании можно выполнять только быстрые короткие операции.
Если код переписать с помощью миллис, чтобы он выполнялся быстро - проблема наверняка решается и без прерываний
спасибо за инфориацию , помогло
Все уже решено ? :) - я рад...
b707,спасибо за перевод в нормальный язык сообщения #1
Григорий777, ну, в общих чертах Вам уже описали ситуацию. Надеюсь, общий смысл поняли.
В целом же, мне кажется, что уровень сложности Вашего проекта вступает в радикальное противоречие с Вашим уровнем подготовки.
Музыка - искуство временнОе, поэтому умение не просто работать с временем, а работать с ним виртуозно - непременное условие вменяемой музыкальной программы. Поэтому Ваше незнакомство с millis() просто шокирует.
В Вашем исходном сообщении фигурирует словосочетание "очень долго выполняется". Это как бы слишком неконкретно. Вы должны вполне четко знать, сколько выполняется Ваш код, и какие требования ко времени его выполнения. Без этого дальнейшее продвижение вперед просто невозможно.
По поводу прерываний: чтобы их использовать, скажем, от пьезодатчика, вам понадобится серьезная аппаратная поддержка, т.е. схема, которая бы из аналогового сигнала формировала импульсы нужной формы, могущие вызывать прерывания. А если количество пьезодатчиков будет сопоставимо с количеством инструментов в оркестре, то еще и выполняла массу других функций. Одного контроллера здесь явно недостаточно, т.е. решить проблему чисто программным способом не получится.
Ну а вообще, хотелось бы, конечно, поподробнее узнать о проекте. На всякий случай дамм ссылку на проект, которым я занимаюсь уже больше года. Тут, правда, не оркестр, все гораздо скромнее, но вдруг будет интересно: http://arduino.ru/forum/proekty/analog-analogovogo-sintezatora
В распространенном i2c расширителе есть возможность формировать некий выход int по событию на входах. В совокупности с программным обработчиком эту композицию можно трактовать как аппаратно-программный кпп .
В распространенном i2c расширителе есть возможность формировать некий выход int по событию на входах. В совокупности с программным обработчиком эту композицию можно трактовать как аппаратно-программный кпп .
Можно, только ведь ТС наверняка интересует не просто факт наличия сигнала, но и его величина, иначе бы он использовал контакты, а не пьезодатчики. Поэтому одним расширителем, боюсь, дело не ограничится.
Здраствуйте!
Я делаю достаточно большой проект на ардуино мега ( MIDI оркестр) и возникла проблема , что код очень долго выполняется и инструменты отзываются с задержкой . Так вот я подумал , что надо сделать что бы не ардуина вроверяла и считывала в void loop значения , а чтобы например при нажатии на датчик , он сам вызывал блок кода на исполнение . Эта штука вроде называется прерывание , но как с этим работать я не представляю . Помогите пожалуйста !
Я вот тут подумал (как говорится, утро вечера мудренее), у Вас проблема вообще не там, где Вы собираетесь ее решать.
Если бы у Вас были проблемы (задержки) с опросом датчиков, то это проявлялось бы не в задержках нот, а в их пропуске (сигнал с датчиков бы исчезал раньше, чем Вы его сумели обнаружить). Следовательно, у Вас проходит слишком много времени с момента обнаружения сигнала до реакции на него, а в этом случае сажать датчики на прерывания - совершенно бесполезно. Нужно сокращать время выполнения кода между обнаружением сигнала с датчика до начала реакции на него.