CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

Convert 2 8-bits data to 16-bit data [Solved]

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
emaxxenon



Joined: 21 Jan 2020
Posts: 42

View user's profile Send private message

Convert 2 8-bits data to 16-bit data [Solved]
PostPosted: Tue Jan 28, 2020 5:04 am     Reply with quote

Hello,

I have 2 8-bits data.
I have to combine these two and make 16 bits.

Data sent to me:

Sensor1 = A1 + A2*2 + A3*4 + A4*8 + A5*16 + A6*32 + A7*64 + A8*128
Sensor2 = B1 + B2*2 + B3*4 + B4*8 + B5*16 + B6*32 + B7*64 + B8*128

(A=1 or 0)
(B=1 or 0)

The data i see:
Sensor1 max value = 255
Sensor2 max value = 255

I'm trying to make 16 bits.

( AAAAAAAA BBBBBBBB ) = max value 65535

I need to combine the data.

is there any auxiliary code to do this?

Thank you.


EDIT:

SENSOR =make16(Sensor2, Sensor1);

I solved my problem. I couldn't find this code. sorry.
temtronic



Joined: 01 Jul 2010
Posts: 9100
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Tue Jan 28, 2020 5:39 am     Reply with quote

Try this CCS function...
Code:

//CCS example  from the manual
long x;
int hi,lo;

x = make16(hi,lo);

// this should work for you
unsigned int16 combined;
unsigned int8 Sensor1, Sensor2;

result=(Sensor1,Sensor2); // make 16bit from 2 8 bit values

If you're using MPLAB, pressing F11, opens the CCS manual while your project is open.

Jay
temtronic



Joined: 01 Jul 2010
Posts: 9100
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Tue Jan 28, 2020 8:26 am     Reply with quote

This
Quote:
SENSOR =make16(Sensor2, Sensor1);


Gives you BBBBBBBBAAAAAAAA

It needs to ne
Code:
SENSOR =make16(Sensor1, Sensor2);


To give you AAAAAAAABBBBBBBB

which is what you originally posted.
Quote:
I'm trying to make 16 bits.

( AAAAAAAA BBBBBBBB ) = max value 65535



Jay
emaxxenon



Joined: 21 Jan 2020
Posts: 42

View user's profile Send private message

PostPosted: Tue Jan 28, 2020 8:41 am     Reply with quote

Thank you.

Another question;

Slave:
Code:
if(state >= 0x80)
{
i2c_write(A);
i2c_wrie(B);
}


Master:
Code:
i2c_start();
i2c_write(slave);
A=i2c_read(0);
B=i2c_read(0);


Answer: S 13 A 04 N FF N p
But must be: 04 and 08 (FF false)

Can I send one after another?
No problem if i do it separately.



Master:
Code:

i2c_start();
i2c_write(slave);
i2c_write(1);
i2c_stop();

i2c_start();
i2c_write(slave);
A=i2c_read(0);
i2c_stop();

i2c_start();
i2c_write(slave);
i2c_write(2);
i2c_stop();

i2c_start();
i2c_write(slave);
B=i2c_read(0);
i2c_stop();


Slave:
Code:

if(state >= 0x80)
{
if(master==1)
i2c_write(A);

if(master==2)
i2c_wrie(B);
}


it works like this.
Can't I send it together?
Ttelmah



Joined: 11 Mar 2010
Posts: 19217

View user's profile Send private message

PostPosted: Tue Jan 28, 2020 8:58 am     Reply with quote

emaxxenon wrote:
A=i2c_read(0);
B=i2c_read(0);

Only the _last_ transaction want 0.

The 0 is actually a flag to say to the master 'this is the end of the
transaction'. Is needed on the last byte transfered but not before.
emaxxenon



Joined: 21 Jan 2020
Posts: 42

View user's profile Send private message

PostPosted: Tue Jan 28, 2020 11:35 pm     Reply with quote

Ttelmah wrote:
emaxxenon wrote:
A=i2c_read(0);
B=i2c_read(0);

Only the _last_ transaction want 0.

The 0 is actually a flag to say to the master 'this is the end of the
transaction'. Is needed on the last byte transferred but not before.


Master:
Code:
i2c_start();
i2c_write(slave);
A=i2c_read();
B=i2c_read(0);


Slave:
Code:
if(state >= 0x80)
{
i2c_write(A);
i2c_write(B);
}


is it true this way?

or is the structure below more accurate?

Slave:
Code:
if(state >= 0x80)
{
if(state==0x80)
i2c_write(A);
if(state==0x81)
i2c_write(B);
}
allenhuffman



Joined: 17 Jun 2019
Posts: 537
Location: Des Moines, Iowa, USA

View user's profile Send private message Visit poster's website

PostPosted: Wed Jan 29, 2020 1:40 pm     Reply with quote

The CCS compiler has some neat things that generate some nice assembly. I was curious about the difference of doing this in C versus using the CCS statement. Nice results. It's less than half the lines to use the make16() call.

Code:
....................    value = (a << 8) | b;
0041A:  MOV.B   CA0,W0L
0041C:  MOV.B   W0L,B
0041E:  CLR.B   W5
00420:  MOV.B   CA1,W0L
00422:  CLR.B   1
00424:  MOV.B   W0L,CA2
00426:  CLR.B   CA3
00428:  MOV     W5,W0
0042A:  IOR     CA2
....................   

....................    value = a * 256 + b;
0042C:  MOV.B   CA0,W0L
0042E:  CLR.B   1
00430:  MOV.B   W0L,W0L
00432:  MOV.B   W0L,B
00434:  CLR.B   W5
00436:  MOV     CA0,W4
00438:  LSR     W4,#8,W4
0043A:  ADD     W5,W4,W0
0043C:  MOV     W0,CA2
....................   

....................    value = make16 (a, b);
0043E:  MOV.B   CA1,W0L
00440:  MOV.B   W0L,CA2
00442:  MOV.B   CA0,W0L
00444:  MOV.B   W0L,CA3


Nicely done, CCS.
_________________
Allen C. Huffman, Sub-Etha Software (est. 1990) http://www.subethasoftware.com
Embedded C, Arduino, MSP430, ESP8266/32, BASIC Stamp and PIC24 programmer.
http://www.whywouldyouwanttodothat.com ?
temtronic



Joined: 01 Jul 2010
Posts: 9100
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Wed Jan 29, 2020 1:55 pm     Reply with quote

Yes, saves a lot of space AND x2 or more faster !
allenhuffman



Joined: 17 Jun 2019
Posts: 537
Location: Des Moines, Iowa, USA

View user's profile Send private message Visit poster's website

PostPosted: Wed Jan 29, 2020 1:57 pm     Reply with quote

temtronic wrote:
Yes, saves a lot of space AND x2 or more faster !


It makes me wonder what other goodies are in there that I should be using.

A coworker suggested using a union, so I added a third test case that seems to be the best way to do it in generic C. Something like...

Code:
....................    union
....................    {
....................       struct {
....................          unsigned int8 a;
....................          unsigned int8 b;
....................       } Bytes;
....................       unsigned int16 value;
....................    } value2;
....................   
....................    value2.Bytes.a = a;
0043E:  MOV.B   CA0,W0L
00440:  MOV.B   W0L,CA4
....................    value2.Bytes.b = b;
00442:  MOV.B   CA1,W0L
00444:  MOV.B   W0L,CA5


...but hopefully with better structure/union/variable names ;-)
_________________
Allen C. Huffman, Sub-Etha Software (est. 1990) http://www.subethasoftware.com
Embedded C, Arduino, MSP430, ESP8266/32, BASIC Stamp and PIC24 programmer.
http://www.whywouldyouwanttodothat.com ?
Ttelmah



Joined: 11 Mar 2010
Posts: 19217

View user's profile Send private message

PostPosted: Wed Jan 29, 2020 2:31 pm     Reply with quote

Yes, I like unions for things like this. Have campaigned to encourage
people to use these in the past. It is 'generic C', and gives efficient code.
And (of course) the same union can be used 'both ways' both to combine
and to split data. Smile
You can be even more ingenious with these. For example, if you are passing
a float to a function that then internally wants to use the bytes or words
from this, you can declare the function with the union, directly pass the
float, and in the function directly access the bytes, without having to use
any intermediate variable. The compiler is smart enough to realise that
the union can accept the float, and doesn't complain.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group