|
Нестандартный 2's complement
|
|||
---|---|---|---|
#18+
У меня ADC меряет положительные и отрицательные напряжения. Резолюция 18 бит. В случае положительного напряжения все просто - полученное значение умножить на вес бита volt = adc_value * bit_weight. В случае отрицательного напряжения нужно сначала сделать 2's complement. Но если в обычном int 31-й бит = 1 отрицательное значение то у меня 17-й бит = 1 отрицательное значение. Что нужно делать в моем случае? Шифт влево а потом шифт вправо? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2020, 13:11 |
|
Нестандартный 2's complement
|
|||
---|---|---|---|
#18+
сделал так Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
С# ругается - Error CS0266 Cannot implicitly convert type 'uint' to 'int'. An explicit conversion exists (are you missing a cast?) причем adc_val |= (int)0xfffc0000; не помогает ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2020, 14:32 |
|
Нестандартный 2's complement
|
|||
---|---|---|---|
#18+
jenya7, Зачем сдвиги? Для любого числа бит делается одинаково. Если надо получить абсолютное значение то просто делается XOR + 1. x = (x ^ 0x3FFFF) + 1 // 0x3FFFF это 18 младших единичных бит ну и обратно аналогично. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2020, 14:34 |
|
Нестандартный 2's complement
|
|||
---|---|---|---|
#18+
Или имелось в виду что надо расширить до 32-битного? (Судя по попыткам в последующем посте) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2020, 14:36 |
|
Нестандартный 2's complement
|
|||
---|---|---|---|
#18+
jenya7 С# ругается - Error CS0266 Cannot implicitly convert type 'uint' to 'int'. An explicit conversion exists (are you missing a cast?) причем adc_val |= (int)0xfffc0000; не помогает Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2020, 14:41 |
|
Нестандартный 2's complement
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky jenya7 С# ругается - Error CS0266 Cannot implicitly convert type 'uint' to 'int'. An explicit conversion exists (are you missing a cast?) причем adc_val |= (int)0xfffc0000; не помогает Код: sql 1.
спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2020, 14:43 |
|
Нестандартный 2's complement
|
|||
---|---|---|---|
#18+
jenya7, проверь точное-ли значение? В ЦУ и контроллерах есть как минимум 3 разные формы представления отрицательных чисел. И не факт что битовые операции которые тебе посоветовали дают правильное значение. С тебя - модульный тест который доказывает что все верно. Твою железяку все равно никто здесь не знает и соответствено советовать тебе шифт-вправо шифт-влево в таких условиях невозможно. Ты сам должен сказать какое значение expected. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2020, 14:50 |
|
Нестандартный 2's complement
|
|||
---|---|---|---|
#18+
mayton jenya7, проверь точное-ли значение? В ЦУ и контроллерах есть как минимум 3 разные формы представления отрицательных чисел. И не факт что битовые операции которые тебе посоветовали дают правильное значение. С тебя - модульный тест который доказывает что все верно. Твою железяку все равно никто здесь не знает и соответствено советовать тебе шифт-вправо шифт-влево в таких условиях невозможно. Ты сам должен сказать какое значение expected. ну так я дополню до 32 бит adc_val = (int)(adc_val | 0xfffc0000); должно работать по идее. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2020, 14:54 |
|
Нестандартный 2's complement
|
|||
---|---|---|---|
#18+
Не знаю. Почитай про дополнителный код https://ru.wikipedia.org/wiki/Дополнительный_код помимо этого кода еще есть прямой код и обратный. Мы не знаем какой из вариантов твоя железка юзает. и 99% твоих ответов - в докуменатции на железку. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2020, 15:09 |
|
Нестандартный 2's complement
|
|||
---|---|---|---|
#18+
[quot jenya7#22105115] mayton jenya7, проверь точное-ли значение? ну так я дополню до 32 бит adc_val = (int)(adc_val | 0xfffc0000); должно работать по идее. не работает :( ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2020, 15:24 |
|
Нестандартный 2's complement
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky jenya7, Зачем сдвиги? Для любого числа бит делается одинаково. Если надо получить абсолютное значение то просто делается XOR + 1. x = (x ^ 0x3FFFF) + 1 // 0x3FFFF это 18 младших единичных бит ну и обратно аналогично. а как обратно? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2020, 15:24 |
|
Нестандартный 2's complement
|
|||
---|---|---|---|
#18+
jenya7, я не гадалка, но если тебе надо только перейти от 18 бит к 32 битам, то проверки не нужны, будет достаточно val |= - (val & 0x00020000); ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2020, 15:31 |
|
Нестандартный 2's complement
|
|||
---|---|---|---|
#18+
[quot jenya7#22105138] jenya7 пропущено... не работает :( хотя...по моему нормально. доску забрали на доработку так я виртуально тестирую. похоже у меня косяк. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2020, 15:37 |
|
|
start [/forum/topic.php?fid=16&msg=39940577&tid=1339812]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
158ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 277ms |
0 / 0 |