AVR double float - время и дата.
- Valentin44
- Встал на лапы
- Сообщения: 104
- Зарегистрирован: Пн ноя 15, 2010 23:48:09
- Откуда: Украина, Кривой Рог
AVR double float - время и дата.
Странное название темы, но сейчас все объясню.
Есть на PC некая программа, написанная на DELPHI. Она открывает файл, считывает оттуда данные и строит график.
Есть устройство на avr (mega128), которое на SD карту пишет данные для той программы.
И все хорошо, но не могу передать дату и время. Дело в том, что в фале дата и время должны храниться как doble float TDateTime в формате если можно так сказать, совместимым с Делпфи.
Как мне с генерировать дату и время, в совместимом с Деплфи формате? Там дата - целое число, а время - дробная часть. Вроде все просто, но только переменная double float, которой в нет в AVR. Пишу на CodeVision.
Переписать программу для ПК невозможно. Альтернативное решение - написать внешний конвертер, но это очень крайний вариант.
Есть на 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 передавать эту структуру, как обычный массив байтов нужной длины - и проблема решена. примерно как-то так...
битва с дураками проиграна, победители торжествуют. слава победителям!
- Valentin44
- Встал на лапы
- Сообщения: 104
- Зарегистрирован: Пн ноя 15, 2010 23:48:09
- Откуда: Украина, Кривой Рог
Re: AVR double float - время и дата.
Мастер Ломастер, Структура даты и времени такая: целая часть числа - количество дней после 31.12.1899 года (вроде). Дробная часть - количество времени (не помню секунд?) после 12:00 АМ. Формат весьма своеобразный. И занимает все то 8 байт. Вычислить целую (дату) и дробную (время) части числа допустим я смогу, а как сформировать Доубле флоат программно? ( 8 байт). Это для меня загадка 
pyzhman, формат может и оригинальный, но значения которые я записываю как float (4 байта) успешно читаются программой на ПК.
pyzhman, формат может и оригинальный, но значения которые я записываю как float (4 байта) успешно читаются программой на ПК.
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: AVR double float - время и дата.
Дело не в успешности чтения, а в форме представления. Естественно, что со стороны меги можно представить как угодно. Раз уж в дельфи не залезть.
Docendo discimus
- Реклама
Re: AVR double float - время и дата.
Мастер Ломастер уже ответил вам - отдельно, по частям. Высчитываете дату, переводите в четырёхбайтное целое, затем время так же, потом просто склеиваете их и передаёте.Вычислить целую (дату) и дробную (время) части числа допустим я смогу, а как сформировать Доубле флоат программно? ( 8 байт). Это для меня загадка
Всё условно. Даты, времена, дроби, степени... Есть только нули и единицы. А контроллер умеет ими жанглировать как ни кто другой.
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: AVR double float - время и дата.
вам не надо формировать float, это сделает делфи. вам нужно разузнать, какие из этих 8 байт для делфи являются целой частью, а какие дробной, а потом просто нужные байты заполнить вычисленными значениями. то есть вы будете оперировать просто с массивом восьми байтов, а вот делфи в этом массиве распознает свой дабл-флоатValentin44 писал(а):И занимает все то 8 байт. Вычислить целую (дату) и дробную (время) части числа допустим я смогу, а как сформировать Доубле флоат программно? ( 8 байт).
битва с дураками проиграна, победители торжествуют. слава победителям!
- Valentin44
- Встал на лапы
- Сообщения: 104
- Зарегистрирован: Пн ноя 15, 2010 23:48:09
- Откуда: Украина, Кривой Рог
Re: AVR double float - время и дата.
Абсолютно да! Вот и спрашиваю, может кто-то уже делал подобное.
Вот высчитал я целую, и дробную части. А как с них сделать массив 8 байт, что бы он был похож на формат доубл блоат.
Прочитал http://ru.wikipedia.org/wiki/Число_одинарной_точности это, потом про число двойной точности.
Вроде и понятно, но как оформить на С? И главное, как избежать ошибок. Отладка такого преобразования сложная, просто не видно результата (надо прошивать проект в железе, запустить, логировать, смотреть). Я не профи, накосячить могу на любом этапе.
Вот высчитал я целую, и дробную части. А как с них сделать массив 8 байт, что бы он был похож на формат доубл блоат.
Прочитал http://ru.wikipedia.org/wiki/Число_одинарной_точности это, потом про число двойной точности.
Вроде и понятно, но как оформить на С? И главное, как избежать ошибок. Отладка такого преобразования сложная, просто не видно результата (надо прошивать проект в железе, запустить, логировать, смотреть). Я не профи, накосячить могу на любом этапе.
Re: AVR double float - время и дата.
Сделайте только целое (можно прямо руками прописать в коде), ноль вместо времени, выплюньте железке. Если программа правильно прочитает - первая часть верна. И так далее.
Это только кажется сложно, на самом деле, если голову приложить, можно отладить в течении получаса...
Это только кажется сложно, на самом деле, если голову приложить, можно отладить в течении получаса...
-
demiurg301
- Опытный кот
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Re: AVR double float - время и дата.
ничего оригинального IEEE_STD_754. Кстати в delphi передаётся один в один.pyzhman писал(а):В CV float имеет весьма оригинальный формат.
Проще всёже конвертер. В том же delphi. Передаёте текстом, а потом стандартными функциями конвертите в TDateTime. 10 строк кода, кнопка и TStringlList.Переписать программу для ПК невозможно. Альтернативное решение - написать внешний конвертер, но это очень крайний вариант.
Ну как вариант, если вам кажется ,что это намного сложнее формирования double, то это не так.
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: AVR double float - время и дата.
В чем тогда проблема у ТС?в delphi передаётся один в один
Docendo discimus
- Valentin44
- Встал на лапы
- Сообщения: 104
- Зарегистрирован: Пн ноя 15, 2010 23:48:09
- Откуда: Украина, Кривой Рог
Re: AVR double float - время и дата.
Проблема в том, что в AVR float 4 байта, а там надо двойной флоат, 8 байт.
Почитал как получить флоат, должно получиться. Как отстрою - отпишусь. Релаьно для передачи даты и времени достаточно 5 байт. 3 байт можно забить нулями - точности хватает для передачи времени с точностью до секунды. И еще байт в котором Экспонента хранится, то же можно сделать фиксированным. Фактически надо формировать только 4 байта. Но там нюансы, начало байта начинается по средина байта
Надо делать сдвиги,. еще не придумал.
Еще, ерунда в том, что надо считать сколько прошло дней от 1899 года, до текущей даты,.. а это и разное количество дней в месяцах, и высокосные года.
Почитал как получить флоат, должно получиться. Как отстрою - отпишусь. Релаьно для передачи даты и времени достаточно 5 байт. 3 байт можно забить нулями - точности хватает для передачи времени с точностью до секунды. И еще байт в котором Экспонента хранится, то же можно сделать фиксированным. Фактически надо формировать только 4 байта. Но там нюансы, начало байта начинается по средина байта
Еще, ерунда в том, что надо считать сколько прошло дней от 1899 года, до текущей даты,.. а это и разное количество дней в месяцах, и высокосные года.
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: AVR double float - время и дата.
сдвиги делать не надо, используйте структуру с битовыми полями, тогда все сдвиги, если потребуется, сделает компилятор без вашего участияValentin44 писал(а):Но там нюансы, начало байта начинается по средина байтаНадо делать сдвиги
и это не надо делать: вычислите заранее число дней на 1.01.2012 и потом плюсуйте его к своей относительной дате, как константу - зачем каждый раз вычислять ПРОШЛОЕ, если туда возврата нет и быть не может? кстати, это самое количество дней вы можете взять из самой DelphiValentin44 писал(а):Еще, ерунда в том, что надо считать сколько прошло дней от 1899 года, до текущей даты,.. а это и разное количество дней в месяцах, и высокосные года.
битва с дураками проиграна, победители торжествуют. слава победителям!
- Valentin44
- Встал на лапы
- Сообщения: 104
- Зарегистрирован: Пн ноя 15, 2010 23:48:09
- Откуда: Украина, Кривой Рог
Re: AVR double float - время и дата.
Да,.. таки я туповат

