![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Прямой код [D5, Win2k]
nikolos © (2005-09-16 10:21:00)Уважаемые мастера, помогите. По COM порту читаю из прибора данные в прямом коде, значащих битов 12. Как мне различить положительные и отрицательные значения?
nikolos (2005-09-16 15:31:00) [1]Громадное СПАСИБО всем и особенно Defunct и Mbo!!! А я, пень, и отнимал 2000 и вроде ничего так получалось, а понять почему не сумел. Еще раз огромное спасибо!!
Defunct (2005-09-16 15:21:00) [2]nikolos (16.09.05 14:49) [11]
аа тогда понятно...
у тебя принимаются данные с диффернциального АЦП?
тогда все еще проще, вот так:
Result := Result - $800;
nikolos (2005-09-16 15:18:00) [3]http://webfile.ru/522387.Данные читаются с $100 адресса: Hi $81 Lo $81 Hi $81 Lo
MBo (2005-09-16 15:08:00) [4]>как можно файлик выложить?
www.webfile.ru
nikolos (2005-09-16 14:50:00) [5]прошу прощения, Defunct
nikolos (2005-09-16 14:49:00) [6]Согласно доке на прибор, данные передаются в прямом коде. Если собирать байт безо всяких преобразований, то с прибора снимается замечательный синус, только строится он выше абсцисс, а сигнал подается +/-. Вот и стала проблема с проходом через ноль. Если делать как предложил Defunc, то снизу все в порядке, а наверху непонятно что творится :(. А как можно файлик выложить?
MBo (2005-09-16 14:33:00) [7]>размножаю до 15
Если речь действительно идет о прямом коде, то знаковый бит размножать нельзя - это работает только для обратного и дополнительного кодов.
Я тут подумал - а может, у тебя и не код прямой, а упаковка байтов прямая, в отличие от интеловской обратной?
Может, выложишь где-то файлик с последовательно принятыми данными (именно в том порядке, как идут от прибора), которые, по твоим предположениям, плавно переходят через 0, и хорошо бы, чтобы более-менее охватывали диапазон данных.
Defunct (2005-09-16 14:06:00) [8]> Может что-то не так делаю?
да делаешь что-то не так..
Собирай в integer вот так:
Result := (<Старший байт> shl 8) + <младший байт>;
if (Result and $0800) <> 0 then
Result := -(Result and $07FF);
nikolos (2005-09-16 14:02:00) [9]Defunct: Это не пример. Я просто потерялся во всех этих битах :(.
Меня еще смушает, что в двух байтный smallint без проблем пишется $ffffffff. Или это вовсе не проблема?
nikolos (2005-09-16 13:56:00) [10]От прибора значения приходят по два байта. Собираю в smallint. Значащие биты от 0..11 остальные 12..15 нулевые. Выделяю 11-й бит, размножаю до 15. Может что-то не так делаю?
Defunct (2005-09-16 13:55:00) [11]nikolos (16.09.05 12:46) [2]
> значащих битов 12.
ты же сказал 12 бит, почему же приводишь 8?
1111 0101 в твоем случае это 245.
MBo (2005-09-16 12:59:00) [12]>ocean © (16.09.05 12:55) [3]
В обратном коде - да, -5
MBo (2005-09-16 12:58:00) [13]>1111 0101 - это -5 или -117?
Для прямого 8-битного кода - -117
Может, у тебя код на самом деле 16-разрядный?
Или 11-й бит неправильно выделяешь...
Или код не прямой, а обратный или дополнительный...
ocean (2005-09-16 12:55:00) [14]мне кажется, 1111 0101 b - это 1111 1111 b - 1111 0101 b = -1010 b = -5 dec
nikolos (2005-09-16 12:46:00) [15]Проверяю 11-й бит: стоит - отрицательное, нет -положительное, в результате имею большой скачек при переходе через ноль. 1111 0101 - это -5 или -117?
MBo (2005-09-16 12:26:00) [16]Ну так старший бит проверять.
прямой код - самый простой - старший бит - знак, остальные - модуль числа.
Разве этого нет в поисковиках?