Вопрос по прерываниям, новичка

Warn
Offline
Зарегистрирован: 13.01.2012

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;
  }
Warn
Offline
Зарегистрирован: 13.01.2012

Устройство должено ехать вперёд пока нет препятствия, на деле же оно спокойно едет вперёд, пока не сработало первое прерывание, а дальше, после сработки, оно ездиет вперёд и назад до бесконечности!!

Mastino
Offline
Зарегистрирован: 03.12.2011

я бы сделал так:

frontState = digitalRead(frontsensorPin);
if(frontState == false)
up();
else
Stop();

 

Warn
Offline
Зарегистрирован: 13.01.2012

Всё равно не понимаю, конечно, можно сделать так, как вы писали, и да, если программа не нагромождена, то будет всё работать на славу.

Я просто немогу понять почему, ведь всё работает отлично, он едет вперёд бесконечно долго, и, как только сработало, прерывание, он едет назад, значит в цикл Stop() он входит, и коректно его выполняет, в Stop() я отключаю прервания, в loop опять включаю. Но после авполнения цикла Stop() он начинает ездить взад и вперёд, и на прервывание уже не реагирует.

А он ездит и ездит взад вперёд, взад и вперёд, наводок нет, даже с пина вытащил проводок, ламп дневного света тоже нету, проблемма именно в программе!!!

Mastino
Offline
Зарегистрирован: 03.12.2011

ты напиши что именно хочешь чтобы робот делал?

Warn
Offline
Зарегистрирован: 13.01.2012

1. Есть датчик, самодельный. Состоит он из генератора на 555 40кГЦ, передатчика . , приёмника, и ОУ, который формирует "+" когда есть препятствие, и нечего не формирует, когда препятствия нету.

2. Есть танк, он собственно и есть Робот, который должен двигаться вперёд, обнаружив препятствие, он будет поворачивать на 90%(в дальнейшем), пока-же для простоты, он просто отъезжает назад, и начинает двигаться опять вперёд. Обнаружив опять препятствие, всё должно повториться.

3. Программа должна работать именно через прерывания, не потому-что я так хочу, легче, или что-то иное, по вашему алгоритму, работает всё на ура, просто такого ТЗ.

Что мы имеем:

1. Датчик работает корректно, формирует всё корректно, Ардуинка это видит тоже корректно.

2. Танк и вправду может ехать бесконечно долго, пока нету препятствия, тоесть смены с "-" на "+" на пине2, прерывание 0

3. После славливания внешнего прервывания программа зацикливается до бесконечности, выполняя последовательно up и dawn. уже в не зависимости от состояния pin2

хочу понять почему, и решить проблемму, уверен что ответ очень близко, изучать начал недавно, прошу прощения если что-то не правильно описал!

chervyachok
chervyachok аватар
Offline
Зарегистрирован: 22.12.2011

 После первого прерывания  stopRised всегда истина. На 94 строке скорее дожно присваиваться "ложь" .

И использовать повсюду delay и прерывания имхо бред. Прерывания - чтоб ничего не пропустить. delay - чтоб все профукать.  В общем нужно код изначально по другому писать, а то потом все равно к етому прийдете и переделать будет трудней.

delay рацыонально использовать когда нет взаимодействия с чем то. То есть когда нужно тупо по кругу исполнять команды и на 100 процентов уверены в исходе событий.

maksim
Offline
Зарегистрирован: 12.02.2012

  Кстати, в прерываниях вообще delay() не работает