Delay не далет

uhymov
Offline
Зарегистрирован: 14.06.2014

Здравствуйте.

Arduino Nano

Сегодня решил покрутить вентилятор.

Пищу вот такой скеч:

int motorPin = 9;
int led = 13;
int hallsensor = 2;
int NbTopsFan;
int Calc;

typedef struct{                  //Defines the structure for multiple fans and their dividers
  char fantype;
  unsigned int fandiv;
}fanspec;

//Definitions of the fans
fanspec fanspace[3]={{0,1},{1,2},{2,8}};

char fan = 1;   //This is the varible used to select the fan and it's divider, set 1 for unipole hall effect sensor
               //and 2 for bipole hall effect sensor

void rpm ()      //This is the function that the interupt calls
{
NbTopsFan++;
}

void setup()
{
  //Set the PWM Motor pin as an output
  pinMode(motorPin, OUTPUT);
  pinMode(led, OUTPUT); 
  pinMode(hallsensor, INPUT);
  Serial.begin(9600);
  attachInterrupt(0, rpm, RISING);
}

void hallinfo ()
{
  
   NbTopsFan = 0; //Set NbTops to 0 ready for calculations
   sei(); //Enables interrupts
   delay (1000); //Wait 1 second
   cli(); //Disable interrupts
   Calc = ((NbTopsFan * 60)/fanspace[fan].fandiv); //Times NbTopsFan (which is apprioxiamately the fequency the fan is spinning at) by 60 seconds before dividing by the fan's divider
   Serial.print (Calc, DEC); //Prints the number calculated above
   Serial.print (" rpm\r\n"); //Prints " rpm" and a new line
}

void loop()
{
  digitalWrite(led, HIGH);
  hallinfo();
  //Increase Motor Speed from 0 -> 255
  analogWrite(motorPin, 0);
  delay(10);
  for (int i=50; i<=255; i++)
  {
    analogWrite(motorPin, i);
    delay(1000);
  }
  digitalWrite(led, LOW);  

  delay(10000); //Hold it!
  hallinfo();
  
  digitalWrite(led, HIGH); 
  //Decrease Motor Speed from 255 -> 0
  for(int i=255; i>=50; i--)
  {
    analogWrite(motorPin, i);
    delay(1000);
  }
  analogWrite(motorPin, 0);
  delay(10);
  hallinfo();
  digitalWrite(led, LOW);
 
  delay(10000); //Hold it!
  hallinfo();
}

delay от 1000 и более не работают.

Прошелся поиском по форуму, встречаются статьи типа "Отказ от delay()".

Но так и не понял, что мешает программе ждать.

P.S.: в программировании не новичок (pascal), но в программировании под МК новичок.

 
 
 
uhymov
Offline
Зарегистрирован: 14.06.2014

Как заголовок поправить?

Looka
Offline
Зарегистрирован: 24.04.2012

Какой у Вас делей не работает?  
В простешем скече (диодиком поморгать) работает? 

Не вникая в детали Вашего кода  - у Вас прерывания используются.    Сюда и копайте. 

maksim
Offline
Зарегистрирован: 12.02.2012
     //cli(); //Disable interrupts