Прерывания в ардуино (помогите)

Григорий777
Offline
Зарегистрирован: 26.11.2017

Здраствуйте! 

Я делаю достаточно большой проект на ардуино мега ( MIDI оркестр) и возникла проблема , что код очень долго выполняется и инструменты отзываются с задержкой . Так вот я подумал , что надо сделать что бы не ардуина вроверяла и считывала в void loop значения , а чтобы например при нажатии на датчик , он сам вызывал блок кода на исполнение . Эта штука вроде называется прерывание , но как с этим работать я не представляю . Помогите пожалуйста !

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Да поможет вам Святой millis(), и что бы Злой delay() не испортил вам программу.

Григорий777
Offline
Зарегистрирован: 26.11.2017

qwone пишет:

Да поможет вам Святой millis(), и что бы Злой delay() не испортил вам программу.

а что за millis() и как им пользоваться

 

arduinec
Offline
Зарегистрирован: 01.09.2015

Григорий777 пишет:

а что за millis() и как им пользоваться

http://arduino.ru/tutorials/BlinkWithoutDelay

Григорий777
Offline
Зарегистрирован: 26.11.2017

я уже посмотрел , что такое millis() , это не то , мне надо , чтобы например если ты нажал на птезодатчик , т он вызывает часть кода , без нажатия , ничего не просиходит 

Григорий777
Offline
Зарегистрирован: 26.11.2017

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

arduinec
Offline
Зарегистрирован: 01.09.2015

Григорий777 пишет:

что такое прерывание

http://arduino.ru/Tutorial/Arduino_Interrupts

Григорий777 пишет:

как им поьзоваться

http://arduino.ru/Reference/AttachInterrupt

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну и зачем вам объяснять, вы еще очень слепы в своей гордыне. http://arduino.ru/Reference/AttachInterrupt

inspiritus
Offline
Зарегистрирован: 17.12.2012
Григорий777
Offline
Зарегистрирован: 26.11.2017

спасибо за инфориацию , помогло

b707
Offline
Зарегистрирован: 26.05.2017

Григорий, вам намекают, что причина ваших проблем, скорее всего, не в том, что "ардуина не успевает", а просто в кривом коде, в котором медленное исполнение одних частей кода блокирует другие. В этом случае прерывание вам не поможет, а наоборот, только ухудшит ситуацию, так как в прерывании можно выполнять только быстрые короткие операции.

Если код переписать с помощью миллис, чтобы он выполнялся быстро - проблема наверняка решается и без прерываний

b707
Offline
Зарегистрирован: 26.05.2017

Григорий777 пишет:

спасибо за инфориацию , помогло

Все уже решено  ? :) - я рад...

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

b707,спасибо за перевод в нормальный язык сообщения #1

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Григорий777, ну, в общих чертах Вам уже описали ситуацию. Надеюсь, общий смысл поняли.

В целом же, мне кажется, что уровень сложности Вашего проекта вступает в радикальное противоречие с Вашим уровнем подготовки.

Музыка - искуство временнОе, поэтому умение не просто работать с временем, а работать с ним виртуозно - непременное условие вменяемой музыкальной программы. Поэтому Ваше незнакомство с millis() просто шокирует.

В Вашем исходном сообщении фигурирует словосочетание "очень долго выполняется". Это как бы слишком неконкретно. Вы должны вполне четко знать, сколько выполняется Ваш код, и какие требования ко времени его выполнения. Без этого дальнейшее продвижение вперед просто невозможно.

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

Ну а вообще, хотелось бы, конечно, поподробнее узнать о проекте. На всякий случай дамм ссылку на проект, которым я занимаюсь уже больше года. Тут, правда, не оркестр, все гораздо скромнее, но вдруг будет интересно: http://arduino.ru/forum/proekty/analog-analogovogo-sintezatora

inspiritus
Offline
Зарегистрирован: 17.12.2012

В распространенном i2c расширителе есть возможность формировать некий выход int по событию на входах. В совокупности с программным обработчиком эту композицию можно трактовать как аппаратно-программный кпп .

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

inspiritus пишет:

В распространенном i2c расширителе есть возможность формировать некий выход int по событию на входах. В совокупности с программным обработчиком эту композицию можно трактовать как аппаратно-программный кпп .

Можно, только ведь ТС наверняка интересует не просто факт наличия сигнала, но и его величина, иначе бы он использовал контакты, а не пьезодатчики. Поэтому одним расширителем, боюсь, дело не ограничится.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Григорий777 пишет:

Здраствуйте! 

Я делаю достаточно большой проект на ардуино мега ( MIDI оркестр) и возникла проблема , что код очень долго выполняется и инструменты отзываются с задержкой . Так вот я подумал , что надо сделать что бы не ардуина вроверяла и считывала в void loop значения , а чтобы например при нажатии на датчик , он сам вызывал блок кода на исполнение . Эта штука вроде называется прерывание , но как с этим работать я не представляю . Помогите пожалуйста !

Я вот тут подумал (как говорится, утро вечера мудренее), у Вас проблема вообще не там, где Вы собираетесь ее решать.

Если бы у Вас были проблемы (задержки) с опросом датчиков, то это проявлялось бы не в задержках нот, а в их пропуске (сигнал с датчиков бы исчезал раньше, чем Вы его сумели обнаружить). Следовательно, у Вас проходит слишком много времени с момента обнаружения сигнала до реакции на него, а в этом случае сажать датчики на прерывания - совершенно бесполезно. Нужно сокращать время выполнения кода между обнаружением сигнала с датчика до начала реакции на него.