Daisy Chained Shift Registers failing when >6 connected (decoupling issue?)

Hi all,

So I am having some trouble with a project. I am daisy-chaining TPIC6C595 Shift Registers, each one driving SA15-11GWA Kingbright 7-segs and the first six in the line work great! However, the third batch keeps displaying garbage.

I have a .1uf cap going from 5V to GND right next to each shift reg (underneath the 7segs), and also a 47uf going from 5V to GND next to the arduino.

I imagine this is a decoupling problem, but alas I am new to daisy chaining so many chips so any input would be so very very appreciated!

Thanks so kindly! :slight_smile:


I assume you switched the order of the boards and whichever is third in line gets garbled.

My guess is a timing issue. The Serial Clock (SRCK) line both tells the chip to grab input from SER IN and shifts the second-to-last bit into the last bit. The last bit is providing SER OUT which, I expect, is connected to the SER IN of the next chip. If the SRCK line is delayed for any reason, like line capacitance, it may clock the chip while its input is in the process of changing. I don't know if there is an easy fix for that.

You may need to put a buffer amp on your SRCK line.

A possible quick check to see if the problem is a degraded clock signal is to lower the frequency of your output. This will require writing your own shiftOut() routine with some delays in place, but it's easy enough to just copy the existing Arduino shiftOut() and adding a few delays. For example:

void shiftOutSlow(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
	uint8_t i;

	for (i = 0; i < 8; i++)  {
		if (bitOrder == LSBFIRST)
			digitalWrite(dataPin, !!(val & (1 << i)));
			digitalWrite(dataPin, !!(val & (1 << (7 - i))));
		digitalWrite(clockPin, HIGH);
		digitalWrite(clockPin, LOW);

If the displays are working at the lower frequency outputs, then you probably need to buffer the clock signal. A simple voltage follower should work fine.

Alternatively, if speed isn't an issue, you could just run at the slower speeds. You could play around with the delays to find the ideal speed. 1ms delays are likely far longer than you need.

Thanks for the advice j & john!

So I added a .1uf cap to the latch pin because I saw it on the shiftout() tutorial. The SRCK line capacitance makes a lot of sense. I’ll try messing with some delays and see how that goes.

I also wired up the other end of the circuit to the latch, clock, 5V and GND, and it seems to have solved the issue.

NOW however, it only works using USB power (though a little dimmer). After 60s or so, the digits start flashing, and the power light on the arduino flickers whenever I use an AC adapter.

I’m using mostly AC adapters in the range of 7.5V 2-3A.

It’s a head-scratcher :slight_smile:

Okay so I think I've identified my issue here.

I am running 9 x 7 seg displays (20mA per seg * 9 * 8 = 1.4A).

The Voltage Regulator on the Arduino was getting hot as heck, leading to flickering power.

So I've started by adding a voltage regulator and running the displays and shift regs off the Vin instead of the 5V on the Arduino.

However this is still too much for my voltage regulator and it heats up quick (its only rated to 1A). :~

Perhaps I need to add a voltage regulator for every few digits? How else can I do this without running them dim off USB?



However this is still too much for my voltage regulator and it heats up quick (its only rated to 1A).

Simple, do what are are doing now but use a larger regulator and add a heatsink.


"So I added a .1uf cap to the latch pin because I saw it on the shiftout() tutorial." No!! Do not add capacitors to the logic signals, that is not good.

Can you buy a bigger switchmode power supply, like this 5V, 4A beauty?

I am using this for my large score/time display.