Delay - Зависание

Bim_Sony
Bim_Sony аватар
Offline
Зарегистрирован: 03.10.2012

Добрый день.

Хотел написать программную корректировку часов на DS1307, но у меня на операторе delay происходит зависание.

void loop(void) 
  {
  u8g.firstPage();
  if ( (millis() % 200) == 0)
    {
    dps.getPressure(&Pressure);           // Читаем давление с ВМР085
    dps.getTemperature(&Temperature);     // Читаем температуру с ВМР085
    chk = DHT11.read(DHT11PIN);           // Читаем температуру и влажность с DHT11
    getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // Читаем время
    do {
    menu_point(); // Отрисовка основного меню   
        } while( u8g.nextPage() );
    }
  // Обработка кнопок
  if (menu_p == false)
    {
    if ((b_up.update()) && (b_up.read() == LOW)) //если нажата кнопка
      {
      m1 = m1 - 1; // Если нажата кнока и значение меньше диапазона то увеличиваем значение яркости 
      stat = true;             // Кнока изменила свое состояние
      }

  if ((b_down.update()) && (b_down.read() == LOW)) //если нажата кнопка
    {
    m1 = m1 + 1; // Если нажата кнока и значение меньше диапазона то увеличиваем значение яркости 
    stat = true;             // Кнока изменила свое состояние
    }
  
  if (stat == true)
    {
    if (m1 > 5) m1 = 1;
    if (m1 < 1) m1 = 5;
    stat = false;
    }
  }
  
  
  // Корректировка времени
  if ((hour == 10) && (minute == 18) && (second == 00)) //В это время переводим часы на нужное смещение
    {
    //  delay (400);
    korr = EEPROM.read(0) * 256 + EEPROM.read(1);    // Считываем с памяти 2 байта
    
    delay ((korr / 1000 + 1) * 1000 - korr);                  // Делаем задержку
    setTimeDs1307 (second + (korr / 1000 + 1), minute, hour); // Переводим время
    }

 

В этом коде есть последний кусок, обозначенный "корректировка времени" все бы хорошо, но на операторе delay все виснет, кнопки не реагируют, экран показывает 10:18:00.

Самое интересное, что через несколько минут все оживает(примерно через 4-5), правда не всегда. Но у меня задержка на 400 мс. Пробовал все строчки комментировать, кроме delay, все равно тот-же эффект.

Не могу понять с чем это связано... помогите разобраться

leshak
Offline
Зарегистрирован: 29.09.2011

Вынесете (korr / 1000 + 1) * 1000 - korr в какую-нибудь переменную, и выведите то что получилось в serial. 

// вычисляем задержку
unsigned long tmp=(korr / 1000 + 1) * 1000 - korr;

// выводим когда и на сколько мы собрались задержатся
Serial.print(millis());
Serial.print(":delay=");Serial.println(tmp,DEC); 

// тупим
delay(tmp);


Serial.print(millis());Serial.println(":done"); // выводим  когда перестали тупить

Ну а дальше, в Serial смотрите на сколько вы в действительности вызываете delay(), как часто и т.п.

Bim_Sony
Bim_Sony аватар
Offline
Зарегистрирован: 03.10.2012

я пробовал разные значения...

если ставить 1, то задержки практически нет...

если ставить 100, то задержка 45 сек

если ставить 200, то задержка примерно 3 минуты...

ну и так далее...

 

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

 

В конце концов, пришлось вообще отказаться от Delay.

 

Код выглядит примерно так:

  // Корректировка времени
  if ((hour == 23) && (minute == 58) && (second == 30) && (my_korr == false)) //В это время переводим часы на нужное смещение
    {
    my_korr = true;
    korr = EEPROM.read(0) * 256 + EEPROM.read(1);    // Считываем из памяти 2 байта
    my_mill = millis();
    digitalWrite(13, HIGH);
    }

  if ((my_korr==true) && ((millis() - my_mill) >= ((korr / 1000 + 1) * 1000 - korr)))
    {
    setTimeDs1307 (second + (korr / 1000 + 1), minute, hour); // Переводим время
    my_korr = false;
    digitalWrite(13, LOW);
    }

13 пин использую для контроля... можно убрать :)