changed the code to have the 10 anodes loop last, and the 4 cathodes loop first... this reduces the CPU flicker on the leds.
drop the delay to 4 and the flicker goes away completely.
still working on the haiku driver... i'll post it here when I'm done.
// Alphaseinor's Blink program
// Uses Teensyduino on a Teensy 2.0++ in it's current form
// Used to take a single character to control 40 LEDs
// These 40 LEDs are split into 4 sets of 10 LEDs
// They are controlled by 2 595 shift registers
// 4 sets of LEDs are controlled cathode to ground by NPN Transistors
// The warning from the ShiftPWM library:vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
// Clock and data pins are pins from the hardware SPI, you cannot choose them yourself if you use the hardware SPI.
// Data pin is MOSI (Uno and earlier: 11, Leonardo: ICSP 4, Mega: 51, Teensy 2.0: 2, Teensy 2.0++: 22)
// Clock pin is SCK (Uno and earlier: 13, Leonardo: ICSP 3, Mega: 52, Teensy 2.0: 1, Teensy 2.0++: 21)
// You can choose the latch pin yourself.
const int ShiftPWM_latchPin=8;
// If your LED's turn on if the pin is low, set this to true, otherwise set it to false.
const bool ShiftPWM_invertOutputs = false;
// You can enable the option below to shift the PWM phase of each shift register by 8 compared to the previous.
// This will slightly increase the interrupt load, but will prevent all PWM signals from becoming high at the same time.
// This will be a bit easier on your power supply, because the current peaks are distributed.
const bool ShiftPWM_balanceLoad = true;
#include <ShiftPWM.h> // include ShiftPWM.h after setting the pins!
// Here you set the number of brightness levels, the update frequency and the number of shift registers.
// These values affect the load of ShiftPWM.
// Choose them wisely and use the PrintInterruptLoad() function to verify your load.
// There is a calculator on my website to estimate the load.
unsigned char maxBrightness = 255;
unsigned char pwmFrequency = 75;
int numRegisters = 2;
int numCPUs = 4;
int numLeds = 10;
void setup(){
Serial.begin(9600);
// Sets the number of 8-bit registers that are used.
ShiftPWM.SetAmountOfRegisters(numRegisters);
// SetPinGrouping allows flexibility in LED setup.
// If your LED's are connected like this: RRRRGGGGBBBBRRRRGGGGBBBB, use SetPinGrouping(4).
ShiftPWM.SetPinGrouping(4); //This is the default, but I added here to demonstrate how to use the funtion
ShiftPWM.Start(pwmFrequency,maxBrightness);
}
void blink(int numberOfLeds, int cpuNumber){ //this outputs to the 595 shift registers the appropriate amount of LEDs
//first we set which bank of LEDs we want to use
switch(cpuNumber){ //pins 10-13 on the registers use a NPN transistor to pull the LED bus low
case 1:
ShiftPWM.SetOne(10,maxBrightness);
break;
case 2:
ShiftPWM.SetOne(11,maxBrightness);
break;
case 3:
ShiftPWM.SetOne(12,maxBrightness);
break;
case 4:
ShiftPWM.SetOne(13,maxBrightness);
break;
default:
break;
}
//Then we light up the number of LEDs that need to be displayed in order to make a single line graph
for(int i=0;i<numberOfLeds;i++){ //loops the number of LEDs starting at output 1
ShiftPWM.SetOne(i,maxBrightness); //sets 1 LED at a time in the loop
}
}
void loop()
{
if (Serial.available()) { // if serial data is present
char c = (char)Serial.read(); //note loop does not end here because it needs to switch 'c'
ShiftPWM.SetAll(0); //this changes all of the sates back to off on every loop so we don't get cross talk on the different LED Banks
switch (c){ // This is the switch for us to use the blink function
// A-K for CPU 1
// L-V for CPU 2
// a-k for CPU 3
// l-v for CPU 4
// 0 turns off LEDs
// 1-9 Sets Brightness of LEDs
case 'A': //LED Row 1, No LEDs Showing
break;
case 'B': //LED Row 1, 1 LEDs Showiing
blink(1, 1);
break;
case 'C': //LED Row 1, 2 LEDs Showing
blink(2, 1);
break;
case 'D': //LED Row 1, 3 LEDs Showing
blink(3, 1);
break;
case 'E': //LED Row 1, 4 LEDs Showing
blink(4, 1);
break;
case 'F': //LED Row 1, 5 LEDs Showing
blink(5, 1);
break;
case 'G': //LED Row 1, 6 LEDs Showing
blink(6, 1);
break;
case 'H': //LED Row 1, 7 LEDs Showing
blink(7, 1);
break;
case 'I': //LED Row 1, 8 LEDs Showing
blink(8, 1);
break;
case 'J': //LED Row 1, 9 LEDs Showing
blink(9, 1);
break;
case 'K': //LED Row 1, 10 LEDs Showing
blink(10, 1);
break;
case 'L': //LED Row 2, No LEDs Showing
break;
case 'M': //LED Row 2, 1 LEDs Showiing
blink(1, 2);
break;
case 'N': //LED Row 2, 2 LEDs Showing
blink(2, 2);
break;
case 'O': //LED Row 2, 3 LEDs Showing
blink(3, 2);
break;
case 'P': //LED Row 2, 4 LEDs Showing
blink(4, 2);
break;
case 'Q': //LED Row 2, 5 LEDs Showing
blink(5, 2);
break;
case 'R': //LED Row 2, 6 LEDs Showing
blink(6, 2);
break;
case 'S': //LED Row 2, 7 LEDs Showing
blink(7, 2);
break;
case 'T': //LED Row 2, 8 LEDs Showing
blink(8, 2);
break;
case 'U': //LED Row 2, 9 LEDs Showing
blink(9, 2);
break;
case 'V': //LED Row 2, 10 LEDs Showing
blink(10, 2);
break;
case 'a': //LED Row 3, No LEDs Showing
break;
case 'b': //LED Row 3, 1 LEDs Showiing
blink(1, 3);
break;
case 'c': //LED Row 3, 2 LEDs Showing
blink(2, 3);
break;
case 'd': //LED Row 3, 3 LEDs Showing
blink(3, 3);
break;
case 'e': //LED Row 3, 4 LEDs Showing
blink(4, 3);
break;
case 'f': //LED Row 3, 5 LEDs Showing
blink(5, 3);
break;
case 'g': //LED Row 3, 6 LEDs Showing
blink(6, 3);
break;
case 'h': //LED Row 3, 7 LEDs Showing
blink(7, 3);
break;
case 'i': //LED Row 3, 8 LEDs Showing
blink(8, 3);
break;
case 'j': //LED Row 3, 9 LEDs Showing
blink(9, 3);
break;
case 'k': //LED Row 3, 10 LEDs Showing
blink(10, 3);
break;
case 'l': //LED Row 4, No LEDs Showing
break;
case 'm': //LED Row 4, 1 LEDs Showiing
blink(1, 4);
break;
case 'n': //LED Row 4, 2 LEDs Showing
blink(2, 4);
break;
case 'o': //LED Row 4, 3 LEDs Showing
blink(3, 4);
break;
case 'p': //LED Row 4, 4 LEDs Showing
blink(4, 4);
break;
case 'q': //LED Row 4, 5 LEDs Showing
blink(5, 4);
break;
case 'r': //LED Row 4, 6 LEDs Showing
blink(6, 4);
break;
case 's': //LED Row 4, 7 LEDs Showing
blink(7, 4);
break;
case 't': //LED Row 4, 8 LEDs Showing
blink(8, 4);
break;
case 'u': //LED Row 4, 9 LEDs Showing
blink(9, 4);
break;
case 'v': //LED Row 4, 10 LEDs Showing
blink(10, 4);
break;
case '0':
maxBrightness = 0;
break;
case '1':
maxBrightness = 25;
break;
case '2':
maxBrightness = 50;
break;
case '3':
maxBrightness = 75;
break;
case '4':
maxBrightness = 100;
break;
case '5':
maxBrightness = 125;
break;
case '6':
maxBrightness = 150;
break;
case '7':
maxBrightness = 175;
break;
case '8':
maxBrightness = 200;
break;
case '9':
maxBrightness = 225;
break;
default:
break;
}
}
else
{
//startup routine
for(int led=1;led<numLeds+1;led++){
for(int cpu=0;cpu<numCPUs+1;cpu++){
if (Serial.available()){break;}
blink(random(led),cpu);
delay(5);
ShiftPWM.SetAll(0);
}
}
}
}