Вопрос по прерываниям, новичка
- Войдите на сайт для отправки комментариев
Вс, 18/03/2012 - 21:16
int ledPin; volatile boolean stopRised=false; void setup() { attachInterrupt(0, Stop, RISING) ; pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); //pinMode(10, INPUT); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, HIGH); digitalWrite(9, HIGH); //digitalWrite(10, HIGH); } void loop() {attachInterrupt(0, Stop, RISING); { if (stopRised== true) { Stop(); } up(); delay(1000); }} void up() { digitalWrite(3, LOW); digitalWrite(7, LOW); digitalWrite(4, HIGH); digitalWrite(6, HIGH); } void dawn() { digitalWrite(4, LOW); digitalWrite(6, LOW); digitalWrite(3, HIGH); digitalWrite(7, HIGH); } void right() { digitalWrite(4, HIGH); digitalWrite(6, LOW); digitalWrite(3, HIGH); digitalWrite(7, HIGH); } void left() { digitalWrite(4, LOW); digitalWrite(6, HIGH); digitalWrite(3, HIGH); digitalWrite(7, HIGH); } void towerright() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); } void stopall() { digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, HIGH); digitalWrite(9, HIGH); delay(1000); } void Stop(){ stopRised=true; detachInterrupt(0); dawn(); delay(2000); stopall(); delay(1000); stopRised=true; }
Устройство должено ехать вперёд пока нет препятствия, на деле же оно спокойно едет вперёд, пока не сработало первое прерывание, а дальше, после сработки, оно ездиет вперёд и назад до бесконечности!!
я бы сделал так:
Всё равно не понимаю, конечно, можно сделать так, как вы писали, и да, если программа не нагромождена, то будет всё работать на славу.
Я просто немогу понять почему, ведь всё работает отлично, он едет вперёд бесконечно долго, и, как только сработало, прерывание, он едет назад, значит в цикл Stop() он входит, и коректно его выполняет, в Stop() я отключаю прервания, в loop опять включаю. Но после авполнения цикла Stop() он начинает ездить взад и вперёд, и на прервывание уже не реагирует.
А он ездит и ездит взад вперёд, взад и вперёд, наводок нет, даже с пина вытащил проводок, ламп дневного света тоже нету, проблемма именно в программе!!!
ты напиши что именно хочешь чтобы робот делал?
1. Есть датчик, самодельный. Состоит он из генератора на 555 40кГЦ, передатчика . , приёмника, и ОУ, который формирует "+" когда есть препятствие, и нечего не формирует, когда препятствия нету.
2. Есть танк, он собственно и есть Робот, который должен двигаться вперёд, обнаружив препятствие, он будет поворачивать на 90%(в дальнейшем), пока-же для простоты, он просто отъезжает назад, и начинает двигаться опять вперёд. Обнаружив опять препятствие, всё должно повториться.
3. Программа должна работать именно через прерывания, не потому-что я так хочу, легче, или что-то иное, по вашему алгоритму, работает всё на ура, просто такого ТЗ.
Что мы имеем:
1. Датчик работает корректно, формирует всё корректно, Ардуинка это видит тоже корректно.
2. Танк и вправду может ехать бесконечно долго, пока нету препятствия, тоесть смены с "-" на "+" на пине2, прерывание 0
3. После славливания внешнего прервывания программа зацикливается до бесконечности, выполняя последовательно up и dawn. уже в не зависимости от состояния pin2
хочу понять почему, и решить проблемму, уверен что ответ очень близко, изучать начал недавно, прошу прощения если что-то не правильно описал!
После первого прерывания stopRised всегда истина. На 94 строке скорее дожно присваиваться "ложь" .
И использовать повсюду delay и прерывания имхо бред. Прерывания - чтоб ничего не пропустить. delay - чтоб все профукать. В общем нужно код изначально по другому писать, а то потом все равно к етому прийдете и переделать будет трудней.
delay рацыонально использовать когда нет взаимодействия с чем то. То есть когда нужно тупо по кругу исполнять команды и на 100 процентов уверены в исходе событий.
Кстати, в прерываниях вообще delay() не работает