loading

Step 8: IO port expansion, more multiplexing

We gathered from the last step that an 8x8x8 LED cube requires 64+8 IO lines to operate. No AVR micro controller with a DIP package (the kind of through hole chip you can easily solder or use in a breadboard, Dual Inline Package) have that many IO lines available.

To get get the required 64 output lines needed for the LED anodes, we will create a simple multiplexer circuit. This circuit will multiplex 11 IO lines into 64 output lines.

The multiplexer is built by using a component called a latch or a flip-flop. We will call them latches from here on.

This multiplexer uses an 8 bit latch IC called 74HC574. This chip has the following pins:

  • 8 inputs (D0-7)
  • 8 outputs (Q0-7)
  • 1 "latch" pin (CP)
  • 1 output enable pin (OE)

The job of the latch is to serve as a kind of simple memory. The latch can hold 8 bits of information, and these 8 bits are represented on the output pins. Consider a latch with an LED connected to output Q0. To turn this LED on, apply V+ (1) to input D0, then pull the CP pin low (GND), then high (V+).

When the CP pin changes from low to high, the state of the input D0 is "latched" onto the output Q0, and this output stays in that state regardless of future changes in the status of input D0, until new data is loaded by pulling the CP pin low and high again.
To make a latch array that can remember the on/off state of 64 LEDs we need 8 of these latches. The inputs D0-7 of all the latches are connected together in an 8 bit bus.

To load the on/off states of all the 64 LEDs we simply do this: Load the data of the first latch onto the bus. pull the CP pin of the first latch low then high. Load the data of the second latch onto the bus. pull the CP pin of the second latch low then high. Load the data of the third latch onto the bus. pull the CP pin of the third latch low then high. Rinse and repeat.

The only problem with this setup is that we need 8 IO lines to control the CP line for each latch. The solution is to use a 74HC138. This IC has 3 input lines and 8 outputs. The input lines are used to control which of the 8 output lines that will be pulled low at any time. The rest will be high. Each out the outputs on the 74HC138 is connected to the CP pin on one of the latches.

The following pseudo-code will load the contents of a buffer array onto the latch array:

// PORT A = data bus
// PORT B = address bus (74HC138)
// char buffer[8] holds 64 bits of data for the latch array

PORTB = 0x00; // This pulls CP on latch 1 low.
for (i=0; i < 8; i++)
{

PORTA = buffer[i];
PORTB = i+1;

}

The outputs of the 74HC138 are active LOW. That means that the output that is active is pulled LOW. The latch pin (CP) on the latch is a rising edge trigger, meaning that the data is latched when it changes from LOW to HIGH. To trigger the right latch, the 74HC138 needs to stay one step ahead of the counter i. If it had been an active HIGH chip, we could write PORTB = i; You are probably thinking, what happens when the counter reaches 7, that would mean that the output on PORTB is 8 (1000 binary)on the last iteration of the for() loop. Only the first 8 bits of PORT B are connected to the 74HC138. So when port B outputs 8 or 1000 in binary, the 74HC138 reads 000 in binary, thus completing its cycle. (it started at 0). The 74HC138 now outputs the following sequence: 1 2 3 4 5 6 7 0, thus giving a change from LOW to HIGH for the current latch according to counter i.

