реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> DS1307 и день недели
TarasG
сообщение May 5 2008, 18:47
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 72
Регистрация: 25-02-08
Пользователь №: 35 378



Не получается вытащить номер дня недели из RTC DS1307. Всё остальное вытаскивается нормально, а день недели всё время 2. Вот функция, отвечающая за это:
Код
void rtc_get_time(rtc_type *rtc_var)
{
    i2c_start();
    i2c_write_addr(DS1307_ADDR | WR);
    i2c_write(0x00);
    i2c_start();
    i2c_write_addr(DS1307_ADDR | RD);

    rtc_var->seconds = bcd2dec(i2c_read(ACK) & 0x7F);
    rtc_var->minutes = bcd2dec(i2c_read(ACK));
    rtc_var->hours = bcd2dec(i2c_read(ACK) & 0x3F);

    rtc_var->weekday = i2c_read(ACK) & 0x07;

    rtc_var->day = bcd2dec(i2c_read(ACK));
    rtc_var->month = bcd2dec(i2c_read(ACK));
    rtc_var->year = bcd2dec(i2c_read(NOT_ACK)) + 2002;

    i2c_stop();
    return;
}
Go to the top of the page
 
+Quote Post
Stanislav_S
сообщение May 5 2008, 19:15
Сообщение #2


извечный пессимист
*****

Группа: Свой
Сообщений: 1 113
Регистрация: 9-10-06
Из: Днепропетровск
Пользователь №: 21 125



Вот моя функция все прекрасно читает
void RTC_GET_TIME(TIME_type * TIME_var)
{
I2C_START();
I2C_DATA_WRITE(DS1307_ADR|WR);
I2C_DATA_WRITE(DS1307_SECUNDS);
I2C_START();
I2C_DATA_WRITE(DS1307_ADR|RD);
TIME_var->secunds=I2C_DATA_READ(ACK);
TIME_var->minutes=I2C_DATA_READ(ACK);
if(AM_PM)
{
TIME_var->hours=I2C_DATA_READ(ACK)&0x3F;
}
else
{
TIME_var->hours=I2C_DATA_READ(ACK)&0x1F;
}
TIME_var->day=I2C_DATA_READ(ACK);
TIME_var->date=I2C_DATA_READ(ACK);
TIME_var->month=I2C_DATA_READ(ACK);
TIME_var->year=I2C_DATA_READ(ACK_NOT);
I2C_STOP();
TIME_var->hours2=HOURS(OFSET_H2,AM_PM);
TIME_var->hours3=HOURS(OFSET_H3,AM_PM);
TIME_var->hours4=HOURS(OFSET_H4,AM_PM);
}


--------------------
Slaves are those of this world
Given freedom to lay chains upon The Master
The wolf is no longer free
Release the chains and come for me
Go to the top of the page
 
+Quote Post
TarasG
сообщение May 5 2008, 19:36
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 72
Регистрация: 25-02-08
Пользователь №: 35 378



А правда, что день недели нужно выставлять при инициализации? И как потом быть с переводом часов? Допустим я выставил 5.05.2008 понедельник, а потом мне надо перевести на 6.05.2008, день недели изменится автоматически или надо вручную вторник выставлять? Тогда получается надо в МК записывать календарь.
И ещё одно. ds1307 может работать с годом 0-99. Какие из этих чисел соответствуют високосным годам? 0, 4, 8 и т.д. или другие?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 5 2008, 19:50
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



День недели автоматом не ставится, это просто счетчик.

Цитата(TarasG @ May 5 2008, 23:36) *
Какие из этих чисел соответствуют високосным годам? 0, 4, 8 и т.д. или другие?

0, 4, 8 и т.д. Сломается в 2100-м году.
Go to the top of the page
 
+Quote Post
defunct
сообщение May 5 2008, 20:01
Сообщение #5


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(aaarrr @ May 5 2008, 22:50) *
0, 4, 8 и т.д. Сломается в 2100-м году.

Есть на то основания?
100 / 4 = 25 без остатка.

Про проблему 2000 года тоже много разного трещали все кому не лень. Деньги зарабатывали продавая паленые MIO карты как специальные адаптеры устраняющие проблемы Y2K. А на деле - ведь нет никакой проблемы.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 5 2008, 20:28
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(defunct @ May 6 2008, 00:01) *
Есть на то основания?

2000-й год был високосным (делится на 400), 2100-й не будет. А вышла DS1307 до 2000-го года.
Но вряд ли кого-либо интересует сейчас "проблема 2100" smile.gif
Go to the top of the page
 
+Quote Post
TarasG
сообщение May 5 2008, 20:44
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 72
Регистрация: 25-02-08
Пользователь №: 35 378



Цитата(aaarrr @ May 5 2008, 22:50) *
День недели автоматом не ставится, это просто счетчик.

Очень жаль sad.gif Значит эту функцию придётся возложить на МК...
Цитата(aaarrr @ May 5 2008, 22:50) *
0, 4, 8 и т.д.

Спасибо, я так и думал.
Цитата(aaarrr @ May 5 2008, 23:28) *
2000-й год был високосным (делится на 400), 2100-й не будет. А вышла DS1307 до 2000-го года.
Но вряд ли кого-либо интересует сейчас "проблема 2100" smile.gif

Вообще-то 2100 тоже будет високосным (я имею ввиду не в DS1307, а в жизни). А вот в RTC 2100 года быть не может. Точнее, это зависит от того, какую константу я добавлю к значению года (почему-то принято 2000, но ничего не мешает добавить любой другой, кратный 4). Т.е. после 2099 года будет снова 2000 - високосный год. Или этот регистр не закольцован, как остальные?

А вообще эта проблема меня действительно волнует мало, т.к. я скорей всего до этого не доживу smile.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 5 2008, 20:54
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(TarasG @ May 6 2008, 00:44) *
Вообще-то 2100 тоже будет високосным

Не будет: делится на 100 нацело.
Go to the top of the page
 
+Quote Post
TarasG
сообщение May 5 2008, 21:02
Сообщение #9


Участник
*

Группа: Новичок
Сообщений: 72
Регистрация: 25-02-08
Пользователь №: 35 378



Цитата(aaarrr @ May 5 2008, 23:54) *
Не будет: делится на 100 нацело.

2000 тоже делится на 100 нацело. Только он был високосным.

У меня ещё один вопрос по теме. Если день недели всего счётчик, то считает ли он перевод часов? Т.е. если я переведу часы (календарь) на сутки вперёд, добавится ли к дню недели единица? Или это тоже надо реализовывать программно?

Сообщение отредактировал TarasG - May 5 2008, 21:08
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 5 2008, 21:04
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(TarasG @ May 6 2008, 01:02) *
2000 тоже делится на 100 нацело. Только он был високосным.

2000 делится еще и на 400.

Цитата(TarasG @ May 6 2008, 01:02) *
У меня ещё один вопрос по теме. Если день недели всего счётчик, то считает ли он перевод часов? Т.е. если я переведу часы (календарь) на сутки вперёд, добавится ли к дню недели единица? Или это тоже надо реализовывать программно?

Нет, нужно делать программно.
Go to the top of the page
 
+Quote Post
TarasG
сообщение May 5 2008, 21:10
Сообщение #11


Участник
*

Группа: Новичок
Сообщений: 72
Регистрация: 25-02-08
Пользователь №: 35 378



Цитата(aaarrr @ May 6 2008, 00:04) *
2000 делится еще и на 400.

Да, простите. Только что прочитал на Википедии. То, о чём я говорю, называется Юлианским календарём. А современный мир живёт по Григорианскому. А я думал, високосный год идёт каждые 4 года 05.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 5 2008, 21:12
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(TarasG @ May 6 2008, 01:10) *
А я думал, високосный год идёт каждые 4 года 05.gif

Ну, почти smile.gif А в нашем с вами случае - уж наверняка smile.gif smile.gif
Go to the top of the page
 
+Quote Post
TarasG
сообщение May 5 2008, 21:33
Сообщение #13


Участник
*

Группа: Новичок
Сообщений: 72
Регистрация: 25-02-08
Пользователь №: 35 378



Ещё такой вопрос: зачем в этой микросхеме нужны регистры памяти 0x08-0x3F? Или их просто можно использовать как внешнюю память?
Go to the top of the page
 
+Quote Post
Stanislav_S
сообщение May 5 2008, 21:38
Сообщение #14


извечный пессимист
*****

Группа: Свой
Сообщений: 1 113
Регистрация: 9-10-06
Из: Днепропетровск
Пользователь №: 21 125



Цитата(TarasG @ May 6 2008, 02:33) *
Ещё такой вопрос: зачем в этой микросхеме нужны регистры памяти 0x08-0x3F? Или их просто можно использовать как внешнюю память?

Именно так, я их обычно для этого и использую, очень удобно.


--------------------
Slaves are those of this world
Given freedom to lay chains upon The Master
The wolf is no longer free
Release the chains and come for me
Go to the top of the page
 
+Quote Post
TarasG
сообщение May 6 2008, 10:15
Сообщение #15


Участник
*

Группа: Новичок
Сообщений: 72
Регистрация: 25-02-08
Пользователь №: 35 378



Цитата(aaarrr @ May 6 2008, 00:04) *
Нет, нужно делать программно.

Получается, для меня не имеет значения, как RTC считет дни недели - с понедельника или с воскресенья. Я могу присвоить 6 мая 2008 года число 2 (вторник для меня и понедельник для RTC), но об этой разнице никто и не заподозрит, если все мои функции будут 2 обрабатывать как вторник. Правильно я рассуждаю?

Сообщение отредактировал TarasG - May 6 2008, 10:16
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 01:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01492 секунд с 7
ELECTRONIX ©2004-2016