Encoder with gray code to decimal

  • emcPT
  • emcPT's Avatar Topic Author
  • Offline
  • Platinum Member
  • Platinum Member
More
05 Apr 2016 15:54 - 05 Apr 2016 15:57 #72784 by emcPT
Encoder with gray code to decimal was created by emcPT
Hello,

I need to use a absolute gray code encoder with 10 bits. Looking for information on gray code and linuxcnc I found a component that is called gray2bin that converts a u32 to u32.

My first question is to understand if is needed to use a gray code to a "decimal like" value to be used as a u32, correct?
For example the gray code:

bit 9 1
bit 8 1
bit 7 1
bit 6 0
bit 5 1
bit 4 0
bit 3 1
bit 2 1
bit 1 1
bit 0 1

should be converted to the number 1110101111 to be the input of the gray converter?
If so, is the u32 type capable of holding such a big number?
EDIT: Yes it is:
u32 - a 32 bit unsigned integer, legal values are 0 to 4,294,967,295

Thank you
Last edit: 05 Apr 2016 15:57 by emcPT. Reason: Found answer to part of my question

Please Log in or Create an account to join the conversation.

  • andypugh
  • andypugh's Avatar
  • Away
  • Moderator
  • Moderator
More
05 Apr 2016 16:22 #72786 by andypugh
Replied by andypugh on topic Encoder with gray code to decimal
Yes, gray2bin works with up to 32 bits.

Please Log in or Create an account to join the conversation.

More
06 Apr 2016 11:26 #72839 by jtc
Replied by jtc on topic Encoder with gray code to decimal
Based on gray2bin source code we are trying to implement this conversion on our custom hal component, but without sucess...

the relevant part of code is this:
int gray_to_decimal(bool bit0, bool bit1, bool bit2, bool bit3, bool bit4, bool bit5, bool bit6, bool bit7, bool bit8, bool bit9)
{
	unsigned int in = 0;
	unsigned int out = 0;
	unsigned int mask;
	unsigned int binary;
	
	in = bit0 + bit1*10 + bit2*100 + bit3*1000 + bit4*10000 + bit5*100000 + bit6*1000000 + bit7*10000000 + bit8*100000000 + bit9*1000000000;
	
	binary = in;
	for(mask = in >> 1 ; mask != 0 ; mask = mask >> 1)
	{
		binary ^= mask;
	}
	
	return binary;
}

with the following bits:



the result is:
15670030.0


that is clearly wrong as a binary number is expected. The correct result should be: 11111100

What I am doing wrong?
Attachments:

Please Log in or Create an account to join the conversation.

  • andypugh
  • andypugh's Avatar
  • Away
  • Moderator
  • Moderator
More
06 Apr 2016 11:41 - 06 Apr 2016 13:41 #72840 by andypugh
Replied by andypugh on topic Encoder with gray code to decimal

	in = bit0 + bit1*10 + bit2*100 + bit3*1000 + bit4*10000 + bit5*100000 + bit6*1000000 + bit7*10000000 + bit8*100000000 + bit9*1000000000;


This is wrong.

You want to multiply by binary constants. This _might_ work or will give a compiler error
in = bit0 + bit1*0b10 + bit2*0b100 + bit3*0b1000 + bit4*0b10000 + bit5*0b100000 + bit6*0b1000000 + bit7*0b10000000 + bit8*0b100000000 + bit9*0b1000000000;

However, what I would do is the fractionally more efficient:
in = bit0 + bit1<<1 + bit2<<2 + bit3<<3 + bit4<<4 + bit5<<5 + bit6<<6+ bit7<<7 + bit8<<8 + bit9<<9;
Last edit: 06 Apr 2016 13:41 by andypugh.
The following user(s) said Thank You: jtc

Please Log in or Create an account to join the conversation.

More
06 Apr 2016 13:08 #72847 by jtc
Replied by jtc on topic Encoder with gray code to decimal
Thank you! with the last solution it works :)

Please Log in or Create an account to join the conversation.

Time to create page: 0.072 seconds
Powered by Kunena Forum