<p>Made it!!</p><p>Thank you for the great instruction!!</p>
<p>Nice job. Many never get their hand wired boards working! Nice and tidy job too.</p>
<p>Do you have a list of components that that board required?</p>
<p>Wow, how do you get your trace wires so straight and the perfect length?</p>
<p>I measured 1, and cut them all to the same length at once...</p><p>And alcohol-free-february also did the trick ;-)</p>
<p>What's the purpose of the address bus?</p><p>And can all of the cube or generally any number of IO's can be runned with only 3 pins by making layers of shift registers?</p>
<p>Is it possible to just switch out these same color LED's for some RGB LED's without changing anything else, apart from the code?</p>
<p>I understand that RGB LEDs have 4 pins, and this may be change the layout of how cube is soldered. How much harder am I making this project by deciding to use RGB LEDs. This is my first LED cube so I don't want to get in over my head.</p>
<p>hi</p><p>i need a help for connecting program (3d8s alpha ) to arduino uno </p>
<p>If we want to replace all transistors, for cathode riser, like Đ&ocirc;ng Phạm post, we can use ULN2803. If we are anode riser, TD62783 is the replacement for ULN2803.</p>
<p>Great Tutorial. Thanks</p>
<p>hi<br>thanks for this nce tut. </p><p>can any one tell me if i can use SN74LS574,HD74LS138P instead of 74HC574,74HC138 and im using arduino uno <br>thanks alot<br></p>
<p>hello all of you, I have an idea to replace 16 BJT by ULN2803, it would save up for your area, and it works very tot.Toi did 2 cube leds and it all works fine however, I did not design the RS232 connection on my circuit. and here are some pictures about it:</p>
<p>Hi DongP1, I am so like the Cube and I want to make it and give to my girl friend as a big surprise. Can you send all schematics ,programs and other files to me . Thans so much.</p><p>My e-mail address: dongliang.ma@matrixopto.com </p>
https://drive.google.com/file/d/0BzXbfPpoHKV5eWQxU1VQODZhTTA/view?usp=sharing
<p>Hey guy, if i use STK500 device to set up for atmega32 then plug it to the board , so, can i remove RS232 and AVR Isp?</p>
<p>sir, i have successfully made my cube, now the problem is with the code... im using arduino uno and the code given in this article i.e for arduino user is working fine for me... but other codes which are used for AVR is not compatible with aduino ? does coding for both arduino uno and AVR are different ?</p><p>i got a error as &quot;compilation terminated </p><p> exist status 1</p><p> error compiling &quot;</p><p>if there is solution for this plz post . </p><p>and the code in the link which u gave is compatible with arduino uno ? </p><p> Thanks :)</p>
<p>You likely need an older, or possibly a newer copy of the IDE.</p>
<p>sir presently im using latest version of IDE i.e 1.6.7</p><p>can i know the the exact version of IDE ??</p><p>and sir how can i make others codes compatible with IDE?</p><p>Thanks :)</p>
mail me.. 233himanshu@gmail.com
This is here. https://drive.google.com/file/d/0BzXbfPpoHKV5eWQxU1VQODZhTTA/view?usp=sharing and don't need chager in program .
<p>Hi Phamd4 , thank you so much. I have another question, I can not open the CUBE schematic and pcb files with Protues Desing Suite 8.0 , my computer is Win 7 system. whether the version of the Protues is not matching? Can you help me .</p>
<p>You can use even less space using SMT 2N2222 type transistors. My board will take either.</p>
Can you please kindly send me the circuit and diagram.
<p>The circuit diagrams for this project are in this instructable.</p>
My email address is sisirroy777@gmail.com
<p>Hello DongP1, <br>Can you share a more clear schematic how did you used the ULN2803 and explain what changes have you done to the code ?</p><p>Thanks</p>
You don't need changes in code
<p>OK you, I'm very fun when help you. You can use Proteus to open file schematic and PCB, and i did fixed code. all in here:<br>https://drive.google.com/file/d/0BzXbfPpoHKV5eWQxU1VQODZhTTA/view?usp=sharing<br>when you use atmega32 you must set fuse for it. <br></p><p>and when you solder PCB solder you should note carefully and did not miss any legs, as this is the second circuit face, you can also book for someone trained to do it to ensure circuit reliability. And my final non-electric circuits become restricts motherboard area, it absolutely does not affect the led. And can not forget that it is a 5V supply. Wish success. I look forward to seeing your circuit here.</p><p></p><p>Inside the downloaded folder: principle diagram, schematic print, inside a simulated 3d opened by Proteus, the revised code with external hex file, inside the code can edit custom and standard you, use WINAVR (recommended recommended). and images to set the fuse for ATmega32.</p>
<p>Hi!!<br>Do you know hoe to flash the EEPROM of Arduino just like we do in normal non-arduino boards..<br>i.e. we flash .eep file directly into the micro controller.. do you know any similar or equivalant thing in Arduino...?</p>
<p>I sorry you, because I do not use Arduino, so I did not go through the difficulties you face, but you can read more online material on its use. I can only help you in terms of hardware. Good luck. I believe you will succeed! : D</p>
<p>Thnx for replying!<br>I got a solution for it already!</p>
<p>Hello, </p><p>Now I got it. The idea to use the ULN2803 is to avoid using transistors correct ?<br>What do you mean that I need to set the fuse for the ATMEGA32 ?<br>I will be using arduino board, either Nano or mega. </p><p>Thanks for your reply </p><p>Jose </p>
<p>is this, if you use it you must chip atmega fuse set inside the IC, the fuse is to control a number of functions such as: using the calibrated internal or external crystal, and and some rather different features, please reference IC data sheet. so that it operates according to your desired this function. I use the load circuit to the load burn-e program for my IC, please find out more about it, or you can use the load circuit which you are available. <br>ULN2803 help replace the transistor 16 in the layer. you read this ic data sheet to learn more. I had to diagram inside folders principle schematic. you see that in order to better understand how it works. wish success! : D</p>
<p>Sorry for answers will tell you now, when using ULN2803 then your program absolutely nothing changes, we simply optimized hardware only. Good luck! soon see your results here. : D</p>
<p><iframe allowfullscreen="" frameborder="0" height="400" src="https://www.youtube.com/embed/4gNiDprbUPc" width="600"></iframe></p>
<p>hello everyone, I have an idea to replace 16 BJT layers by ULN2803, it will save your area, and it works very well I did 2 LED cube and all activities well however, I did not design the RS232 connection on my circuit.</p>
hey man, i think i had a good idea, but i had no idea about electronics, i think u'll like it, answer if u,re interested
<p>hi all</p><p>As like &quot;<a href="http://www.instructables.com/member/power000" rel="nofollow">power000</a>&quot; my led cube also having da same problem, some led column remain on constantly, pls help &amp; suggest the reason and how to rectify the problem.</p>
<p>go to my revisited instructable and get my code or go to <a href="http://www.TheLEDCube.com"> www.TheLEDCube.com </a> and download the RAMP.zip file, and upload my code to your cube.</p><p>Video the POWER ON SELF TEST and send me a message with a link to your video, and I will diagnose your issue.</p>
<p>sir this is naman from India. i got ur email id from <a href="http://instructable.com/" rel="nofollow">instructable.com</a>.. sir i seriously need ur help.... i made my 8*8*8 led cube using a Arduino uno and it is working like a charm... but the problem i got is with code i have downloaded several no. of codes from internet but non of them is executing. only one code which i got from instructable website which is separately given for a arduino user is working fine for me.</p><p>but when i execute other codes in arduino software im getting a error as </p><p>&quot; error compiling </p><p> compilation terminated </p><p> exist status 1&quot;</p><p>the above error is common for all codes im executing </p><p>sir plz help me out </p><p>Thank u :)</p>
<p>Hi, I seem to have successfully set the fuse bits, but here's the thing: after uploading the test.hex file to atmega32 and turning the cube on i get some random layers light up and stay on (with some flickering). Here's the video of that: <a href="https://www.dropbox.com/s/qpha7qhs9xkwyb8/VID_20151030_185558.mp4?dl=0" rel="nofollow">https://www.dropbox.com/s/qpha7qhs9xkwyb8/VID_2015...</a></p><p>I have a suspicion, that i may have fried something on the board and i hope that you may have an answer to that. At one point, i have accidentally powered on the cube via the 5V power source while it was still connected to USBasp which was plugged in the usb port. The USBasp didn't work afterwards (lol), so i ordered a new one. I also had trouble connecting to the atmega via the on-board connector, so i put it on a breadboard to see if it makes a difference - still no go. But after adding the crystal and two 22pF capacitors on the XTAL1 and XTAL2 SUCCESS! Avrdude started displaying the correct signature, i managed to set the fuse bits and write the test.hex successfully into the atmega. Do you have any idea if i could tinker with a multimeter to see whether anything went bad? Oh, i had a 1A fuse installed, which went off during my &quot;accident&quot;.</p><p>Thank you in advance!</p><p>P.S. I'm thinking of upgrading my cube in the long run by purchasing one of your premade boards to eliminate the wiring. However, I'm confused on which one i should get and how much that would cost me.</p>
<p>One of the fuses you set initially is switching from the internal 4MHz clock to the external crystal - so no crystal = no running after setting the fuses...that is until you add the crystal. So chances are, you didn't damage anything. In fact it did exactly what one would expect. For a mono cube, you'll want one of the RAMP boards.</p>

About This Instructable

5,025,519 views

3,918 favorites

License:

1473
Bio: I like microcontrollers and LEDs :D
More by chr: Reverse Engineering: RGB LED Bulb with IR remote Reverse engineering: USB controlled home automation hack LED Cube 8x8x8
Add instructable to: