Не правильная работа скетча. Помогите разобраться в чем причина.

cactous
Offline
Зарегистрирован: 18.11.2013
  int paper = 13;
  int rele = 8;
  int konz = 7;
  int diod = 12;
  boolean konzevik = LOW;
  volatile int s=0;
  volatile int c=0;
  int x;
  volatile boolean service = false;
  
  
  void setup()
  {
    pinMode (diod, OUTPUT);
    pinMode (paper, OUTPUT);
    pinMode (rele, OUTPUT);
    digitalWrite (rele, LOW);
    digitalWrite (paper, HIGH);
    attachInterrupt(1, mode, RISING); //прерывание кнопка выбора режима.
  }
  
  void mode ()
  { 
    if (service == false)
    {
      service = true;
      digitalWrite (12,LOW);
    }
    else 
    {
      service = false;
      digitalWrite (12,HIGH);
    }
  }
 
 
  void work ()
  {
    if (s<5000)
    {
      s = s+1;
    }
    else 
    {
      c=c+1;
    }
  }
 
void loop()
  if (service == false)                        // если сервис, то сервис, если нет, то печать
  { 
    attachInterrupt(0, work, RISING);    //прерывание энкодер
    if (s!=0)                                      //если прерывание не произошло ни одного раза, то проверяем режим опять
    {                                                                                          
    while (s != 4500);                          //  проверяем счетчики            
      digitalWrite (paper, LOW);             // 
    while (c != 4842);                          //                                     
      digitalWrite (rele, HIGH);               //                                     
                                                                                                                     
     for (;konzevik != HIGH;)                                            
     {                                                                                   
        konzevik = digitalRead(konz);                                      
     }                                        
       digitalWrite (rele, LOW);                                                   
       detachInterrupt (0);                                                     
       konzevik = LOW;                                                          
       s=0;                                  
       c=0;                             
                                           
     }                 
  else                                          
  {                                                      
                                                 
    digitalWrite (rele, 0);                      
    digitalWrite (paper, 1);                
    detachInterrupt (0);                                     
  }                                                                               
  }                                            
}
cactous
Offline
Зарегистрирован: 18.11.2013

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

maksim
Offline
Зарегистрирован: 12.02.2012
      while (s < 4500);                          //  проверяем счетчики            
      digitalWrite (paper, LOW);             // 
      while (c < 4842); 

 

cactous
Offline
Зарегистрирован: 18.11.2013

Как раз со счетчиков все в порядке, но он не должен начинать считать если service == true

Dimsan
Offline
Зарегистрирован: 25.10.2013

Вы уверены, что service меняется? Дребезг контактов? Состояние 12-го выхода меняется?

cactous
Offline
Зарегистрирован: 18.11.2013

Дребезга быт не должно, ибо триггер шмитта и все дела.  12 меняется, на нем висит свето диод.  И нажатие кнопки четко отрабатывается. 

cactous
Offline
Зарегистрирован: 18.11.2013

Только что заметил, что прерывание сработаывает при включении в розетку паяльника и других электроприборов. Что это такое и как избавиться?

RainMan
Offline
Зарегистрирован: 21.06.2011

стабилизтировать блок питания

cactous
Offline
Зарегистрирован: 18.11.2013

Ардуина пока питается от юсб, все остальное, датчики и прочее от стабилизированый 5v.