Почему delay() не работает 1 час?

NikitaS
Offline
Зарегистрирован: 22.10.2016

Всем привет! Пробовал заставить работать реле 50 минут, а потом гаснуть на 20 минут при помощи delay(). То, что delay() не дает программе обрабатывать другие строки, для моей простой программы не принципиально. Следующий код на Аттини13 светится 1 минуту, гаснет на 20 сек. На Ардуино светится где-то 5 мин. Реально ли добиться от delay() долгой - на 50 мин. - час или два - работы? Или он нужен только для небольших, секундных задержек? Вот код:

const int led =  13;
#define inter1 50*6000UL
#define inter2 20*6000UL

//unsigned long inter1 = 3000000UL; // пробовал и так
//unsigned long inter2 = 1200000UL;

void setup()
{
 pinMode(led, OUTPUT);
}

void loop()
{
 digitalWrite(led, LOW);
 delay(inter1);
 digitalWrite(led, HIGH);
 delay(inter2);
}

 

renoshnik
Offline
Зарегистрирован: 11.04.2013

Да реально.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Если частота F_CPU выставлена правильно, то этот код долже светиться 5 минут и отдыхать 2 минуты.

Вы чем Ваша проблема? Вы не можете сосчитать сколько миллисекунд в 50-ти минутах? Или в чём?

 

NikitaS
Offline
Зарегистрирован: 22.10.2016

Частота Аттини13 выставлена 1.2MHz(internal). Сосчитал, что в 50 мин. есть 3 000 000 миллисекунд. Вроде правильно сосчитал. Проблема в том, что даже когда пишу delay(3000000), то диод не светится 50 минут. А только 5 минут. Но Вы пишете, что диод должен светиться с этим кодом 5 минут. Но я же пишу 3 миллиона миллисекунд, а не 300 000 мс, сколько, по идее, есть в 5 минутах?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

delay(3000000UL)

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

NikitaS пишет:

я же пишу 3 миллиона миллисекунд, а не 300 000 мс, 

В каком месте? В строке 2 Вашего скетча я вижу

#define inter1 50*6000UL

А теперь возьмите калькулятор и умножьте 50 на 6000.

Похоже, я был прав, когда писал

ЕвгенийП пишет:

Вы не можете сосчитать сколько миллисекунд в 50-ти минутах

Вообще, такая ошибка нередка. Привыкайте писать по-человечески, тогда не ошибётесь. Вот смотрите:

#define  SECOND  1000ul
#define  MINUTE     (SECOND*60ul)
#define  TIMEOUT   (MINUTE*50ul)

Здесь невозможно ошибиться.

NikitaS
Offline
Зарегистрирован: 22.10.2016

Спасибо, Евгений! Да, моя вина, ошибся в этой строке. Провел тестирование. На Ардуино все работает как надо, держит 50 минут. А вот на Аттини13 с подключенным реле есть странность. Если написать

delay(SECOND);

или

delay(MINUTE);

то все нормально, включается через секунду и минуту соответсвенно. А вот если написать

delay(TIMEOUT);

то включается через минуту. Хотя строка

#define  TIMEOUT   (MINUTE*50ul)

же дает в итоге 3 000 000 милликесунд, и реле должно включаться через 50 минут.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Проверьте ещё раз и выложите тот самый код, который так работает копи-пастом. И расскажите что там с частотами. Что реально стит в мини и что в константе F_CPU

NikitaS
Offline
Зарегистрирован: 22.10.2016

Проверил на Attiny13 с подключенным (на 6-й пин, в программе 1) реле. Если выставить "Clock" равным 1.2MHz, то при следующем коде реле работает 1 мин, перестает работать на 20 сек. При "Clock" 9.6MHz реле работает 9 мин, гаснет на 3 мин.

const int led =  1;                
#define  SECOND  1000ul
#define  MINUTE     (SECOND*60ul)
#define  TIMEOUT   (MINUTE*50ul)
#define  TIMEOUT2   (MINUTE*20ul)

void setup()
{
 pinMode(led, OUTPUT);
}

void loop()
{
 digitalWrite(led, LOW);
 delay(TIMEOUT);
 digitalWrite(led, HIGH);
 delay(TIMEOUT2);
}

p.s: В даташите F_cpu не нашел.

b707
Offline
Зарегистрирован: 26.05.2017

Никита, я бы подозревал где-то у вас банальную описку. Обратите внимание, что у вас при обоих частотах интервалы соотносятся как 3:1, хотя задаете вы 2.5 : 1.

Код, который вы выложили - точная копия того. что запускался? Может при переносе а тиньку где-то цифру не ту вбили?

NikitaS
Offline
Зарегистрирован: 22.10.2016

b707, да, скопировал с IDE Ардуино без малейших изменений. Я не старался засекать точно с секундами, цифры приблизительны, +/- какие-то секунды в первом случае, десятки секунд во втором случае (с 9.6МГц).

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

NikitaS пишет:

p.s: В даташите F_cpu не нашел.

А ьам её и нет. Это константа в Вашей программе. Просто напечатайте её в монитор порта и посмотрите

Serial.print("F_CPU="); Serial.println(F_CPU);

NikitaS
Offline
Зарегистрирован: 22.10.2016

Попробовал. На Ардуино пишет

F_CPU=16000000
А как выявить F_CPU Attiny13, я не знаю, я же заливаю код в него через Ардуино.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Ну, найдите способ его куда-нибудь вывести, что у Вас там есть (экран какой-нибудь) или ещё чего. Неправильно время может быть если в реальности одна частота, а в программе указана другая.