Почему delay() не работает 1 час?
- Войдите на сайт для отправки комментариев
Сб, 13/01/2018 - 22:29
Всем привет! Пробовал заставить работать реле 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); }
Да реально.
Если частота F_CPU выставлена правильно, то этот код долже светиться 5 минут и отдыхать 2 минуты.
Вы чем Ваша проблема? Вы не можете сосчитать сколько миллисекунд в 50-ти минутах? Или в чём?
Частота Аттини13 выставлена 1.2MHz(internal). Сосчитал, что в 50 мин. есть 3 000 000 миллисекунд. Вроде правильно сосчитал. Проблема в том, что даже когда пишу delay(3000000), то диод не светится 50 минут. А только 5 минут. Но Вы пишете, что диод должен светиться с этим кодом 5 минут. Но я же пишу 3 миллиона миллисекунд, а не 300 000 мс, сколько, по идее, есть в 5 минутах?
delay(3000000UL)
я же пишу 3 миллиона миллисекунд, а не 300 000 мс,
В каком месте? В строке 2 Вашего скетча я вижу
А теперь возьмите калькулятор и умножьте 50 на 6000.
Похоже, я был прав, когда писал
Вы не можете сосчитать сколько миллисекунд в 50-ти минутах
Вообще, такая ошибка нередка. Привыкайте писать по-человечески, тогда не ошибётесь. Вот смотрите:
Здесь невозможно ошибиться.
Спасибо, Евгений! Да, моя вина, ошибся в этой строке. Провел тестирование. На Ардуино все работает как надо, держит 50 минут. А вот на Аттини13 с подключенным реле есть странность. Если написать
или
то все нормально, включается через секунду и минуту соответсвенно. А вот если написать
то включается через минуту. Хотя строка
же дает в итоге 3 000 000 милликесунд, и реле должно включаться через 50 минут.
Проверьте ещё раз и выложите тот самый код, который так работает копи-пастом. И расскажите что там с частотами. Что реально стит в мини и что в константе F_CPU
Проверил на Attiny13 с подключенным (на 6-й пин, в программе 1) реле. Если выставить "Clock" равным 1.2MHz, то при следующем коде реле работает 1 мин, перестает работать на 20 сек. При "Clock" 9.6MHz реле работает 9 мин, гаснет на 3 мин.
p.s: В даташите F_cpu не нашел.
Никита, я бы подозревал где-то у вас банальную описку. Обратите внимание, что у вас при обоих частотах интервалы соотносятся как 3:1, хотя задаете вы 2.5 : 1.
Код, который вы выложили - точная копия того. что запускался? Может при переносе а тиньку где-то цифру не ту вбили?
b707, да, скопировал с IDE Ардуино без малейших изменений. Я не старался засекать точно с секундами, цифры приблизительны, +/- какие-то секунды в первом случае, десятки секунд во втором случае (с 9.6МГц).
p.s: В даташите F_cpu не нашел.
А ьам её и нет. Это константа в Вашей программе. Просто напечатайте её в монитор порта и посмотрите
Serial.print("F_CPU="); Serial.println(F_CPU);
Попробовал. На Ардуино пишет
F_CPU=16000000
А как выявить F_CPU Attiny13, я не знаю, я же заливаю код в него через Ардуино.
Ну, найдите способ его куда-нибудь вывести, что у Вас там есть (экран какой-нибудь) или ещё чего. Неправильно время может быть если в реальности одна частота, а в программе указана другая.
Сейчас возможности вывести на экран нет. Может, как-нибудь потом. Спасибо!