PDA

View Full Version : Smart Star (how to use shift registers)



mackrackit
- 30th November 2008, 13:35
A week or so ago my seven year old asked if we could make a new star for the tree this year.
He has been playing with a Basic Stamp for the last few months and it looks like he will be getting his own PICKIT2 soon. I figured this would be a good time to introduce him to shift registers.

The Smart Star was born.

The 74HC595B was chosen. This is an 8 bit serial in parallel out register. The 595 has a serial out put that can be "daisy chained" to the serial input of the next one in line. This allows you to use only three pins from a PIC to control multiple out puts. In the case of the Smart Star, 40 LEDs are controlled.

The way it works. 8 bits are sent to the first register in the chain with the SHIFTOUT command, the data sent will be in the first register. Then another 8 bits are sent. The data in the first register will be "pushed" out of the first register to the second register. Do this as many times as there are registers in the chain. When all of the data has been sent, a pulse is applied to the latching pin of each register. All of the latching pins are tied together.

This all sounds like a slow process, but as you can see in the video it is surprisingly fast.


http://www.youtube.com/watch?v=De2jZQsS0dw

Board layout.
Solid lines are the bottom side of the board and the hollow lines are the top side.
See attachment.
The schematic is also attached

The code could be optimised but a lot of it was written by a seven year old. He will get there :)


'16f676
DEFINE OSC 4
ASM
ERRORLEVEL -306
ERRORLEVEL -205
ENDASM
INCLUDE "modedefs.bas"
@__config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF & _CP_OFF
ANSEL=000000
CMCON=7

CLK VAR PORTA.4
LATCH VAR PORTA.5
DAT VAR PORTC.5
U1 VAR BYTE
U2 VAR BYTE
U3 VAR BYTE
U4 VAR BYTE
U5 VAR BYTE
A VAR BYTE
Y VAR BYTE
Z VAR BYTE
X VAR BYTE
M VAR BYTE
G CON 010101
R CON 101010

PAUSE 250

START:
FOR A = 1 TO 10
U1 = 111111
U2 = 111111
U3 = 111111
U4 = 111111
U5 = 111111
GOSUB BAR
PAUSE 100
U1 = 000000
U2 = 000000
U3 = 000000
U4 = 000000
U5 = 000000
GOSUB BAR
PAUSE 100
NEXT A
GOSUB LOOP
GOSUB B1

B1:
FOR A = 1 TO 5
U1 = 111111
U2 = 000000
U3 = 111111
U4 = 111111
U5 = 000000
GOSUB BAR
PAUSE 100
U1 = 000000
U2 = 000000
U3 = 000000
U4 = 000000
U5 = 000000
GOSUB BAR
PAUSE 100
NEXT A
GOSUB LOOP
GOSUB B2

B2:
FOR A = 1 TO 5
U1 = 000000
U2 = 111111
U3 = 000000
U4 = 000000
U5 = 111111
GOSUB BAR
PAUSE 100
U1 = 000000
U2 = 000000
U3 = 000000
U4 = 000000
U5 = 000000
GOSUB BAR
PAUSE 100
NEXT A
GOSUB LOOP
GOSUB LOOP2

LOOP:
Z = 1
FOR Y = 1 TO 8
Z = Z * 2
GOSUB BAR2
PAUSE X
NEXT Y
X = X - 10
IF X = 10 THEN X = 100
'GOTO START
RETURN

LOOP2:
FOR A = 1 TO 25
Z = 1
FOR Y = 1 TO 8
Z = Z * 2
GOSUB BAR2
PAUSE X
NEXT Y
X = X - 10
IF X = 10 THEN X = 100
NEXT A
GOSUB RG

RG:
FOR A = 1 TO 25
U1 = R
U2 = R
U3 = R
U4 = R
U5 = R
GOSUB BAR
PAUSE 100
U1 = G
U2 = G
U3 = G
U4 = G
U5 = G
GOSUB BAR
PAUSE 100
NEXT A
GOSUB LOOP
GOSUB SPIR

SPIR:
X = 100
FOR A = 1 TO 25
SHIFTOUT DAT,CLK,1,[000000]
SHIFTOUT DAT,CLK,1,[000000]
SHIFTOUT DAT,CLK,1,[000000]
SHIFTOUT DAT,CLK,1,[000000]
SHIFTOUT DAT,CLK,1,[111111]
PULSOUT LATCH,5
PAUSE X
SHIFTOUT DAT,CLK,1,[000000]
SHIFTOUT DAT,CLK,1,[000000]
SHIFTOUT DAT,CLK,1,[000000]
SHIFTOUT DAT,CLK,1,[111111]
SHIFTOUT DAT,CLK,1,[000000]
PULSOUT LATCH,5
PAUSE X
SHIFTOUT DAT,CLK,1,[000000]
SHIFTOUT DAT,CLK,1,[000000]
SHIFTOUT DAT,CLK,1,[111111]
SHIFTOUT DAT,CLK,1,[000000]
SHIFTOUT DAT,CLK,1,[000000]
PULSOUT LATCH,5
PAUSE X
SHIFTOUT DAT,CLK,1,[000000]
SHIFTOUT DAT,CLK,1,[111111]
SHIFTOUT DAT,CLK,1,[000000]
SHIFTOUT DAT,CLK,1,[000000]
SHIFTOUT DAT,CLK,1,[000000]
PULSOUT LATCH,5
PAUSE X
SHIFTOUT DAT,CLK,1,[111111]
SHIFTOUT DAT,CLK,1,[000000]
SHIFTOUT DAT,CLK,1,[000000]
SHIFTOUT DAT,CLK,1,[000000]
SHIFTOUT DAT,CLK,1,[000000]
PULSOUT LATCH,5
PAUSE X
X = X - 10
IF X = 10 THEN X = 100
NEXT A
PAUSE 50
GOTO START

BAR:
SHIFTOUT DAT,CLK,0,[U5]
SHIFTOUT DAT,CLK,0,[U4]
SHIFTOUT DAT,CLK,0,[U3]
SHIFTOUT DAT,CLK,0,[U2]
SHIFTOUT DAT,CLK,0,[U1]
PULSOUT LATCH,5
RETURN

BAR2:
SHIFTOUT DAT,CLK,0,[Z]
SHIFTOUT DAT,CLK,0,[Z]
SHIFTOUT DAT,CLK,0,[Z]
SHIFTOUT DAT,CLK,0,[Z]
SHIFTOUT DAT,CLK,0,[Z]
PULSOUT LATCH,5
RETURN

END

SteveB
- 30th November 2008, 19:23
A 7 year old! Wow, thats terrific. Tell him he did a great job for me!

Steve B

aratti
- 30th November 2008, 19:54
Dave, I like it! I think to build it for my christmas tree.

Thank you for sharing the project.

Al.

mackrackit
- 30th November 2008, 20:06
A 7 year old! Wow, thats terrific. Tell him he did a great job for me!

Steve B
He said "Thank you"


Dave, I like it! I think to build it for my christmas tree.

Thank you for sharing the project.

Al.
Thanks,
If I were to do another one I would use a PIC with a bit more memory. Maybe more LEDs, bigger, 3D version :D