Проблема float to string во Flowcode

PIC версия программы(разные темы)

Re: Проблема float to string во Flowcode

Сообщение Sergey (Sergey) » 19 янв 2013, 14:26

1. переменная типа float записывается во флеш-область и занимает там 4 байта, а int занимает 2 байта.
2. 0,0625; 0,125; 0,1875; 0,25; 0,3125; 0,375; 0,4375; 0,5; 0,5625; 0,625; 0,6875; 0,75; 0,8125; 0,875; 0,9375; 1 - как-то так. Вообщем можно обойтись и сотыми.
3. расчет для входного напряжения 5В:
fVoltage = MX_ADC_VREF_V=500; //Convert reference voltage count to floating point (0 - 500 x 10mV)
fVoltage = fVoltage * 0.01=500 * 0.01=5; //Convert reference voltage count to actual voltage (0 - 5)
fVperDiv = fVoltage * 0.000976=5 * 0.000976=0,00488; //Convert actual voltage to voltage per division (VRef / 1024)
fSample = iSample=1023; //Convert to floating point variable
fVoltage = fSample * fVperDiv=1023 * 0,00488=4,99224; //Calculate floating point voltage
выходное напряжение во флоат 4,99224В
Ник: Sergey
Имя: Sergey
Специалист
Специалист
Информация о пользователе

Re: Проблема float to string во Flowcode

Сообщение mim (mim) » 19 янв 2013, 15:31

Sergey писал(а):1. переменная типа float записывается во флеш-область и занимает там 4 байта...
2. 0,0625; 0,125; 0,1875; 0,25; 0,3125; 0,375; 0,4375; 0,5; 0,5625; 0,625; 0,6875; 0,75; 0,8125; 0,875; 0,9375; 1 - как-то так. Вообщем можно обойтись и сотыми.
3. расчет для входного напряжения 5В:
fVoltage = MX_ADC_VREF_V=500; //Convert reference voltage count to floating point (0 - 500 x 10mV)
fVoltage = fVoltage * 0.01=500 * 0.01=5; //Convert reference voltage count to actual voltage (0 - 5)
fVperDiv = fVoltage * 0.000976=5 * 0.000976=0,00488; //Convert actual voltage to voltage per division (VRef / 1024)
fSample = iSample=1023; //Convert to floating point variable
fVoltage = fSample * fVperDiv=1023 * 0,00488=4,99224; //Calculate floating point voltage
выходное напряжение во флоат 4,99224В

Ну, наконец-то мысль ожила...
1. Ровно столько же занимает и переменная Лонг (целая). Представление Флоат - дай поиск в инете "ieee 4 byte floating point" и посмотри. На представление Флоат задействуется куча математики...
Таким образом применять Лонг и повышать порядок (умножая на 10, 100 или 1000) и добавлять разделитель дроби самостоятельно - более выгодно чем подключать библиотеку Флоат (хотя ресурс твоего МК это позволяет)... Целочисленные вычисления быстрее.
2. "Вообщем можно обойтись и сотыми" - это мне напомнило знаменитую фразу "Казнить нельзя помиловать". Так какой смысл ты вложил в свое умозаключение?????????
Я предлагал не использовать сотые и вот почему...И где ответ о точности измерения? В ДАТЕ этот параметр указан.
18b20.jpg

3. Ну слава богу... Вот теперь устраним ошибку Матриксов. Это значение 0.000976 - есть масштаб по отношению к одному вольту VRef / 1024. Однако формула должна выглядеть как VRef / 1023=1/1023=0,000977, но можно добавить точность 0,00097752. Именно потому, что 1024 значения это вместе с нулем и до 1023, таким образом между 1024 значениями расположено 1023 интервала... Нуль, он и в Африке нуль...
Исправь в Макросе Матриксов. Вот теперь пересчитай... Почаще смотри что они там творят.

ЗЫ А теперь разберемся что такое Строки в Си . Например, начни от сюда. Продолжи по Инету и дай ответ - какой формат в стандарте Си имеет Строка, что в конце ее...?
У вас нет доступа для просмотра вложений в этом сообщении.
I Am Legend
Аватар пользователя
Ник: mim
Имя: mim
(Из Лесу, вестимо...)
Легенда
Легенда
Информация о пользователе

Re: Проблема float to string во Flowcode

Сообщение Sergey (Sergey) » 21 янв 2013, 00:53