Так и не смог сделать эмуляцию 64 битного float.
Читал много описаний на float, на одинарный и двойной. Но самостоятельно записать какое-то число так и не смог.
Это высшая математика
За то нашел бит, к которому можно добавлять еще бит, и увеличивать число на 1 день. Как выход с ситуации пойдет. Надо только проверить, сколько так можно плюсовать, на несколько лет если хватит - хорошо. А вот с секундами - хуже. Нет такого бита, к которому можно добавить 1 и получить +1 к секундам. Единица отсчета не секунда.
Из-за казалось бы такой мелочи, как запись даты и времени, сколько проблем.
Так и не смог сделать эмуляцию 64 битного float.
Читал много описаний на float, на одинарный и двойной. Но самостоятельно записать какое-то число так и не смог.
Это высшая математика
За то нашел бит, к которому можно добавлять еще бит, и увеличивать число на 1 день. Как выход с ситуации пойдет. Надо только проверить, сколько так можно плюсовать, на несколько лет если хватит - хорошо. А вот с секундами - хуже. Нет такого бита, к которому можно добавить 1 и получить +1 к секундам. Единица отсчета не секунда.
Из-за казалось бы такой мелочи, как запись даты и времени, сколько проблем.
- Valentin44
- Встал на лапы
- Сообщения: 104
- Зарегистрирован: Пн ноя 15, 2010 23:48:09
- Откуда: Украина, Кривой Рог
Re: AVR double float - время и дата.
Проблему таки решил.
Как создать свое 64 битное флоат, так и не понял. Что-то у меня не выходило.
Нашел готовые библиотеки, но они занимали 5 кб флеша.
Решение было таково:
Взял готовое число. В калькуляторе вычислил какие биты отвечают за дату, какие за время. Получил два long int, но в одном байте было и время и дата, младшие биты одного и старшие второго. Пришлось склеивать. как результат - все работает отлично
Минимум размера флеша, RAM.
Код состоит с нескольких частей, поделиться могу если кому надо или просто интересно.
Как создать свое 64 битное флоат, так и не понял. Что-то у меня не выходило.
Нашел готовые библиотеки, но они занимали 5 кб флеша.
Решение было таково:
Взял готовое число. В калькуляторе вычислил какие биты отвечают за дату, какие за время. Получил два long int, но в одном байте было и время и дата, младшие биты одного и старшие второго. Пришлось склеивать. как результат - все работает отлично
Код состоит с нескольких частей, поделиться могу если кому надо или просто интересно.


