Форум: "Основная";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
ВнизПрямой код Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.013 c