Проблема с прерыванием

dude
Offline
Зарегистрирован: 17.03.2017

Всем привет!

Имеется в наличии arduino nano.

К ней присоединен дисплей и приемник. (Если это важно)

Все работает отлично, пока не включаю прерывание (interrupts()). И как только наступает время прерывания (у меня установлен мод CHANGE), начинает выполняться функция, причем выполняется она постоянно, то есть до loop() дело не доходит. Если написать внутри этой функции noInterrupts(), то она продолжит выполняться. Если написать detachInterrupt(), то эта функция перестает выполняться, но при этом же loop() тоже не работает.

В чем может быть проблема?

Уже устал пытаться что-то сделать, решил спросить у Гуру этого форума)

Заранее спасибо.

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

dude пишет:

Уже устал пытаться что-то сделать, решил спросить у Гуру этого форума)

Пожилой еврей всю жизнь молился Богу, вымаливая себе крупный выигрыш в лотерею. Каждый день он исправно возносил молитву с этой просьбой, пока, наконец не достал этим Бога в конец. В очередной раз тот явился таки к нему и взмолился: — Хаим Абрамович! Hу дайте же мне хоть один шанс! Купите хотя бы один лотерейный билет! 

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

dude
Offline
Зарегистрирован: 17.03.2017

Вот так работает loop(), но прерывания все равно не останавливаются:

volatile int  flagInterrupts=0;

void setup()
 {
  ...
  attachInterrupt(0, preriv, CHANGE);
  noInterrupts();
  ...
 }

void preriv() 
 {
   ...
    flagInterrupts=1;
    noInterrupts();
    loop();
   ...
 }

void loop()
 {
  if (flagInterrupts==1)
   {
    noInterrupts();
    flagInterrupts=0;
    Serial.println("123");
   }
  
   ...

  if ((digitalRead(7)==HIGH) && (digitalRead(6)==HIGH)) //Среднее положение кнопки. 
   {
    delay(130000);
    if ((digitalRead(7)==HIGH) && (digitalRead(6)==HIGH)) //Среднее положение кнопки.
     {
      switch (value)
       {
        case 0:
         switch(peremen)
          {
           case 0:
            interrupts();
           break;
           ...
          }
       break;
        ...
       }
     {
   }
 }

А вот так loop() перестает работать, а прерывания по прежнему работают(Здесь просто убрана строчка вызова loop() в функции preriv()):

volatile int  flagInterrupts=0;

void setup()
 {
  ...
  attachInterrupt(0, preriv, CHANGE);
  noInterrupts();
  ...
 }

void preriv() 
 {
   ...
    flagInterrupts=1;
    noInterrupts();
   ...
 }

void loop()
 {
  if (flagInterrupts==1)
   {
    noInterrupts();
    flagInterrupts=0;
    Serial.println("123");
   }
  
   ...

  if ((digitalRead(7)==HIGH) && (digitalRead(6)==HIGH)) //Среднее положение кнопки. 
   {
    delay(130000);
    if ((digitalRead(7)==HIGH) && (digitalRead(6)==HIGH)) //Среднее положение кнопки.
     {
      switch (value)
       {
        case 0:
         switch(peremen)
          {
           case 0:
            interrupts();
           break;
           ...
          }
       break;
        ...
       }
     {
   }
 }

Что касается delay(), то по справке он не должен работать, но все равно работает, правда не так как надо.

dude
Offline
Зарегистрирован: 17.03.2017

Возможно понял в чем проблема: скорее всего в delay(); (но это не точно)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы это называте кодом? Ну, если он у Вас секретный, то разбирайтесь в нём сами :)

dude
Offline
Зарегистрирован: 17.03.2017

Проблема была в использование delay().

Убрал, теперь все работает, но как тогда задержку сделать без использования delay()?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014