1. Посмотрел в инете ieee "ieee 4 byte floating point" - увидел, что математики много. Только если честно, то она не совсем понятна.
"Таким образом применять Лонг и повышать порядок (умножая на 10, 100 или 1000) и добавлять разделитель дроби самостоятельно" - вообщем из всего я понял что в "макрос ReadAsVoltage" int iSample сделать unsigned long int iSample. :oops:
2. Таблица просто супер. Уже начинаю понимать как надо работать (Эту таблиц должен был делать я)! Из таблицы понятно, что только десятые. Смысл в сотые вложил такой - чтобы точнее измеряло, но твоя таблица все раставила на свои места.
Насчет точности, я вроде все говорил и весь даташит перечитал, остался вроде один параметр - это +-0,5С.
3. Просто замечательно! Пересчитал при входных 5В на выходе будет 5,0000148 В.
Теперь можно не делая лишнюю математику сразу изменять предел входного напряжения (задав нужное значение #define MX_ADC_VREF_V ???), это если например на входе 12В, то вместо ??? нужно написать 1200, конечно, которые прошли через делитель и вложились в диапазон 5В микроконтроллера (но это если нужно, так для общего развития сказал).
4. Строки в Си. В Си используются нуль-терминированные строки. Вообще конце строки используется или символ 0, или байт 0xFF (255) или код символа «$», но в частности в си нуль-терминированные строки в конце строки ставиться 0. Это понятно.
Ник: Sergey
Имя: Sergey
Специалист
Специалист
Информация о пользователе
Вернуться наверх

Re: Проблема float to string во Flowcode

Сообщение mim (mim) » 21 янв 2013, 09:10

Sergey писал(а):1. Посмотрел в инете ieee "ieee 4 byte floating point" - увидел, что математики много. Только если честно, то она не совсем понятна.
2. я понял что в "макрос ReadAsVoltage" int iSample сделать unsigned long int iSample. :oops:
3. Эту таблиц должен был делать я! остался один параметр - это +-0,5С.
4. Теперь можно задав нужное значение #define MX_ADC_VREF_V ??? написать 1200, конечно
5. В Си используются нуль-терминированные строки в конце строки ставиться 0. Это понятно.

1. Значит есть к чему стремится...
2. Не верно. Речь шла о НЕиспользовании "ReadAsVoltage", и применении "ReadAsInt". Я всегда использую целочисленную арифметику. Об этом много написано (и на форуме, поэтому не хочу повторяться).
3. Ты же не внемлешь, что тебе говорят. Таким образом, заявленная точность 0,5С предполагает калибровку датчика, ну, и тем более, уж ни как не нужно стремится к сотым долям, они могут учитываются при расчетах (имеется ввиду округление к десятым см. таблицу).
4. До определенной степени да, только задавать нужно именно в строке #define MX_ADC_VREF_V (через свойства не получится).
5. Вот здесь и кроется следующая ошибка. Если бы тебе было "понятно", то ты не стремился бы переписывать функцию конвертации строк.
В компиляторе есть очеyь большое количество функции для различных преобразований см. описание компилятора Boostc.
Матриксы написали свою. Каждый раз я пишу о том, что нужно смотреть на то что получается после компиляции. Даже тупое рассматривание непонятных заков в конечном итоге приведет к пониманию....

Функция Матриксов "FloatToString" находится в файле internals.h. Все что видит Пользователь в функции "FloatToString" - это возможность вставить Переменную типа "Строка" - FloatToString (Строка). После компиляции функция выглядит так
FCI_FLOAT_TO_STRING(FCV_ФЛОАТ, FCV_СТРОКА, 6 ,FCSZ_СТРОКА);

FCV_ФЛОАТ - переменная которую преобразуем.
FCV_СТРОКА - это имя массива - строки;
6 - это количество символов после запятой - "Precision" точность преобразования, так назвали это Матриксы - постоянное значение.
FCSZ_СТРОКА - это длинна нашей строки, в твоем случае - это число 6, потому что массив из 6 символов.

Таким образом, имея массив из 6 знаков, функция FloatToString заполнит его до самого конца, потому что, только точность занимает 6 знаков после запятой, при этом в конец строки не будет записан НУЛЬ. Функция Матриксов этого не делает.
При выводе строки на ЖКИ используется макрос putchar, тот, кто писал этот макрос, должен был предусмотреть возможность задавать длинну отображаемой строки, обычно так и делают. Автор putchar для определения длинны строки (массива) использует функцию "strlen" (смотри в тексте). Эта функция определяет длину до первого Нуля. Ну, а поскольку длинна массива, в твоем случае, 6 символов (а макрос Матриксов записал туда все что пересчитал из флоат, кроме нуля) функция strlen может искать конец строки и за границей массива, пока не наткнется на Нуль.
Поэтому и возникает вот такая белиберда. Естественно и длинна строки не соответствует твоему желанию в шесть символов.
3310.jpg

Как от этого избавиться - смотри комментарий в программе.
Float_to_str.rar

Как представить Флоат для передачи по каналам связи или для записи в ЕЕПРОМ - будет позже.

ЗЫ Забыл написать - изучи что такое "указатель", действия с указателями - все что связано с указателями и массивами...
У вас нет доступа для просмотра вложений в этом сообщении.
I Am Legend
Аватар пользователя
Ник: mim
Имя: mim
(Из Лесу, вестимо...)
Легенда
Легенда
Информация о пользователе
Вернуться наверх

Re: Проблема float to string во Flowcode

Сообщение Sergey (Sergey) » 21 янв 2013, 12:44

mim я очень вам благодарен! Проверил в железе - все работает как в протеусе. Это не то, что я проверяю Вас, это чтобы порадоваться, что работает.
Кстати в пункте 2. "я понял что в "макрос ReadAsVoltage" int iSample сделать unsigned long int iSample" я уже только сегодня утром понял, до Вашего ответа, что нужно использовать "ReadAsInt".
Разъяснения просто супер все понятно!!!!!
Надеюсь, что дальше возьмемся за интерфейст usb?
Уже смотрю про указатель! :)
Ник: Sergey
Имя: Sergey
Специалист
Специалист
Информация о пользователе
Вернуться наверх

