Страница 1 из 1

преобразование комплементарного кода в беззнаковый

Добавлено: Вт июл 26, 2016 17:20:02
мысык-кот
Уважаемые, доброго времени суток. Помогите мне пожалуйста понять: как привести знаковый комплементарный код к беззнаковому
выдержка из даташита на AD7865
"The designed code transitions take place midway between successive
integer LSB values (i.e., 1/2 LSB, 3/2 LSBs, 5/2 LSBs
etc.) LSB size is given by the formula, 1 LSB = FSR/16384. For
the ±5 V range, 1 LSB = 10 V/16384 = 610.4 μV."
кусок кода считывание АЦП:

Код: Выделить всё

int16_t adc_data_read(void)
  {   
    AD7865_CONTROL_PORT &= ~(_BV(AD7865_CS)|_BV(AD7865_RD));//
    _delay_us(3);
    int16_t adc1=(int16_t)((AD7865_OUTL_PIN))| (AD7865_OUTH_PIN<<8);
    adc1 >>= 2;
    AD7865_CONTROL_PORT|=_BV(AD7865_CS)|_BV(AD7865_RD);//
    return adc1;
  }
и код попытки преобразования

Код: Выделить всё

 cli();
            int16_t temp = adc_data_read();//
            uint16_t x = (uint16_t)((uint32_t)temp+0x2000);
             adc_res=x;
             sei();

Re: преобразование комплементарного кода в беззнаковый

Добавлено: Вт июл 26, 2016 19:08:00
Z_h_e
Вы имеете ввиду получить абсолютное значение?

Код: Выделить всё

if (i<0)i*=-1;

Re: преобразование комплементарного кода в беззнаковый

Добавлено: Ср июл 27, 2016 14:52:51
мысык-кот
да хотелось бы разобраться как получить uint16_t . Сейчас у меня значение с АЦП насколько я понимаю идет в дополнительном коде. С нулем на середине шкалы и убывающий к краям этой шкалы. Я не могу понять как мне получить линейно возрастающее значение от -IN до +IN .

Re: преобразование комплементарного кода в беззнаковый

Добавлено: Ср июл 27, 2016 15:17:50
Z_h_e

Код: Выделить всё

uint16_t adc_res = (uint16_t) (adc_data_read()+0x2000);