Posts Tagged ‘bit’

Blinking Binary Bits and Bytes…

June 9, 2009

Looking At The Numbers.

Learning to make an LED flash is a great way to begin programming your Arduino, so take what you’ve learned with the LEDBlink program and add more LEDs. How many should we add, 3, 4, 7, 15 or more? Is there a special number of LEDs to choose? The Arduino Duemilanove has a total of 14 Digital pins and 6 Analog pins that we could use for a maximum of 20 individually controlled pins.

Lets take a look at how computers understand numbers, incidentally microcontrollers like those used by your Arduino understand numbers the same way. Arduino uses the Atmel Corporation’s 8-Bit family of microcontroller devices. Atmel manufactures a series of 8 or 16 bit devices. Most modern personal computers use either 32 or 64 bit hardware. This is beginning to suggest that a multiple of eight is important.

Maybe you’ve heard someone say that computers work with binary numbers which are a bunch of ones and zeros. Individually the “1” or “0” values are stored in binary digits that are called bits. The word bits is actually a contraction of the two words “binary” and “digits“. Our computers and microcontrollers both work with these ones and zeros in multiples of eight. Collectively these eight binary digits are known as a byte, so there are generally 8 bits per byte.

Bytes Are Important.

A Byte represents the smallest segment of memory containing data that an Arduino will read or write. A byte of data can save a positive whole number with a value ranging from 0 to 255. Lets create a program to show how a computer can count using binary numbers. Each LED will represent a single byte in an 8-Bit number.

Wiring the Breadboard

The breadboard gets wired up like the example from the “Learning the C Language with Arduino” article. This example adds more LEDs for a total of eight. The LEDs are attached to Digital pins 3 through 10. A total of eight LEDs and eight resistors are needed for this project.

Why are we starting with Digital Pin3? First, we are using the digital pins because they work like switches, either turning on (HIGH) or off (LOW). There is no significance to starting with pin 3 when any of the other digital pins would work just as well. Pins 0 and 1 carry a dual role. They act like other digital pins but also may handle serial communication’s TX and RX (transmit and receive) features.

Breadboard Layout 8 LEDs

Breadboard Layout 8 LEDs

Create a new program named:binaryCount

Type in the following code, typing the comments (shown in green) are optional. You could copy and paste into the program editor but typing your own code helps you learn the programming language too.

/*— Binary Counting with 8 bits —*/
//Associate LEDs with an Arduino Digital pin.

int led0Pin = 3;
int led1Pin = 4;
int led2Pin = 5;
int led3Pin = 6;
int led4Pin = 7;
int led5Pin = 8;
int led6Pin = 9;
int led7Pin = 10;

void setup()
{
//Set up each of the pins for output only.
pinMode(led0Pin, OUTPUT);
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
pinMode(led3Pin, OUTPUT);
pinMode(led4Pin, OUTPUT);
pinMode(led5Pin, OUTPUT);
pinMode(led6Pin, OUTPUT);
pinMode(led7Pin, OUTPUT);
}

void loop()
{
byte iVal; //we’ll define this variable for use in the program.
//A byte is an 8 bit variable.
// begin counting up from 0 to 255

for(iVal=0; iVal<255; iVal++) // loop through each of the values { // Light up LED if its corresponding byte is equal to binary va1ue. digitalWrite(led0Pin, (iVal & B1)); // -------X Decimal value 1 digitalWrite(led1Pin, (iVal & B10)); // ------X- Decimal value 2 digitalWrite(led2Pin, (iVal & B100)); // -----X-- Decimal value 4 digitalWrite(led3Pin, (iVal & B1000)); // ----X--- Decimal value 8 digitalWrite(led4Pin, (iVal & B10000)); // ---X---- Decimal value 16 digitalWrite(led5Pin, (iVal & B100000)); // --X----- Decimal value 32 digitalWrite(led6Pin, (iVal & B1000000)); // -X------ Decimal value 64 digitalWrite(led7Pin, (iVal & B10000000)); // X------- Decimal value 128 delay(1000); } digitalWrite(led0Pin, (iVal & B1)); delay(2000); } [/sourcecode]

Source Code Analysis

Line 4

Why is the first variable, led0Pin named with 0 instead of 1?

The short answer is the C Language starts counting beginning with the number 0. In the led0Pin through led7Pin variables the numeric character is irrelevant except to differentiate between the names. A later article will describe using variable arrays where this becomes important. This way of naming variables was done for some consistency with future examples.

Line 32

The ” for” statement is part of the C language’s control structures.

for(iVal=0; iVal<255; iVal++) // loop through each of the values

There are three parts to the for control loop:

  • Initialization – “iVal=0;” This assigns the value of 0 to the iVal variable. You need to end this portion with a semicolon.
  • Condition – “iVal<255;” This checks if the variable iVal is less than 255. While this condition is true the loop continues again. You need to end this portion with a semicolon.
  • Increment – “iVal++”  After processing the statements within the for loop the variable iVal is incremented by one. This portion does not use a semicolon.

In the iVal++ increment portion the plus plus characters “++“, this is the same as assigning iVal = iVal + 1 or adding one to the iVal variable each time the for loop finished.

Since the for() statement is part of the control structure you don’t put a semicolon at the end of this statement.

Lines 34 through 41

digitalWrite(led0Pin, (iVal &        B1)); // ——-X Decimal value 1

LED Bit Values

LED Bit Values

Bit values

As described above, we are using LEDs to represent each of the eight bits in a one byte value. Each bit signifies a value for that column. If all of the LEDs are off then the number it represents is zero (0). If only the right-most LED in the column labeled “1” is lit up then the byte of data is equal to the number 1. If the left-most column labeled “128” is the only one lit up then the byte of data is equal to the number 128. If all LEDs are lit up then the byte of data is equal to the number 255.

128 + 64 + 32 + 16 + 8 + 4 + 2 + `1 = 255

Any combinations of the eight LEDs that are turned ON or OFF represent a number from 0 to 255. Similarly, we can create a binary representation of the number by using a Bit Formatter. This is a value using the upper case letter B with a combination of only ones (1) and zeros (0) as shown below.

  • – – – – – – – X Decimal value 1  Bit Format:    B1
  • – – – – – – X – Decimal value 2  Bit Format:    B10
  • – – – – – X – – Decimal value 4  Bit Format:    B100
  • – – – – X – – – Decimal value 8  Bit Format:    B1000
  • – – – X – – – – Decimal value 16  Bit Format:  B10000
  • – – X – – – – – Decimal value 32  Bit Format:   B100000
  • -X – – – – – –  Decimal value 64  Bit Format:    B1000000
  • X – – – – – – – Decimal value 128  Bit Format: B10000000

The Bitwise AND “&” Operator

(iVal & B1)

If we have a the variable iVal which contains a value ranging from 0 to 255, how can we use that value to turn the pattern of LEDs on or off that the number represents? Because we’re only checking the iVal value against a single bit each time, the statement (iVal & B1) returns a TRUE (1) or FALSE (0) answer. The ampersand is a bitwise AND operator. In the example if the right most bit in the variable iVal is 1 AND the right most bit as specified by B1 are both 1, then the bitwise AND is 1 if they both aren’t set to 1 then the bitwise AND is evaluated as 0.

(c) 2009 – Vince Thompson