Re: Проблема float to string во Flowcode

Сообщение Sergey (Sergey) » 21 янв 2013, 13:52

Вообщем указатель - это неопределенный тип переменной, который хранит адрес какого-либо объекта(переменной).
Вообщем про действия - при выполнении какого-то действия над указателем (инкрементирование, декрментирование, сложение, вычитание) изменяется не значение переменной, на которую указывает указатель, а изменяется адрес указателя, т.е указатель указывает на новое (другое) значение.
Или как в википедии - две основные операции над ними: присваивание и разыменование. Первая из этих операций присваивает указателю некоторый адрес. Вторая служит для обращения к значению в памяти, на которое указывает указатель.
Это вроде понятно!
Да, а про массивы я и раньше читал - тоже вроде понятно.
Ник: Sergey
Имя: Sergey
Специалист
Специалист
Информация о пользователе
Вернуться наверх

Re: Проблема float to string во Flowcode

Сообщение mim (mim) » 21 янв 2013, 14:11

Sergey писал(а):Да, а про массивы я и раньше читал - тоже вроде понятно.

Ну и ладненько...
К сожалению Матриксы даже в 5 версии не предусмотрели работу с указателями. Указатели нужно определять через Си, но страшного здесь ничего нет...
Это первый способ представления Флоат для компактного хранения или передачи.
Float_to_st_4Br.rar

Есть и второй способ - структуры данных и объединения. Для понимания разберись с этим понятием "typedef union"...
Float_to_str_Uni.rar
У вас нет доступа для просмотра вложений в этом сообщении.
I Am Legend
Аватар пользователя
Ник: mim
Имя: mim
(Из Лесу, вестимо...)
Легенда
Легенда
Информация о пользователе
Вернуться наверх

Re: Проблема float to string во Flowcode

Сообщение Sergey (Sergey) » 21 янв 2013, 16:02

Получается с этого примера мне не нужно слать строку на пк, а побайтно. Просто класс!!!!
А для сведения - если использовать добавление последнего 0 к строке, то эта строка корректно отошлется на пк или нет?
Чего спращиваю
Программа, которая обрабатывает (Labview) пишет ошибку:
LabVIEW: An input parameter is invalid. For example if the input is a path, the path might contain a character not allowed by the OS such as ? or @.
т.е. некорректное число принимается.
Ник: Sergey
Имя: Sergey
Специалист
Специалист
Информация о пользователе
Вернуться наверх

Re: Проблема float to string во Flowcode

Сообщение Sergey (Sergey) » 21 янв 2013, 16:30

Кстати по typedef union - это когда
typedef unsigned int UINT;
UINT i, j; // две переменных типа unsigned int
Что-то наподобие define.
Вроде понятно.
Ник: Sergey
Имя: Sergey
Специалист
Специалист
Информация о пользователе
Вернуться наверх

Re: Проблема float to string во Flowcode

Сообщение mim (mim) » 21 янв 2013, 17:40

Sergey писал(а):Программа, которая обрабатывает (Labview) пишет ошибку: некорректное число принимается.

Какой формат для Labview я не знаю, но где-то я уже принимал обсуждение по Labview, конец строки в его формате могут быть коды 10 и 13. Смотри ASCII формат. Нуль к этому не имеет ни какого отношения. Значит дополнительно нужно вставить коды 10 и 13. Запусти поиск на старом форуме - "перевод строки", "Labview" . Гугл в помощь "labview LF (перевод строки) CR (возврат каретки)". Например.

Sergey писал(а):Кстати по typedef union - это когда
typedef unsigned int UINT;
UINT i, j; // две переменных типа unsigned int
Что-то наподобие define.
Вроде понятно.

Чушь полная... Продолжай поиски.
I Am Legend
Аватар пользователя
Ник: mim
Имя: mim
(Из Лесу, вестимо...)
Легенда
Легенда
Информация о пользователе
Вернуться наверх

Пред.След.

Вернуться в Flowcode PIC

Кто сейчас на форуме

Пользователь просматривает форум: нет зарегистрированных пользователей