AVR double float - время и дата.

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
Valentin44
Встал на лапы
Сообщения: 104
Зарегистрирован: Пн ноя 15, 2010 23:48:09
Откуда: Украина, Кривой Рог

AVR double float - время и дата.

Сообщение Valentin44 »

Странное название темы, но сейчас все объясню.

Есть на PC некая программа, написанная на DELPHI. Она открывает файл, считывает оттуда данные и строит график.
Есть устройство на avr (mega128), которое на SD карту пишет данные для той программы.
И все хорошо, но не могу передать дату и время. Дело в том, что в фале дата и время должны храниться как doble float TDateTime в формате если можно так сказать, совместимым с Делпфи.

Как мне с генерировать дату и время, в совместимом с Деплфи формате? Там дата - целое число, а время - дробная часть. Вроде все просто, но только переменная double float, которой в нет в AVR. Пишу на CodeVision.

Переписать программу для ПК невозможно. Альтернативное решение - написать внешний конвертер, но это очень крайний вариант.
Реклама
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: AVR double float - время и дата.

Сообщение Мастер Ломастер »

я не знаю, как именно в Delphi устроена структура TDateTime, но я уверен, что заставить AVR формировать дату в нужном формате возможно. Так или иначе, но double float должна иметь какое-то количество байт на дату и какое-то на время. можно создать обычныю структуру с соответствующими полями, которые заполнять в AVR, а в программу Delphi передавать эту структуру, как обычный массив байтов нужной длины - и проблема решена. примерно как-то так...
битва с дураками проиграна, победители торжествуют. слава победителям!
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: AVR double float - время и дата.

Сообщение pyzhman »

В CV float имеет весьма оригинальный формат.
Docendo discimus
Аватара пользователя
Valentin44
Встал на лапы
Сообщения: 104
Зарегистрирован: Пн ноя 15, 2010 23:48:09
Откуда: Украина, Кривой Рог

Re: AVR double float - время и дата.

Сообщение Valentin44 »

Мастер Ломастер, Структура даты и времени такая: целая часть числа - количество дней после 31.12.1899 года (вроде). Дробная часть - количество времени (не помню секунд?) после 12:00 АМ. Формат весьма своеобразный. И занимает все то 8 байт. Вычислить целую (дату) и дробную (время) части числа допустим я смогу, а как сформировать Доубле флоат программно? ( 8 байт). Это для меня загадка :(

pyzhman, формат может и оригинальный, но значения которые я записываю как float (4 байта) успешно читаются программой на ПК.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: AVR double float - время и дата.

Сообщение pyzhman »

Дело не в успешности чтения, а в форме представления. Естественно, что со стороны меги можно представить как угодно. Раз уж в дельфи не залезть.
Docendo discimus
Реклама
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: AVR double float - время и дата.

Сообщение ploop »

Вычислить целую (дату) и дробную (время) части числа допустим я смогу, а как сформировать Доубле флоат программно? ( 8 байт). Это для меня загадка
Мастер Ломастер уже ответил вам - отдельно, по частям. Высчитываете дату, переводите в четырёхбайтное целое, затем время так же, потом просто склеиваете их и передаёте.

Всё условно. Даты, времена, дроби, степени... Есть только нули и единицы. А контроллер умеет ими жанглировать как ни кто другой.
Реклама
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: AVR double float - время и дата.

Сообщение Мастер Ломастер »

Valentin44 писал(а):И занимает все то 8 байт. Вычислить целую (дату) и дробную (время) части числа допустим я смогу, а как сформировать Доубле флоат программно? ( 8 байт).
вам не надо формировать float, это сделает делфи. вам нужно разузнать, какие из этих 8 байт для делфи являются целой частью, а какие дробной, а потом просто нужные байты заполнить вычисленными значениями. то есть вы будете оперировать просто с массивом восьми байтов, а вот делфи в этом массиве распознает свой дабл-флоат
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Valentin44
Встал на лапы
Сообщения: 104
Зарегистрирован: Пн ноя 15, 2010 23:48:09
Откуда: Украина, Кривой Рог

Re: AVR double float - время и дата.

Сообщение Valentin44 »

Абсолютно да! Вот и спрашиваю, может кто-то уже делал подобное.
Вот высчитал я целую, и дробную части. А как с них сделать массив 8 байт, что бы он был похож на формат доубл блоат.
Прочитал http://ru.wikipedia.org/wiki/Число_одинарной_точности это, потом про число двойной точности.
Вроде и понятно, но как оформить на С? И главное, как избежать ошибок. Отладка такого преобразования сложная, просто не видно результата (надо прошивать проект в железе, запустить, логировать, смотреть). Я не профи, накосячить могу на любом этапе.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: AVR double float - время и дата.

Сообщение ploop »

Сделайте только целое (можно прямо руками прописать в коде), ноль вместо времени, выплюньте железке. Если программа правильно прочитает - первая часть верна. И так далее.
Это только кажется сложно, на самом деле, если голову приложить, можно отладить в течении получаса...
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: AVR double float - время и дата.

Сообщение demiurg301 »

pyzhman писал(а):В CV float имеет весьма оригинальный формат.
ничего оригинального IEEE_STD_754. Кстати в delphi передаётся один в один.

Переписать программу для ПК невозможно. Альтернативное решение - написать внешний конвертер, но это очень крайний вариант.
Проще всёже конвертер. В том же delphi. Передаёте текстом, а потом стандартными функциями конвертите в TDateTime. 10 строк кода, кнопка и TStringlList.
Ну как вариант, если вам кажется ,что это намного сложнее формирования double, то это не так.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: AVR double float - время и дата.

Сообщение pyzhman »

в delphi передаётся один в один
В чем тогда проблема у ТС?
Docendo discimus
Аватара пользователя
Valentin44
Встал на лапы
Сообщения: 104
Зарегистрирован: Пн ноя 15, 2010 23:48:09
Откуда: Украина, Кривой Рог

Re: AVR double float - время и дата.

Сообщение Valentin44 »

Проблема в том, что в AVR float 4 байта, а там надо двойной флоат, 8 байт.
Почитал как получить флоат, должно получиться. Как отстрою - отпишусь. Релаьно для передачи даты и времени достаточно 5 байт. 3 байт можно забить нулями - точности хватает для передачи времени с точностью до секунды. И еще байт в котором Экспонента хранится, то же можно сделать фиксированным. Фактически надо формировать только 4 байта. Но там нюансы, начало байта начинается по средина байта :) Надо делать сдвиги,. еще не придумал.

Еще, ерунда в том, что надо считать сколько прошло дней от 1899 года, до текущей даты,.. а это и разное количество дней в месяцах, и высокосные года.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: AVR double float - время и дата.

Сообщение Мастер Ломастер »

Valentin44 писал(а):Но там нюансы, начало байта начинается по средина байта :) Надо делать сдвиги
сдвиги делать не надо, используйте структуру с битовыми полями, тогда все сдвиги, если потребуется, сделает компилятор без вашего участия
Valentin44 писал(а):Еще, ерунда в том, что надо считать сколько прошло дней от 1899 года, до текущей даты,.. а это и разное количество дней в месяцах, и высокосные года.
и это не надо делать: вычислите заранее число дней на 1.01.2012 и потом плюсуйте его к своей относительной дате, как константу - зачем каждый раз вычислять ПРОШЛОЕ, если туда возврата нет и быть не может? кстати, это самое количество дней вы можете взять из самой Delphi
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Valentin44
Встал на лапы
Сообщения: 104
Зарегистрирован: Пн ноя 15, 2010 23:48:09
Откуда: Украина, Кривой Рог

Re: AVR double float - время и дата.

Сообщение Valentin44 »

Да,.. таки я туповат :( :)
Так и не смог сделать эмуляцию 64 битного float.
Читал много описаний на float, на одинарный и двойной. Но самостоятельно записать какое-то число так и не смог.
Это высшая математика :(

За то нашел бит, к которому можно добавлять еще бит, и увеличивать число на 1 день. Как выход с ситуации пойдет. Надо только проверить, сколько так можно плюсовать, на несколько лет если хватит - хорошо. А вот с секундами - хуже. Нет такого бита, к которому можно добавить 1 и получить +1 к секундам. Единица отсчета не секунда.

Из-за казалось бы такой мелочи, как запись даты и времени, сколько проблем.
Аватара пользователя
Valentin44
Встал на лапы
Сообщения: 104
Зарегистрирован: Пн ноя 15, 2010 23:48:09
Откуда: Украина, Кривой Рог

Re: AVR double float - время и дата.

Сообщение Valentin44 »

Проблему таки решил.

Как создать свое 64 битное флоат, так и не понял. Что-то у меня не выходило.
Нашел готовые библиотеки, но они занимали 5 кб флеша.

Решение было таково:
Взял готовое число. В калькуляторе вычислил какие биты отвечают за дату, какие за время. Получил два long int, но в одном байте было и время и дата, младшие биты одного и старшие второго. Пришлось склеивать. как результат - все работает отлично :) Минимум размера флеша, RAM.


Код состоит с нескольких частей, поделиться могу если кому надо или просто интересно.
Закрыто

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