How to convert a 24 bit, two’s complement value into a signed integer?
Mostrar comentarios más antiguos
I want to read an AD converter using the Raspberry Pi SPI interface controlled by Matlab. The AD converter outputs 24 bit data in the two's complement format, MSD first. The Matlab writeRead command returns the data as a row vector of data type char
How can I quickly translate the data into an integer of data type int32 ?
8 comentarios
Balamurugan S
el 19 de Abr. de 2018
How to I convert a 64 bit, two's complement value(binary vector)[ 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1] into a signed integer?
Walter Roberson
el 19 de Abr. de 2018
>> typecast(uint8(bin2dec(char(reshape(A,8,[]).' + '0'))),'int64')
ans =
int64
-65
Balamurugan S
el 19 de Abr. de 2018
But I am expecting -3 as a Answer
Balamurugan S
el 19 de Abr. de 2018
P=[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1] if we are taking 2's complement for this binary vector, we have to get -3 as answer.
Walter Roberson
el 19 de Abr. de 2018
swapbytes(typecast(uint8(bin2dec(char(reshape(P,8,[]).' + '0'))),'int64'))
Balamurugan S
el 19 de Abr. de 2018
Dear Walter Roberson, Thank you for your reply. I am expecting -3 as answer, it is working fine for me if p=16 bit two's complement number ( using w=typecast(uint16(bi2de(w)),'int16')) but when p=64 bit two's complement number, it is not giving correct answer as -3. And the function "swapbytes(typecast(uint8(bin2dec(char(reshape(P,8,[]).' + '0'))),'int64'))" not giving correct answer.
Walter Roberson
el 19 de Abr. de 2018
>> P=[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1]
P =
Columns 1 through 23
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Columns 24 through 46
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Columns 47 through 64
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1
>> swapbytes(typecast(uint8(bin2dec(char(reshape(P,8,[]).' + '0'))),'int64'))
ans =
int64
-3
Looks like -3 to me.
Balamurugan S
el 19 de Abr. de 2018
Thank you very much for your timely help Walter Roberson.
Respuesta aceptada
Más respuestas (1)
Murat Belge
el 10 de Jun. de 2014
There is an example MATLAB class in Raspberry Pi support package that does something similar for MCP300x ADC's. Here is the readVoltage() method for this class:
function voltage = readVoltage(obj, adcChannel)
validateattributes(adcChannel, {'numeric'}, ...
{'scalar', '>=', 0, '<=', obj.NumAdcChannels-1}, '', 'adcChannel');
adc = obj.getAdcChannelSelect(adcChannel);
data = uint16(obj.spiObj.writeRead([1, adc, 0]));
highbits = bitand(data(2), obj.Lsb2);
voltage = double(bitor(bitshift(highbits, 8), data(3)));
voltage = (obj.VoltageReference/1024) * voltage;
end
where obj.Lsb2 is defined as bin2dec('00000011'). The value read from ADC is 10-bits stashed into two 8-bit values. The upper two-bits is in byte 2 and the 8 least significant bits are in byte 3.
You can take a look at the entire class definition here:
<Support package installe dir>\raspi\+raspi\+internal\mcp300x.m
1 comentario
Michael Simson
el 10 de Jun. de 2014
Editada: Michael Simson
el 10 de Jun. de 2014
Categorías
Más información sobre Data Type Conversion en Centro de ayuda y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!