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.
// вычисляем задержку 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(), как часто и т.п.
я пробовал разные значения...
если ставить 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 пин использую для контроля... можно убрать :)