Страница 1 из 1

Календарь Atmega16 WinAVR

Добавлено: Вс ноя 01, 2009 16:10:36
geniusbsd
Как можно организовать такую идею
В буднии дни с 10:00 до 18:00 управляющие устройство выключенно в выходные и праздничные работает круглосучно

Добавлено: Вс ноя 01, 2009 17:04:20
radteh
Берёте за основу часы с календарём и будильником (думаю схему, прошивку и исходники найти не проблема), добавляете работу с памятью в которой хранятся праздничные дни.

Добавлено: Вс ноя 01, 2009 17:35:14
Pavel_1978
DS1307 кроме времени даты еще и день недели выдает. Соттветственно остается только реализовать хранение в памяти праздничных дней.

Добавлено: Пн ноя 02, 2009 10:28:12
geniusbsd
Я в своем проекте использую программные часы реального времени из библиотеки avrlib(rtc.h).
Как вычеслить день недели в такой ситуации отдельную микруху часов не применяю так как контроллер загружен в дежурном режиме процентов на 10

Добавлено: Пн ноя 02, 2009 21:39:16
alx_2009
Используйте микросхему RTC
Осообенность DS1307 - при сбросе контроллера или пропаже питания время не сбрасывается, внутренний генератор работает, часы тикают.

Добавлено: Ср ноя 04, 2009 16:38:16
geniusbsd
Как я понял в DS1307 день недели требуется установить самому при установке даты и времени, а уж потом он начинает считать или я не прав?

Добавлено: Ср ноя 04, 2009 16:39:21
Pavel_1978
geniusbsd писал(а):Как я понял в DS1307 день недели требуется установить самому при установке даты и времени, а уж потом он начинает считать или я не прав?
естественно, как и начальные значения даты времени

Добавлено: Ср ноя 04, 2009 16:48:46
geniusbsd
поделитьесь исхлдником на winavr для вычесления дня недели по дате

Добавлено: Ср ноя 04, 2009 17:22:30
Аксель
Вариант без ds1307 (отдельная микросхема - это хорошо, а вот альтернатива для по быстрому):


вводите в программу счетчик дней недели (1 - 7) - при запуске задаете день недели.


вводите в программу счетчик дней в году (от 1 до 365) - при запуске задаете текущий день в году.

вводите в программу счетчик годов :) (значения от 0 до 3), чтобы в високосных годах после 28-го февраля счетчик дней вернулся один раз на один день назад - при запуске задаете число года после последнего високосного.


И далее, по таким-то дням недели работаем\не работаем .

Для праздников отдельно масивчик по таким-то дням в году работаем\не работаем. (Ага, ручками считаем на калькуляторе)

*Eсли был сброс питания, и параметры не устанавливали - никакими нагрузками не управлять, - предосторожность вродe как само собой разумеющееся.

------
Другие варианты реализации - очевидны.

P.S.: Счетчик годов можно сделать так: от 0 до 4.
0 - это високкостный до 28, 1 это после 28-го - так вроде проще 28-е посчитать два раза. Ну а счетчик дней недели как считал вперед, так и считает :)

Добавлено: Чт ноя 05, 2009 10:49:50
geniusbsd
Я все таки остановился на использовании DS1307 есть свои плюсы...

Нашол алгоритм для расчета дня недели по дате
http://uk.wikipedia.org/wiki/Алгоритм_ ... дня_тижня

Сварганил код

Код: Выделить всё

char weekday(unsigned char day, unsigned char month, unsigned char year)
{
int a = (14 - month) / 12;
int y = year - a;
int m = month + 12 * a - 2;
return (7000 + (day + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12)) % 7;
}
Результат почему то получается на 1 день больше
В чем может быть ошибка

Добавлено: Чт ноя 05, 2009 12:29:44
pyzhman
таки вычитайте единицу из результата. А у меня все получается... только воскресенье - 0(америка).

Добавлено: Пт ноя 06, 2009 15:34:12
Danko
geniusbsd, спасибо за код.
Проверял в Excel`е.
Работает.