# Adding Hex numbers from 00 to FF in Arduino C++

#### john2k

Joined Nov 14, 2019
84
I'm new to Arduino C++ programming. Inside my voice loop function I want to add to the previous hex number value. So for it starts with 00 and adds 1 each time in the loop the sequencing all the way through to FF and then back to 00 and all over again and again. Can anyone kindly tell me how this can be done? Thanks.

#### ericgibbs

Joined Jan 29, 2010
9,538
hi john,
Any reason you are counting in Hex and not Decimal.?
E

#### john2k

Joined Nov 14, 2019
84
hi john,
Any reason you are counting in Hex and not Decimal.?
E
Because I need to put a sequential hex counter into a canbus message which is transmitted in the loop message. So basically a can bus message is transmitted in each loop but each time it needs a hex counter. If I count in decimals then i would have to convert it to hex to put it into the can bus transmit message

#### Ian Rogers

Joined Dec 12, 2012
702
200 or 11001000 or 0xC8 are exactly the same... They are representing integer , whole numbers

Are you talking about BCD binary coded decimals?? This is a different counting system all together..

#### WBahn

Joined Mar 31, 2012
25,230
I'm new to Arduino C++ programming. Inside my voice loop function I want to add to the previous hex number value. So for it starts with 00 and adds 1 each time in the loop the sequencing all the way through to FF and then back to 00 and all over again and again. Can anyone kindly tell me how this can be done? Thanks.
How are these numbers being represented? In an int variable? In a string? As a BCD variable?

How are they being represented in the CANBUS packets?

#### john2k

Joined Nov 14, 2019
84
How are these numbers being represented? In an int variable? In a string? As a BCD variable?

How are they being represented in the CANBUS packets?
All I know is that there are 8 data bytes in the message being sent. I am able to then put a value anything from 00 to FF in these bytes. But I am only interested in putting the counter in byte 5 for example. I can hard-code anything from 00 to FF as long as it's 2 characters long it accepts it. It's just that I need the values to be sequential. I can get a interger to count from 1 upwards but I need it to be a 2 character hex

#### MrChips

Joined Oct 2, 2009
20,215
For sequential numbers, take a number and add 1 to it.

num = num + 1

To wrap around after 255, use byte data type.

#### john2k

Joined Nov 14, 2019
84
So I got it working using the following code. However, it doesn't seem to stop at 255 after FF the counter seems to keep trying to go over 255

byte counter = 1;

void loop() {
print(counter, HEX);
counter = counter + 1;
}

#### dl324

Joined Mar 30, 2015
10,002
However, it doesn't seem to stop at 255 after FF the counter seems to keep trying to go over 255
You don't have any code to prevent wraparound.

BTW, you can simplify the increment to "counter++". That's easier to read and helps avoid problems with typing mistakes.

#### ericgibbs

Joined Jan 29, 2010
9,538
hi john,
Your program clip works for me.
E

#### Attachments

• 5.9 KB Views: 12
• 636 bytes Views: 13
Last edited:

#### john2k

Joined Nov 14, 2019
84
BTW, you can simplify the increment to "counter++". That's easier to read and helps avoid problems with typing mistakes.
I've put counter++ instead of counter = thanks

hi john,
Your program clip works for me.
E
I've figured out why mine wasn't working, I have to put println instead of print. What is the difference between the two prints and when it returns to 0 to 9, is there any way to have it be 00, 01, 02 etc so that it's always two characters long?

#### ericgibbs

Joined Jan 29, 2010
9,538
hi John,
Now you have the correct values, how are they used and sent to the OSWD.?
E

#### dl324

Joined Mar 30, 2015
10,002
is there any way to have it be 00, 01, 02 etc so that it's always two characters long?
Use a formatted print statement (printf). Be aware that printf is a costly command for Arduino's and that it doesn't support floating point numbers (silently, so you need to read the documents).

#### john2k

Joined Nov 14, 2019
84
how are they used and sent to the OSWD.?
OSWD? sorry still very new to all the Haven't figured next step out yet but going to play around with it

Be aware that printf is a costly command for Arduino's
Talking of costly commands for Arduinos, is there a list of commands that are very intensive that should ideally be avoided? Also once I compile my code, is there a way to check if it's not too intensive and going to stress out the arduino?

#### dl324

Joined Mar 30, 2015
10,002
Also once I compile my code, is there a way to check if it's not too intensive and going to stress out the arduino?
The IDE will tell you how much FLASH and RAM you're using.

Talking of costly commands for Arduinos, is there a list of commands that are very intensive that should ideally be avoided?
printf is the only command I noticed being costly.

Memory is also limited, so you want to use the smallest primitives you can for variables. I've seen many examples where byte or integer arrays were used to hold data that could be packed to use less space. One example I saw was an array used as a look up table for a seven segment decoder. Some used an array of ints, some used an array of chars; I chose to pack the data into chars, so I only needed 16 bytes vs 112 bytes if I had use a byte for each bit.

This is for a binary to hexadecimal decoder.
Code:
unsigned char ary[16] = {
0x7E, 0x30, 0x6D, 0x79,
0x33, 0x5B, 0x5F, 0x70,
0x7F, 0x7B, 0x77, 0x1F,
0x4E, 0x3D, 0x4F, 0x47
};
Another optimization is to use #defines instead of variables for "variables" that don't change:
Code:
#define WARMPIN 14
#define COOKPIN 13
#define COOKLED 13
#define LDIG 12
#define RDIG 11
#define TIMEPIN 5
For portability, you'd use digitalWrite() to write to the I/O's, but it's faster if you use the PORTs directly:
Code:
// PORTD 0-7, PORTB 8-13, PORTC analog
#define WRITEB(dig)     \
PORTB &= ~0x07;       \
PORTB |= (dig) & 0x07;

#define WRITED(dig)     \
PORTD &= ~0xF0;       \
PORTD |= (dig) & 0xF0;

void show(int num) {
WRITEB(ary[num]>>4)
WRITED(ary[num]<<4)
}
I had to spread my connections to the seven segment display across two ports because I wanted to use serial I/O and that takes 2 bits from the only 8 bit PORT on Uno.

Last edited:

#### dl324

Joined Mar 30, 2015
10,002
Talking of costly commands for Arduinos, is there a list of commands that are very intensive that should ideally be avoided?
I don't think printf() is supported in the IDE because I always used Serial.println(). It's sprintf() that's expensive.

#### MrChips

Joined Oct 2, 2009
20,215
Any library printf() function is costly.

#### ericgibbs

Joined Jan 29, 2010
9,538
hi john,
OSWD is Outside World, basically I am asking how is the HEX value going to be used ie: within the confines of the program or to some external device.?
If externally, how is the HEX going to be communicated to the external device, ie: 8 Bit parallel, Bit Serial , etc.

E

#### Pedant Engineer

Joined May 27, 2018
156
All I know is that there are 8 data bytes in the message being sent. I am able to then put a value anything from 00 to FF in these bytes. But I am only interested in putting the counter in byte 5 for example. I can hard-code anything from 00 to FF as long as it's 2 characters long it accepts it. It's just that I need the values to be sequential. I can get a interger to count from 1 upwards but I need it to be a 2 character hex
There is a persistent misunderstanding here about number representation. If you have a single byte variable then that variable can only hold a value between 0x00 and 0xFF (restricting the conversation to positive numbers only). If the number is represented in hexadecimal it will look like 0x0 to 0xFF but have exactly the same value if represented in decimal (0 to 255), octal (0 to 377) or binary (0 to 1111,1111) even though those radix mean it will look different if, for example you printed the number out. The 1's and 0's pattern in the memory of the uC will be exactly the same in every case. And in hex, the representation is two characters but the number is not two 'characters'. In the same way, if it were decimal it would not be 3 characters. It is an 8 bit number and is stored and used as an 8 bit value.
The statement (0xFF = 255) is always true as they are the same value and both are simply 8 bits each.
The 8 bit 'container' is defined when you declare the variable as a 'byte'. And if you continue the count past 0xFF it will simply wrap around (the overflow is discarded) as 0b1111,1111 increments to 0b0001, 0000,0000 but as the thing is a 'byte' that extra nibble with the value 0b0001 does not exist so it is registered as an 'overflow' in the uP status register (probably) which is ignored anyway so you are left with just your original byte holding the value 0b0000,0000 which in hex would be 0x00 which is exactly what you want.
Try not thinking about the numbers as a value range but rather as the container size, be it a byte, a word (2 bytes) etc. Don't even contemplate signed numbers until you have this sorted out in your head. I fear a brain explosion for you otherwise ;-)