121 lines
2.9 KiB
Plaintext
121 lines
2.9 KiB
Plaintext
|
//TLC5940NT pin definitions
|
||
|
#define VPRG 2
|
||
|
#define SIN 11
|
||
|
#define SCLK 13
|
||
|
#define XLAT 4
|
||
|
#define BLANK 5
|
||
|
#define DCPRG 6
|
||
|
#define GSCLK 7
|
||
|
#define MISO 12
|
||
|
#define SS 10
|
||
|
|
||
|
int level[32] = {
|
||
|
4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,4095, 4095, 4095, 4095,4095, 4095, 4095, 4095,
|
||
|
4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,4095, 4095, 4095, 4095,4095, 4095, 4095, 4095};
|
||
|
|
||
|
|
||
|
byte rele[6] = {14, 15, 16, 17, 18, 19};
|
||
|
|
||
|
|
||
|
char spi_transfer(volatile byte data)
|
||
|
{
|
||
|
SPDR = data; // Start the transmission
|
||
|
while (!(SPSR & (1<<SPIF))) // Wait the end of the transmission
|
||
|
{
|
||
|
};
|
||
|
return SPDR; // return the received byte
|
||
|
}
|
||
|
|
||
|
void makemagic(){
|
||
|
setGreys();
|
||
|
feedPorts();
|
||
|
}
|
||
|
|
||
|
void feedPorts() {
|
||
|
// Clock for TLC5940's PWM
|
||
|
digitalWrite(BLANK, HIGH);
|
||
|
digitalWrite(BLANK, LOW); //=all outputs ON, start PWM cycle
|
||
|
for (int i=0; i<4096; i++) {
|
||
|
pulseGSCLK();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void pulseGSCLK() {
|
||
|
//ultra fast pulse trick, using digitalWrite caused flickering
|
||
|
PORTD |= 0x80 ; // bring pin 7 high, but don't touch any of the other pins in PORTB
|
||
|
//16 nanosecs is the min pulse width for the 5940, but no pause seems needed here
|
||
|
PORTD &= 0x7F; // bring pin 7 low without touching the other pins in PORTB
|
||
|
}
|
||
|
|
||
|
void setGreys() {
|
||
|
digitalWrite(BLANK, HIGH);
|
||
|
digitalWrite(XLAT,LOW);
|
||
|
for(int i = 15; i>=0; i--){
|
||
|
spi_transfer( (level[2*i+1] & 0x0FF0) >> 4 );
|
||
|
spi_transfer( ((level[2*i+1] & 0xF) << 4) | ((level[2*i] & 0x0F00) >> 8) );
|
||
|
spi_transfer( level[2*i] & 0xFF);
|
||
|
}
|
||
|
digitalWrite(XLAT,HIGH);
|
||
|
digitalWrite(XLAT,LOW);
|
||
|
digitalWrite(BLANK, LOW);
|
||
|
}
|
||
|
|
||
|
|
||
|
void startup(){
|
||
|
for(byte x = 0; x < 31; ++x){
|
||
|
level[x] = 0;
|
||
|
makemagic();
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
void setup() {
|
||
|
|
||
|
pinMode(VPRG, OUTPUT);
|
||
|
pinMode(SIN, OUTPUT);
|
||
|
pinMode(SCLK, OUTPUT);
|
||
|
pinMode(XLAT, OUTPUT);
|
||
|
pinMode(BLANK, OUTPUT);
|
||
|
pinMode(DCPRG, OUTPUT);
|
||
|
pinMode(GSCLK, OUTPUT);
|
||
|
pinMode(MISO, INPUT);
|
||
|
pinMode(SS,OUTPUT);
|
||
|
digitalWrite(SS,HIGH); //disable device
|
||
|
digitalWrite(SIN, LOW);
|
||
|
digitalWrite(SCLK, LOW);
|
||
|
digitalWrite(XLAT, LOW);
|
||
|
digitalWrite(VPRG, LOW);
|
||
|
digitalWrite(BLANK, HIGH);
|
||
|
digitalWrite(GSCLK, HIGH);
|
||
|
digitalWrite(DCPRG, LOW); // USE EEPROM DC register if LOW
|
||
|
|
||
|
//Setup the Hardware SPI registers
|
||
|
// SPCR = 01010000
|
||
|
//interrupt disabled,spi enabled,msb 1st,master,clk low when idle,
|
||
|
//sample on leading edge of clk,system clock/4 (fastest)
|
||
|
byte clr;
|
||
|
SPCR = (1<<SPE)|(1<<MSTR);
|
||
|
clr=SPSR;
|
||
|
clr=SPDR;
|
||
|
delay(10);
|
||
|
|
||
|
|
||
|
for(byte i = 0; i < 6; ++i) pinMode(rele[i], OUTPUT);
|
||
|
for(byte i = 0; i < 6; ++i) digitalWrite(rele[i], LOW);
|
||
|
startup();
|
||
|
|
||
|
}
|
||
|
|
||
|
void loop() {
|
||
|
|
||
|
for(byte i = 0; i < 32; ++i) level[i] = 4095;
|
||
|
for(byte i = 0; i < 6; ++i) digitalWrite(rele[i], HIGH);
|
||
|
makemagic();
|
||
|
delay(1000);
|
||
|
for(byte i = 0; i < 32; ++i) level[i] = 0;
|
||
|
for(byte i = 0; i < 6; ++i) digitalWrite(rele[i], LOW);
|
||
|
makemagic();
|
||
|
delay(1000);
|
||
|
|
||
|
}
|