IEEE754 для протона
|
|
MiXaS |
Дата: Ср, 08.05.2013, 12:15 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Здравствуйте! Поздравляю Вас с прошедшими и наступающими праздниками!
Существует стандарт IEEE754. Дело в том, что нужно связаться с PLC, тип данных нужно передать с плавающей запятой, но стандартный float не подходит. Нашел на с++ пример, но непонятно работает он у автора или нет, короче я его перебил в Протон, но он не работает.
Все примеры там приводятся математические, а как реализовать программно, у меня не хватает навыков.
Думаю с этим несчастьем я не первый и не последний сталкнулся.
помогите пожалуйста распедалить данный стандарт. Я нащел ещё один пример, но с синтаксисом совсем запутался. Так и не смог определить язык. Написано, что вроде код PHP, но открывал мануалы, а там даже близко не подходит.
За любую информацию благодарен! Спасибо!
|
|
|
|
ivan_fd |
Дата: Ср, 08.05.2013, 16:59 | Сообщение # 2 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
C этим несчастьем я столкнулся, когда делал паяльную станцию. И для обмена между компом и контроллером нужно было передавать FLOAT числа.
А так как микрочиповский формат и компьютерный не одинаковые, то я подготавливал число прямо на компе, а в контроллер уже посылал его родной формат.
Пример преобразования на Паскале:
Код function DecodeMeterFloat(D : dword) : single; var F : single absolute D; tmp: dword; const Mask1 = $FF800000; Mask2 = $80000000; begin tmp := (D and not Mask1) or ((D and Mask2) shr 8); D := tmp or ((D and Mask1) shl 1); // D := (D and not Mask1) or ((D and Mask1) shl 1); result := F; end; Но вам похоже нужно в процессоре преобразовать в IEEE754.
|
|
|
|
MiXaS |
Дата: Чт, 09.05.2013, 01:33 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
так точно! pic должен посылать 4 байта в этом формате. Добавлено (09.05.2013, 01:33) --------------------------------------------- Прочитал ещё несколько раз статью, скачал от туда же калькулятор и понял, что просто необходимо представить десятичное число с плавающей точкой, в двоичное число с плавающей точкой в экспоненциальном нормализованном виде. Т.е. 155,625 = 1∙27 +0∙26+0∙25+1∙24+1∙23+0∙22+1∙21+1∙20+1∙2-1+0∙2-2+1∙2-3 155,625 =128 + 0 + 0 + 16 + 8 + 0 + 2 + 1 + 0,5 + 0 + 0,125 155,62510 = 10011011,101 2 - число в десятичной и в двоичной системе с плавающей точкой
тогда напрашивается другой вопрос. Как заставить контроллер разложить число??
|
|
|
|
ivan_fd |
Дата: Чт, 09.05.2013, 13:19 | Сообщение # 4 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Не надо Вам ничего разложивать, стандарт ieee754 и microchip float отличаются только расположением бита знака и экспоненты.
Сейчас постараюсь сделать код для контроллера.
|
|
|
|
MiXaS |
Дата: Чт, 09.05.2013, 13:34 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Спасибо! большое! Я уже разобрал как разложить Код While a>=1 b=a//2 array1 [c]=b a=(a-b)/2 Inc c Wend
Вот еще вопрос. Где почитать про float протоновский. его стандарт. Спасибо!Добавлено (09.05.2013, 13:34) --------------------------------------------- Чуть не забыл. С ПРАЗДНИКОМ! ЭТО ОДИН ИЗ НЕ МНОГИХ ПРАЗДНИКОВ, КОТОРЫЙ ЗАСЛУЖИВАЕТ НОСИТЬ ИМЯ ПРАЗДНИК.
|
|
|
|
ivan_fd |
Дата: Чт, 09.05.2013, 15:04 | Сообщение # 6 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Говорю еще раз ничего не нужно раскладывать, Вам нужно просто передать число (Float) в формате IEEE754.
Код Dim flt As Float flt = -10.6
main:
Bcf STATUS,C ' \ Rlcf FLTH,F ' \ Конвертация в IEE754 Rrcf flt,F ' / Rrcf FLTH,F ' /
Bcf STATUS,C ' \ Rlcf FLTH,F ' \ Конвертация в Microchip Rlcf flt,F ' / Rrcf FLTH,F ' /
GoTo main
Вот и все, весь код.
Цитата Где почитать про float протоновский. Он не протоновский, а микрочипа.
http://ww1.microchip.com/downloads/en/AppNotes/00575.pdf
http://onembedding.bialix.com/info/float/
Сообщение отредактировал
ivan_fd - Чт, 09.05.2013, 15:05
|
|
|
|
MiXaS |
Дата: Сб, 11.05.2013, 01:13 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
большое спаисибо! ща буду смотреть! Добавлено (11.05.2013, 01:13) --------------------------------------------- Не прёт Открыл мануал на протон, а там производитель заявляет, что используют microchip float и что он отличается от ieee 754 экспанентой и знаком. стр 50. Я уже сделал в тупую: побитно копирую все биты float microchip и записываю их в нужном порядке. А не соответствует выходной текст необходимому. Код FLT1.0=flt.0 FLT1.1=flt.1 FLT1.2=flt.2 FLT1.3=flt.3 FLT1.4=flt.4 FLT1.5=flt.5 FLT1.6=flt.6 FLT1.7=flt.7 FLT1.8=flt.8 FLT1.9=flt.9 FLT1.10=flt.10 FLT1.11=flt.11 FLT1.12=flt.12 FLT1.13=flt.13 FLT1.14=flt.14 FLT1.15=flt.15 FLT1.16=flt.16 FLT1.17=flt.17 FLT1.18=flt.18 FLT1.19=flt.19 FLT1.20=flt.20 FLT1.21=flt.21 FLT1.22=flt.22 FLT1.23=flt.24 FLT1.24=flt.25 FLT1.25=flt.26 FLT1.26=flt.27 FLT1.27=flt.28 FLT1.28=flt.29 FLT1.29=flt.30 FLT1.30=flt.31 FLT1.31=flt.23
flt - микрочип FLT1 - ieee 754
При flt = 2 в идеале FLT1 = 40000000, а равняется 80 Их пример пробовал, те же яйца. Лукавят может??
|
|
|
|
ivan_fd |
Дата: Сб, 11.05.2013, 14:46 | Сообщение # 8 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Что значит не прет? Я же Вам дал готовый пример и апноут от микрочипа, где описано формат.
Объясните, что именно не работает????
|
|
|
|
MiXaS |
Дата: Сб, 11.05.2013, 18:34 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Цитата (ivan_fd) Объясните, что именно не работает????
Открываю Ваш проект, запускаю отладку. flt = 0x0020
Меняю в протоне значение переменной, компелирую, заново запускаю flt = 0x0020. Открыл Ваш архив, ничего не изменял, кроме значения переменной flt
|
|
|
|
ivan_fd |
Дата: Сб, 11.05.2013, 18:41 | Сообщение # 10 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Какой у вас Протеус?
Поставьте вместо COFF файла BAS и попробуйте. Вы же видите, что у меня все работает.
|
|
|
|
MiXaS |
Дата: Сб, 11.05.2013, 18:54 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Вот скрин Добавлено (11.05.2013, 18:43) --------------------------------------------- Ща попробую. Вообще версия 7.7 sp2/ Добавлено (11.05.2013, 18:50) --------------------------------------------- Так! Походу я жестко лоханулся! Цитата (MiXaS) flt = 0x0020 это адрес!
Вот вопрос. как в протеусе изменить тип данных отображения переменной? Ща выводит в десятичной. Хочу в шеснадцатиричнойДобавлено (11.05.2013, 18:51) ---------------------------------------------
Цитата (ivan_fd) Поставьте вместо COFF файла BAS и попробуйте. Это реально помогло!!!Добавлено (11.05.2013, 18:53) --------------------------------------------- Все и с этим разобрался! Добавлено (11.05.2013, 18:54) --------------------------------------------- ivan_fd, Огромное Вам спасибо! Много нового узнал из этой темы! Удачи!!!
|
|
|
|