Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Преобразуване на данни от един вид в друг?!
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=467
Страница 1 от 1

Автор:  PIC [ Пет Мар 11, 2005 1:30 pm ]
Заглавие:  Преобразуване на данни от един вид в друг?!

Здравейте , заинатих се с един RТС да го чета и да изобразявам на дисплея час , дата , ден и година. Модела е DS2417. Направен е като 32-битов двоичен брояч , който може да се чете и записва по 1-Wire протокол на Dallas. Проблем при комуникацията нямам , но нещо с формата на данните недоумявам как ще стане работата? Въпроса е как от тези 32 бита да извлека секунди , минути и часове /тук може и да се справя/, а след това дата , ден и година. Ако някой се е занимавал с тези неща ще съм благодарен за мнения по въпроса!
:drinkers:

Автор:  Predator_MF [ Пет Мар 11, 2005 1:43 pm ]
Заглавие: 

Ше се справиш, сигурен съм...Значи имаш няколко начина, така като гледам в datasheet-a...Часовника ти е обикновен секундомер, за разлика от DS1307 например...
Datasheet написа:
The real-time clock is a 32-bit binary counter. It is incremented once per second. The real-time clock
can accumulate 136 years of seconds before rolling over. Time/date is represented by the number of
seconds since a reference point, which is determined by the user. For example, 12:00 a.m., January 1,
1970 could be a reference point.

Т.е. избираш си една "reference" дата, например деня, в който програмираш контролера. Оттам нататък добавяш числото от часовника, към референса ти... Единственото което трябва да правиш е да преобразуваш секунди в минута, час, ден, месец, година :D .

Автор:  bateAz [ Пет Мар 11, 2005 2:44 pm ]
Заглавие: 

Predator-е, не е толкова лесна работата. За секунди, минути, часове и дни няма проблеми - с делене се решава, напр

seconds = clock_value % 60;
minutes = (clock_value - seconds) % 3600; и т.н.

за да определи датата обаче ще трябва да мисли кои месеци коло дни имат, коя година е високосна и т.н. Явно ще трябва да се помисли за нещо по-тарикатско, щото иначе ми изглежда много дървено ( лошото е, че и аз така съм го правил :cry: ). Ти правил ли си нещо с него?

Автор:  PIC [ Пет Мар 11, 2005 2:52 pm ]
Заглавие: 

Дай малко по-подробно. Първоначално може да направим всеки месец 31дни. Мисълта ми е като алгоритъм как да стане. А иначе с делене няма проблем за часа. Значи трябва да запазя няколко регистъра в процесора за часа , деня и т.н. Само че как ще добавям прочетената стойност от часовника на всяка секунда към тези регистри? Например 24часа са 86400сек. Това в двоичен код е: 10101000110000000. При увеличаване на това число с 1 трябва да увелича датата с един ден. Та това нещо не мога да зацепа. Дай някакъв пример ако можеш.

Автор:  Реконструктор [ Пет Мар 11, 2005 3:26 pm ]
Заглавие: 

Задължително ли е сам да я пишеш функцията? Ползвай localtime() и gmtime(), стандартни за ANSI C.

Автор:  Predator_MF [ Пет Мар 11, 2005 3:29 pm ]
Заглавие: 

Абе не мога да се сетя за правилото за восокосна година...нещо съм изкуфял днеска :lol: ...така де, не съм правил нищо с тоя DS, предпочитам DS1307, но след като вече е почнато...пък и тъкмо съм загрял на тема "Date-Time" формати и преобразуване (един даталогер правя)...
Правиш си няколко регистъра в процесора...:
hr, min, day, mth, year.
При настройката на устройството, въвеждаш някъде във еепром-а константно число, което ще ти е "референс". Може да използваш форматиране на дата-час, за да не хабиш пространство...Пример за кодиране на дата в 16-битов вид:
bit 15:9 - year || bit 8:5 - month || bit 4:0 - day.
Тъй като годината ще е число след 2000, ползваш референс 01/01/2000. Във битове от 15 до 9 можеш да събереш 2^7 = 128 години (мисля че ще ти стигнат :) ). В битове 8:5 можеш да събереш 2^4 = 16 месеца (е, ще ползваш само 12), и в битове 4:0 можеш да събереш 2^5 = 32 дена (максимум 32 :lol: ). Така се прави във FAT таблиците, на мен ми е много удобно.
Оттук нататък ще ти трябва една функция, която да превръща секундите от DS-a във съответните hr, min, day, mth, year. Например:
Код:
int8 sec_to_hr (unsigned int32 sec){
   Result = sec / 3600;}

int8 sec_to_min(unsigned int32 sec){
   Result =  sec / 60;}
...
int8 sec_to_year(unsigned int32 sec){
   Result = sec / 31536000;}
...
void update_datetime(sec){
    DShr = sec_to_hr(datafromDS);
    DSmin = sec_to_min(datafromDS);
    ...
    DSyear = sec_to_year(datafromDS);
    ...
    date = reference_date + DSdate;
    mth  = reference_mth +  DSmth;
    ...
    year = reference_year + DSyear;
    check_number_of_days(mth);
    check_leap_year();    // Ще проверява дали е високосна годината...
                                    // Ако не е висок. и датата е 29 февруари,
                                    // добавяш едно към месеца, правиш деня  01...
    check_number_of_days(year); // Ако е високосна ти си знаеш... :lol: }

       

Автор:  bateAz [ Пет Мар 11, 2005 3:55 pm ]
Заглавие: 

Ехе, DOS формат :lol:
Това и баба го знае. (разбирай Бил Гейтс)Тук обаче е различно. Мериш само секунди. Т'ва е!

Автор:  Predator_MF [ Пет Мар 11, 2005 3:59 pm ]
Заглавие: 

Е, хубаво де, аз имах в предвид спестяване на място, не е задължително...Имаш няколко прости функции...Настройваш си референс дата-час и нулираш часовника. Работата е готова, само остава някой да я свърши :lol:

Автор:  Реконструктор [ Пет Мар 11, 2005 5:06 pm ]
Заглавие: 

Predator_MF написа:
Абе не мога да се сетя за правилото за восокосна година...нещо съм изкуфял днеска :lol:


Високосна е всяка, която се дели на 4, с изключение на тези, които се делят на 1000, с изключение на тези, които се делят на 400. :)

Автор:  danov [ Пет Мар 11, 2005 8:45 pm ]
Заглавие:  Re: Преобразуване на данни от един вид в друг?!

Това е стандартния формат за представяне на времето във unix. Може да питаш google за "unix time" и ще ти разкаже доста неща:
http://www.google.com/search?q=unix+time&sourceid=mozilla-search&start=0&start=0&ie=utf-8&oe=utf-8

и да прочетеш:
http://en.wikipedia.org/wiki/Unix_epoch

Автор:  Цецо [ Нед Мар 13, 2005 8:07 pm ]
Заглавие: 

Хвърли тоя хронометър и си вземи чип календар. Няма смисъл да завиваш гайка с отверка.

Автор:  eddiesoft [ Сря Юни 27, 2007 12:08 pm ]
Заглавие: 

След 3 години се намесвам, защото и аз се мъча в момента с тоя чип и когато имам на един PIC само един свободен крак на който трябва да закача няколко датчика този хронометър е перфектен.


EDDIESoft

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/