Календарь Atmega16 WinAVR

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
geniusbsd
Встал на лапы
Сообщения: 82
Зарегистрирован: Ср авг 19, 2009 09:34:50

Календарь Atmega16 WinAVR

Сообщение geniusbsd »

Как можно организовать такую идею
В буднии дни с 10:00 до 18:00 управляющие устройство выключенно в выходные и праздничные работает круглосучно
Реклама
Аватара пользователя
radteh
Друг Кота
Сообщения: 3087
Зарегистрирован: Пт мар 09, 2007 15:01:52
Откуда: Биробиджан

Сообщение radteh »

Берёте за основу часы с календарём и будильником (думаю схему, прошивку и исходники найти не проблема), добавляете работу с памятью в которой хранятся праздничные дни.
Реклама
Аватара пользователя
Pavel_1978
Опытный кот
Сообщения: 830
Зарегистрирован: Пт ноя 16, 2007 11:21:37

Сообщение Pavel_1978 »

DS1307 кроме времени даты еще и день недели выдает. Соттветственно остается только реализовать хранение в памяти праздничных дней.
geniusbsd
Встал на лапы
Сообщения: 82
Зарегистрирован: Ср авг 19, 2009 09:34:50

Сообщение geniusbsd »

Я в своем проекте использую программные часы реального времени из библиотеки avrlib(rtc.h).
Как вычеслить день недели в такой ситуации отдельную микруху часов не применяю так как контроллер загружен в дежурном режиме процентов на 10
Реклама
Эиком - электронные компоненты и радиодетали
alx_2009
Родился
Сообщения: 7
Зарегистрирован: Пн мар 30, 2009 19:59:50

Сообщение alx_2009 »

Используйте микросхему RTC
Осообенность DS1307 - при сбросе контроллера или пропаже питания время не сбрасывается, внутренний генератор работает, часы тикают.
Реклама
geniusbsd
Встал на лапы
Сообщения: 82
Зарегистрирован: Ср авг 19, 2009 09:34:50

Сообщение geniusbsd »

Как я понял в DS1307 день недели требуется установить самому при установке даты и времени, а уж потом он начинает считать или я не прав?
Реклама
Аватара пользователя
Pavel_1978
Опытный кот
Сообщения: 830
Зарегистрирован: Пт ноя 16, 2007 11:21:37

Сообщение Pavel_1978 »

geniusbsd писал(а):Как я понял в DS1307 день недели требуется установить самому при установке даты и времени, а уж потом он начинает считать или я не прав?

естественно, как и начальные значения даты времени
geniusbsd
Встал на лапы
Сообщения: 82
Зарегистрирован: Ср авг 19, 2009 09:34:50

Сообщение geniusbsd »

поделитьесь исхлдником на winavr для вычесления дня недели по дате
Аватара пользователя
Аксель
Опытный кот
Сообщения: 800
Зарегистрирован: Ср апр 25, 2007 09:50:43
Откуда: Киев
Контактная информация:

Сообщение Аксель »

Вариант без ds1307 (отдельная микросхема - это хорошо, а вот альтернатива для по быстрому):


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


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

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


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

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

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

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

P.S.: Счетчик годов можно сделать так: от 0 до 4.
0 - это високкостный до 28, 1 это после 28-го - так вроде проще 28-е посчитать два раза. Ну а счетчик дней недели как считал вперед, так и считает :)
Скелет колобка состоит из черепа.
geniusbsd
Встал на лапы
Сообщения: 82
Зарегистрирован: Ср авг 19, 2009 09:34:50

Сообщение geniusbsd »

Я все таки остановился на использовании DS1307 есть свои плюсы...

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

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


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

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 день больше
В чем может быть ошибка
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Сообщение pyzhman »

таки вычитайте единицу из результата. А у меня все получается... только воскресенье - 0(америка).
Аватара пользователя
Danko
Сверлит текстолит когтями
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай
Контактная информация:

Сообщение Danko »

geniusbsd, спасибо за код.
Проверял в Excel`е.
Работает.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»