Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.09;
Скачать: CL | DM;

Вниз

Прямой код   Найти похожие ветки 

 
nikolos   (2005-09-16 10:21) [0]

Уважаемые мастера, помогите. По COM порту читаю из прибора данные в прямом коде, значащих битов 12. Как мне различить положительные и отрицательные значения?


 
MBo ©   (2005-09-16 12:26) [1]

Ну так старший бит проверять.
прямой код - самый простой - старший бит - знак, остальные - модуль числа.
Разве этого нет в поисковиках?


 
nikolos   (2005-09-16 12:46) [2]

Проверяю 11-й бит: стоит - отрицательное, нет -положительное, в результате имею большой скачек при переходе через ноль. 1111 0101 - это -5 или -117?


 
ocean ©   (2005-09-16 12:55) [3]

мне кажется, 1111 0101 b - это 1111 1111 b - 1111 0101 b = -1010 b = -5 dec


 
MBo ©   (2005-09-16 12:58) [4]

>1111 0101 - это -5 или -117?
Для прямого 8-битного кода -   -117

Может, у тебя код на самом деле 16-разрядный?
Или 11-й бит неправильно выделяешь...
Или код не прямой, а обратный или дополнительный...


 
MBo ©   (2005-09-16 12:59) [5]

>ocean ©   (16.09.05 12:55) [3]
В обратном коде - да, -5


 
Defunct ©   (2005-09-16 13:55) [6]

nikolos   (16.09.05 12:46) [2]
> значащих битов 12.

ты же сказал 12 бит, почему же приводишь 8?
1111 0101 в твоем случае это 245.


 
nikolos   (2005-09-16 13:56) [7]

От прибора значения приходят по два байта. Собираю в smallint. Значащие биты от 0..11 остальные 12..15 нулевые. Выделяю 11-й бит, размножаю до 15. Может что-то не так делаю?


 
nikolos   (2005-09-16 14:02) [8]

Defunct: Это не пример. Я просто потерялся во всех этих битах :(.
Меня еще смушает, что в двух байтный smallint без проблем пишется $ffffffff. Или это вовсе не проблема?


 
Defunct ©   (2005-09-16 14:06) [9]

> Может что-то не так делаю?

да делаешь что-то не так..

Собирай в integer вот так:

Result := (<Старший байт> shl 8) + <младший байт>;
if  (Result and $0800) <> 0 then
  Result := -(Result and $07FF);


 
MBo ©   (2005-09-16 14:33) [10]

>размножаю до 15
Если речь действительно идет о прямом коде, то знаковый бит размножать нельзя - это работает только для обратного и дополнительного кодов.

Я тут подумал - а может, у тебя и не код прямой, а упаковка байтов прямая, в отличие от интеловской обратной?
Может, выложишь где-то файлик с последовательно принятыми данными (именно в том порядке, как идут от прибора), которые, по твоим предположениям, плавно переходят через 0, и хорошо бы, чтобы более-менее охватывали диапазон данных.


 
nikolos   (2005-09-16 14:49) [11]

Согласно доке на прибор, данные передаются в прямом коде. Если собирать байт безо всяких преобразований, то с прибора снимается замечательный синус, только строится он выше абсцисс, а сигнал подается +/-. Вот и стала проблема с проходом через ноль. Если делать как предложил Defunc, то снизу все в порядке, а наверху непонятно что творится :(. А как можно файлик выложить?


 
nikolos   (2005-09-16 14:50) [12]

прошу прощения, Defunct


 
MBo ©   (2005-09-16 15:08) [13]

>как можно файлик выложить?
www.webfile.ru


 
nikolos   (2005-09-16 15:18) [14]

http://webfile.ru/522387. Данные читаются с $100 адресса: Hi $81 Lo $81 Hi $81 Lo


 
Defunct ©   (2005-09-16 15:21) [15]

nikolos   (16.09.05 14:49) [11]

аа тогда понятно...
у тебя принимаются данные с диффернциального АЦП?
тогда все еще проще, вот так:

Result := Result - $800;


 
nikolos   (2005-09-16 15:31) [16]

Громадное СПАСИБО всем и особенно Defunct и Mbo!!! А я, пень, и отнимал 2000 и вроде ничего так получалось, а понять почему не сумел. Еще раз огромное спасибо!!



Страницы: 1 вся ветка

Текущий архив: 2005.10.09;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.024 c
1-1127241643
QwertyKz
2005-09-20 22:40
2005.10.09
шрифт заголовка окна


14-1127116268
Fay
2005-09-19 11:51
2005.10.09
Написание оптимального кода под Delphi


9-1117475173
WandR
2005-05-30 21:46
2005.10.09
Проблема с затекстуриванием


1-1126187723
Igor_thief
2005-09-08 17:55
2005.10.09
Работа с USB


8-1116517391
Expl
2005-05-19 19:43
2005.10.09
Двигать изображение в TImage