Вопрос по прерываниям, новичка
- Войдите на сайт для отправки комментариев
Вс, 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() не работает