какие-то чудеса...

selevo
selevo аватар
Offline
Зарегистрирован: 21.12.2013

Не  выполняется   проверка  на условие

30000 больше 20000

конечно!

акуеть!


const unsigned int skorost1=60; // включится если скорость вращения больше  60 об. в минуту.
const unsigned int skorost2=120;
const unsigned int skorost3=240;
const unsigned int skorost4=480;


volatile boolean start;
unsigned int drob,celoe;
unsigned int oboroti;
volatile long unsigned int razn =0;
volatile long unsigned int vrema =0;
unsigned long time;
unsigned long timeout;


void setup() 
  {    
  
  Serial.begin(9600);
     DDRB=B00100000; 
     DDRC=B00001111; 
     PORTC=255;

   attachInterrupt(0,sens,FALLING); 
  }


void loop()

 { 
   if (razn >= 20000)
      { start=1;
      }
      else start=0 ;
         Serial.print("start: ");
     Serial.println (start);
     
   if (start)
   {
     timeout=micros();
  // if ((timeout-vrema) > 10000000) razn=100000000;
    //delay(1000);     // wait for a second
 
      Serial.print("micrs: ");
  time=micros();
  Serial.println (time);
  
     Serial.print("vrema: ");
      Serial.println(vrema);
     
       Serial.print("Razniza: ");
  Serial.println(razn);
  
   // выводим частоту  
  Serial.print("F: ");
  oboroti=1000000000/(razn); // частота
  celoe=1000000/(razn); // вычисляем  целое значение   частоты
           Serial.print(celoe); // Отображаем целое значение   частоты
             
             Serial.print(".");
              drob=(oboroti/1000); // вычисление долей,сначала выделяем тысячи 
              drob=drob*1000; // вычисление долей, теперь 
              drob=oboroti-drob;
              if (drob <100) Serial.print("0");
               
              if (drob<10) Serial.print("0");
       Serial.println(drob);
    
       
  Serial.print("RPM: ");
  oboroti=60000000/razn; // преобразуем время в (обороты в минуту)
     Serial.println(oboroti);
     Serial.println("___________________");
     // установка условия  включения нагрузок
    if (oboroti<skorost1)  PORTC=B11111111;
  if (oboroti>=skorost1 && oboroti<=skorost2)  PORTC=B11111110;
   if (oboroti>=skorost2 && oboroti<=skorost3)  PORTC=B11111101;
      if (oboroti>=skorost3 && oboroti<=skorost4)  PORTC=B11111011;
        if (oboroti>=skorost4 )  PORTC=B11110111;
   }
 }



// обработка прерывания с датчика скрости
 void sens()
    {
     // noInterrupts();	
      razn=(micros()-vrema);  //расчет
          vrema =(micros());
         start=1 ;
     // interrupts();   
    }

selevo
selevo аватар
Offline
Зарегистрирован: 21.12.2013

Ой напутал немного 9996 получается  по проверке условия  больше 20000

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Цитата:

Не  выполняется   проверка  на условие

30000 больше 20000

конечно!

акуеть!

Надо полагать это сообщение компилятора на строки 10, 11

selevo
selevo аватар
Offline
Зарегистрирован: 21.12.2013

а что эти строки тоже в цикле программы ?

 

я там попутал  9996 больше 20000

получается у него

selevo
selevo аватар
Offline
Зарегистрирован: 21.12.2013

чудеса  происходили  из-за  91 строки

когда прерывание  происходило после  31 строки но  до 38