loading

Step 9: IO port expansion, alternative solution

There is another solution for providing more output lines. We went with the latch based multiplexer because we had 8 latches available when building the LED cube.

You can also use a serial-in-parallel out shift register to get 64 output lines. 74HC164 is an 8 bit shift register. This chip has two inputs (may also have an output enable pin, but we will ignore this in this example).
  • data
  • clock
Every time the clock input changes from low to high, the data in Q6 is moved into Q7, Q5 into Q6, Q4 into Q5 and so on. Everything is shifted one position to the right (assuming that Q0 is to the left). The state of the data input line is shifted into Q0.

The way you would normally load data into a chip like this, is to take a byte and bit-shift it into the chip one bit at a time. This uses a lot of CPU cycles. However, we have to use 8 of these chips to get our desired 64 output lines. We simply connect the data input of each shift register to each of the 8 bits on a port on the micro controller. All the clock inputs are connected together and connected to a pin on another IO port.

This setup will use 9 IO lines on the micro controller.

In the previous solution, each byte in our buffer array was placed in it's own latch IC. In this setup each byte will be distributed over all 8 shift registers, with one bit in each.

The following pseudo-code will transfer the contents of a 64 bit buffer array to the shift registers.

// PORT A: bit 0 connected to shift register 0's data input, bit 1 to shift register 1 and so on.
// PORT B: bit 0 connected to all the clock inputs
// char buffer[8] holds 64 bits of data

for (i=0; i < 8; i++)
{

PORTB = 0x00; // Pull the clock line low, so we can pull it high later to trigger the shift register
PORTA = buffer[i]; // Load a byte of data onto port A
PORTB = 0x01; // Pull the clock line high to shift data into the shift registers.

}

This is perhaps a better solution, but we had to use what we had available when building the cube. For the purposes of this instructable, we will be using a latch based multiplexer for IO port expansion. Feel free to use this solution instead if you understand how they both work.

With this setup, the contents of the buffer will be "rotated" 90 degrees compared to the latch based multiplexer. Wire up your cube accordingly, or simply just turn it 90 degrees to compensate ;) 
<p>look the video led not working and bord file in pdf can u people help me fix my problem</p>
<p>look my video led was not working on 2 row actually working but working different way I don what mistake I have done I attached board file in pdf please anybody can help I am really appreciate. I put full effort for this project but finally animation make me upset </p>
<p>hai I have problem in cube I done well but some animation not coming properly 1 and 2 row I mean 1and 2 ic I checked very well circuit is correct can u help me I upload pdf of my schematic and pics</p>
<p>Hello,</p><p>I read these sentences in this post:</p><p>With a cpu frequency of 14745600 Hz, 128 prescaler and output compare of 10, the interrupt routine is called every 1408th CPU cycle (128*11) or 10472.7 times per second.</p><p>Can anybody help me to explain how to calculate to 10472.7 times per second. I am new to AVR timer.</p><p>Thanks,</p>
Thanks for sharing the awesome project.? . The instructibles are very elaborative. Atfirst i was sceptical if i could make this project. But atlast after backbraking hours of soldering and debugging , it was a succes. And the credit goes to chr. Thanks chr . U rock☺.<br>I used arduino uno as the controller. But the code is not complete. I mean many effects are missing. I dont know anything about programming. I request u to please mail me the code with every effect. It will be a great help. Thank u.<br>dbnjnds@gmail.com
<p>Is there some other way other than gray coding in software to avoid 74HC138 glitches </p>
<p>If the latch order is incorrect from the 138, usually it's the binary inputs are either miswired (wrong order, or a line not connected) or 2 inputs are shorted together.</p><p>Another issue you may run into is switching the data too fast, not latching long enough etc. which has to be fixed in the code.</p>
<p>hey can you please help me.</p><p>IC 74hc138 is misbehaving. I suspect it to be race hazard.</p><p>Wrong latches are being selected by the address selecter.</p><p>the following sequence seems to fix the proplem.</p><p>void draw(char *buffer)</p><p>{</p><p> PORTB=0b00001000;</p><p> PORTA=buffer[0]; </p><p> PORTB=0b00001001;</p><p> PORTA=buffer[1];</p><p> PORTB=0b00001101;</p><p> PORTA=buffer[5];</p><p> PORTB=0b00001100;</p><p> PORTA=buffer[4];</p><p> PORTB=0b00001110;</p><p> PORTA=buffer[6];</p><p> PORTB=0b00001010;</p><p> PORTA=buffer[2];</p><p> PORTB=0b00001011;</p><p> PORTA=buffer[3];</p><p> PORTB=0b00001111;</p><p> PORTA=buffer[7];</p><p> PORTB=0b00001000;</p><p> PORTB=0b00000000;</p><p>}</p><p>What I did was to change one logical state in the input to decoder at a time.</p><p>some sites recommend temporary disabling of output to prevent race hazards.</p><p>how did you deal with this issue&gt;</p><p>pls help </p>
<p>WOW - 5 million views.</p><p>I think it's some kind of record! LOL!</p>
Hi, Where do i buy all that stuff for 69 dlls? Thanks
<p>thats projects its great! Im looking for all the stuff and making time for doing! please continue doing amazing thing. :)</p>
<p>hi, really great instructable, kind that inspires people.</p><p>This code, cube[5][3] |= (0x01 &lt;&lt; 4);</p><p>Hex01 bit wise move 4, or with a 2d array, I can't get my head around it.</p><p>Plz, a more detailed description will save me from more tablets, cheers</p>
<p>Made it!!</p><p>Thank you for the great instruction!!</p>
<p>Your print looks very neat. Mine is very messy.</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>Hahaha nice work!</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>Thank you for your guidance chr..</p>
<p>i am selling most of the components needed from Futurlec. I decided to do the Tindie kit instead. You can find my list of parts (less 512 LEDS) and further info in the classified sale section here: </p><p><a href="http://www.instructables.com/community/Major-Parts-KIT-for-8X8-CUBE-LED-from-Furturlec/">http://www.instructables.com/community/Major-Parts...</a></p><p>I am offering this at a discount and Priority mail within the US. </p><p>thank you</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>

About This Instructable

5,124,343views

4,001favorites

License:

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: