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

 
 
> Электронный календарь, как вычислять время, дату от RTC счетчика ?
-=Sergei=-
сообщение Jul 8 2010, 11:43
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 339
Регистрация: 26-10-04
Пользователь №: 985



Есть счетчик с секундами, как из них вычислить время и дату исходя из того что нулевое значение например 1 января 1980 года ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
barabek
сообщение Jul 8 2010, 12:16
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(-=Sergei=- @ Jul 8 2010, 22:43) *
Есть счетчик с секундами, как из них вычислить время и дату исходя из того что нулевое значение например 1 января 1980 года ?

Ну и считайте: в минуте 60 сек, далее 60 мин, 24часа, далее дни, месяцы и годы с учетом количества дней в месяцах и добавочном дне високосных годах. Вопрос то в чем? Для примера :


Код
//                                                                               ян фв мр ап мй ин ил ав сн ок нб дек
unsigned int code mounth_end[12]={31,28,31,30,31,30,31,31,30,31,30,31};

unsigned char xdata RTCcapture[6];
enum {YEAR,MONTH,DAY,HOUR,MINUTE};

                                  
void ConvertArrToTime(void)
    {
     unsigned long ticks;
         unsigned char i;
         ticks=*(unsigned long*)RTCcapture;
         ticks/=60;
         RTCcapture[MINUTE]=ticks%60;
              ticks/=60;
         RTCcapture[HOUR]=ticks%24;
         ticks/=24;

         RTCcapture[YEAR]=ticks/(365*4+1);    //учитываем високосные года
         ticks-=RTCcapture[YEAR]*(365*4+1);
         i=ticks/365;
         ticks-=i*365;
         RTCcapture[YEAR]=RTCcapture[YEAR]*4+i;
         for(i=0;i<11;i++)
             {
                  if(i==1 && !(RTCcapture[YEAR]&0x03))                    //високосный февраль
                           {if(ticks>=29)ticks-=29;else break;}
                  else
                           {if(ticks>=mounth_end[i])ticks-=mounth_end[i];else break;}
             }
         RTCcapture[MONTH]=i+1;
         RTCcapture[DAY]=ticks+1;
    }


Но учтите, что код писан левой ногой и очень давно на заре туманной юности  smile.gif, даю только для примера (нулевая точка 2000год, код для c51). Вы пишите более рационально - без лишних делений, глобальных переменных и т.д. 
ЗЫ Сейчас самому страшен такой код, хотя я не так далеко и продвинулся, может стереть пример, дабы людей не смешить smile.gif
Go to the top of the page
 
+Quote Post
Shamil
сообщение Jul 8 2010, 12:22
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 160
Регистрация: 23-12-04
Из: Уфа
Пользователь №: 1 631



Цитата(-=Sergei=- @ Jul 8 2010, 17:43) *
Есть счетчик с секундами, как из них вычислить время и дату исходя из того что нулевое значение например 1 января 1980 года ?

Код
//
// Переводит кол-во секунд с 00:00:00 1-го января 2000 года
// в день, месяц, год
//
u_int32    ToGregorData(u_int32 SecondQn)
{
    u_int32 d = SecondQn / 86400 + 2451544;
    u_int32 Z = d+1;
    u_int32 A = Z;
    if( Z >= 2299161 )
    {
        u_int32 Alpha = ((Z*4-7468865) / 146097);
        A = Z + 1 + Alpha - Alpha/4;
    }

    {
        u_int32 B = A + 1524;
        u_int32 C = (B*40 - 4884) / 14610;
        u_int32 D = (1461 * C)/4;
        u_int32 E = ((B - D)*10000/306001);
        u_int32 Day = B - D - (306001 * E)/10000;

        u_int32 Month = E - 13;
        u_int32 Year = C - 4715;

        if( E < 14 )
            Month = E - 1;

        if( Month > 2 )
            Year = C - 4716;

        return (Day%100)*10000+(Month%100)*100+Year%100;
    }
}


Ну, а со временем суток, я думаю, сами справитесь...
Go to the top of the page
 
+Quote Post
-=Sergei=-
сообщение Jul 8 2010, 13:37
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 339
Регистрация: 26-10-04
Пользователь №: 985



Премного благодарен!

Сообщение отредактировал rezident - Jul 9 2010, 23:18
Причина редактирования: Нарушение п.3.4 Правил форума.
Go to the top of the page
 
+Quote Post
adnega
сообщение Jul 8 2010, 13:40
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Реализовывал, но в пределах от 2000 до 2099 года. Если устроит, есть функции перевода из секунд в дату, из даты в секунды.
Go to the top of the page
 
+Quote Post
adnega
сообщение Jul 8 2010, 15:16
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Вот так
Код
//-------------------------------------------------------------
//    int    date_to_int(int y, int m, int d)
//-------------------------------------------------------------
int    date_to_int(int y, int m, int d)
{
    if(m<3)
    {
        m+=12;
        y-=1;
    }
    return ((y*1461)>>2)+((m*306+7)/10)+d-730533;
}

//-------------------------------------------------------------
//    void int_to_date(int jd, int &y, int &m, int &d)
//-------------------------------------------------------------
void int_to_date(int jd, int *y, int *m, int *d)
{
    *d=jd+730533;
    *y=((*d<<2)/1461);
    *d-=((*y*1461)>>2);
    *m=(((*d*10)-7)/306);
    if(*m==0)
    {
        *m+=12;
        *y-=1;
    }
    *d=jd-date_to_int(*y,*m,1)+1;
}
Go to the top of the page
 
+Quote Post
gregory812
сообщение Jul 21 2010, 21:09
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 23-11-06
Из: Odessa
Пользователь №: 22 646



В следующем Application Note http://www.st.com/stonline/products/literature/an/14949.pdf в разделе 3 (Clock/calendar functionality features) все очень подробно описано с помощью блок-схем. Упоминается также о исключениях среди високосных годов каждые 400 лет.
Go to the top of the page
 
+Quote Post
adnega
сообщение Jul 22 2010, 06:12
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(gregory812 @ Jul 22 2010, 01:09) *
В следующем Application Note http://www.st.com/stonline/products/literature/an/14949.pdf в разделе 3 (Clock/calendar functionality features) все очень подробно описано с помощью блок-схем. Упоминается также о исключениях среди високосных годов каждые 400 лет.


Полусофтовый вариант (на стр. 11 есть соответствующее предупреждение).

Если нужен день недели (автоматически рассчитываемый по дате), то лучше делать иначе - в счетчике RTC держать и дату и время (аппаратно). Получать значения при необходимости. Формулы выше.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 18:22
Рейтинг@Mail.ru


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