Delay - Зависание
- Войдите на сайт для отправки комментариев
Пт, 21/12/2012 - 10:32
Добрый день.
Хотел написать программную корректировку часов на 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, все равно тот-же эффект.
Не могу понять с чем это связано... помогите разобраться
Вынесете (korr / 1000 + 1) * 1000 - korr в какую-нибудь переменную, и выведите то что получилось в serial.
Ну а дальше, в Serial смотрите на сколько вы в действительности вызываете delay(), как часто и т.п.
я пробовал разные значения...
если ставить 1, то задержки практически нет...
если ставить 100, то задержка 45 сек
если ставить 200, то задержка примерно 3 минуты...
ну и так далее...
по поводу переменных, я по всякому делал этот блок, ничего не помогает...
В конце концов, пришлось вообще отказаться от Delay.
Код выглядит примерно так:
13 пин использую для контроля... можно убрать :)