Отговори на тема  [ 12 мнения ] 
Преобразуване на данни от един вид в друг?! 
Автор Съобщение
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

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


Пет Мар 11, 2005 1:30 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Ше се справиш, сигурен съм...Значи имаш няколко начина, така като гледам в 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 .


Пет Мар 11, 2005 1:43 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Predator-е, не е толкова лесна работата. За секунди, минути, часове и дни няма проблеми - с делене се решава, напр

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

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


Пет Мар 11, 2005 2:44 pm
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

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


Пет Мар 11, 2005 2:52 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
Задължително ли е сам да я пишеш функцията? Ползвай localtime() и gmtime(), стандартни за ANSI C.


Пет Мар 11, 2005 3:26 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Абе не мога да се сетя за правилото за восокосна година...нещо съм изкуфял днеска :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: }

       


Пет Мар 11, 2005 3:29 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Ехе, DOS формат :lol:
Това и баба го знае. (разбирай Бил Гейтс)Тук обаче е различно. Мериш само секунди. Т'ва е!


Пет Мар 11, 2005 3:55 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Е, хубаво де, аз имах в предвид спестяване на място, не е задължително...Имаш няколко прости функции...Настройваш си референс дата-час и нулираш часовника. Работата е готова, само остава някой да я свърши :lol:


Пет Мар 11, 2005 3:59 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
Predator_MF написа:
Абе не мога да се сетя за правилото за восокосна година...нещо съм изкуфял днеска :lol:


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


Пет Мар 11, 2005 5:06 pm
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Вто Ное 16, 2004 4:43 pm
Мнения: 85
Местоположение: София
Мнение 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


Пет Мар 11, 2005 8:45 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Хвърли тоя хронометър и си вземи чип календар. Няма смисъл да завиваш гайка с отверка.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Нед Мар 13, 2005 8:07 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Нед Фев 04, 2007 5:44 pm
Мнения: 90
Мнение 
След 3 години се намесвам, защото и аз се мъча в момента с тоя чип и когато имам на един PIC само един свободен крак на който трябва да закача няколко датчика този хронометър е перфектен.


EDDIESoft


Сря Юни 27, 2007 12:08 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 12 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 5 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни