Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: demanik, ivan_fd  
IEEE754 для протона
MiXaS Дата: Ср, 08.05.2013, 12:15  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 549
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Здравствуйте! Поздравляю Вас с прошедшими и наступающими праздниками!

Существует стандарт IEEE754. Дело в том, что нужно связаться с PLC, тип данных нужно передать с плавающей запятой, но стандартный float не подходит. Нашел на с++ пример, но непонятно работает он у автора или нет, короче я его перебил в Протон, но он не работает.

Все примеры там приводятся математические, а как реализовать программно, у меня не хватает навыков.

Думаю с этим несчастьем я не первый и не последний сталкнулся.

помогите пожалуйста распедалить данный стандарт. Я нащел ещё один пример, но с синтаксисом совсем запутался. Так и не смог определить язык. Написано, что вроде код PHP, но открывал мануалы, а там даже близко не подходит.

За любую информацию благодарен!
Спасибо!
ЯНДЕКС Дата: 08.05.2013
ivan_fd Дата: Ср, 08.05.2013, 16:59  |                                                                                                                Сообщение # 2
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 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
Репутация: 27   ±
Замечания:   ±
На сайте с 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
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Не надо Вам ничего разложивать, стандарт ieee754 и microchip float отличаются только расположением бита знака и экспоненты.

Сейчас постараюсь сделать код для контроллера.
MiXaS Дата: Чт, 09.05.2013, 13:34  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 549
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Спасибо! большое! Я уже разобрал как разложить wacko
Код
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
Репутация: 124   ±
Замечания:   ±
На сайте с 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/
Прикрепления: FloatMicrochip.zip (17.1 Kb)

Сообщение отредактировал ivan_fd - Чт, 09.05.2013, 15:05
MiXaS Дата: Сб, 11.05.2013, 01:13  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 549
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

большое спаисибо! ща буду смотреть!

Добавлено (11.05.2013, 01:13)
---------------------------------------------
Не прёт cool
Открыл мануал на протон, а там производитель заявляет, что используют 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
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Что значит не прет? Я же Вам дал готовый пример и апноут от микрочипа, где описано формат.



Объясните, что именно не работает????
MiXaS Дата: Сб, 11.05.2013, 18:34  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 549
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Цитата (ivan_fd)
Объясните, что именно не работает????


Открываю Ваш проект, запускаю отладку. flt = 0x0020

Меняю в протоне значение переменной, компелирую, заново запускаю flt = 0x0020.
Открыл Ваш архив, ничего не изменял, кроме значения переменной flt
ivan_fd Дата: Сб, 11.05.2013, 18:41  |                                                                                                                Сообщение # 10
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Какой у вас Протеус?

Поставьте вместо COFF файла BAS и попробуйте. Вы же видите, что у меня все работает.
MiXaS Дата: Сб, 11.05.2013, 18:54  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 549
Репутация: 27   ±
Замечания:   ±
На сайте с 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,  Огромное Вам спасибо! Много нового узнал из этой темы!
Удачи!!!

Прикрепления: 0587848.jpg (193.8 Kb)
ЯНДЕКС Дата: 11.05.2013
  • Страница 1 из 1
  • 1
Поиск: