Kirjoitusalusta.fi
Koko ruutu

Server Notice:

hide

Julkinen työtila Latest text of pad hacklab-soft-pwm Tallennettu Huhtikuu 24, 2012

 
     
 
 
#define GREYSCALES 128
#define LATCH_PORT B00000001
#define CLOCK_PORT B00010000
#define DATA_PORT B00001000
 
 
//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;
 
//holder for infromation you're going to pass to shifting function
byte data = 0; 
 
 
inline void latchOn() {
  // Port 8
  PORTB |=  B00000001;
}
 
inline void latchOff() {
  // Port 8
  PORTB &= ~B00000001;
}
 
inline void dataOn() {
  // Port 11
  PORTB |=  B00001000;
}
 
inline void dataOff() {
  // Port 11
  PORTB &= ~B00001000;
}
 
inline void clockOn() {
  // Port 12
  PORTB |=  B00010000;
}
 
inline void clockOff() {
  // Port 12
  PORTB &= ~B00010000;
}
 
 
 
 
void setup() {
  //set pins to output because they are addressed in the main loop
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
 
}
 
 
void loop() {
 
 
    lightPwm(100,
       random(GREYSCALES) / 10,
       random(GREYSCALES) / 10,
       random(GREYSCALES) / 10,
       random(GREYSCALES) / 10,
       random(GREYSCALES),
       random(GREYSCALES),
       random(GREYSCALES)
     );
 
 
}
 
 
void lightPwm(long duration, 
              int white, 
              int r1, int g1, int b1, 
              int r2, int g2, int b2) {
  
  byte data = 0;                
 
  // TODO: Gamma
  int r1tar = r1;
  int g1tar = g1;
  int b1tar = b1;
  int r2tar = r2;
  int g2tar = g2;
  int b2tar = b2;
  int whtar = white;
  
  int r1inv = GREYSCALES - r1tar;
  int g1inv = GREYSCALES - g1tar;
  int b1inv = GREYSCALES - b1tar;
  int r2inv = GREYSCALES - r2tar;
  int g2inv = GREYSCALES - g2tar;
  int b2inv = GREYSCALES - b2tar;
  int whinv = GREYSCALES - whtar;
                
 
  int r1err = 0;
  int g1err = 0;
  int b1err = 0;
  int r2err = 0;
  int g2err = 0;
  int b2err = 0;
  int wherr = 0;
                
  for (int t=duration; t >= 0; t--)  {    
    data = 0;
    for (int i=GREYSCALES-1; i >= 0; i--)  {
 
      if (r1err > 0) {data |= B00000001; r1err -= r1inv;} else {data &= ~B00000001; r1err += r1tar;}
      if (g1err > 0) {data |= B00000010; g1err -= g1inv;} else {data &= ~B00000010; g1err += g1tar;}
      if (b1err > 0) {data |= B00000100; b1err -= b1inv;} else {data &= ~B00000100; b1err += b1tar;}
      if (r2err > 0) {data |= B00001000; r2err -= r2inv;} else {data &= ~B00001000; r2err += r2tar;}
      if (g2err > 0) {data |= B00010000; g2err -= g2inv;} else {data &= ~B00010000; g2err += g2tar;}
      if (b2err > 0) {data |= B00100000; b2err -= b2inv;} else {data &= ~B00100000; b2err += b2tar;}
      if (wherr > 0) {data |= B01000000; wherr -= whinv;} else {data &= ~B01000000; wherr += whtar;}
      
      
/*      
      if (r1 == i)    data |= B00000001;
      if (g1 == i)    data |= B00000010;
      if (b1 == i)    data |= B00000100;
      if (r2 == i)    data |= B00001000;
      if (g2 == i)    data |= B00010000;
      if (b2 == i)    data |= B00100000;
      if (white == i) data |= B01000000;
*/
 
      shiftOut(data);       
      shiftOut(data);       
      shiftOut(data);       
      shiftOut(data);             
      shiftOut(data);       
    }
 
  }
 
 
inline void shiftOut(byte data) {
 
  PORTB &= ~LATCH_PORT; // Latch off
 
  PORTB &= ~CLOCK_PORT; // Clock off
  if (data & B00000001) PORTB |= DATA_PORT; else PORTB &= ~DATA_PORT;
  PORTB |=  CLOCK_PORT; // Clock on
 
  PORTB &= ~CLOCK_PORT; // Clock off
  if (data & B00000010) PORTB |= DATA_PORT; else PORTB &= ~DATA_PORT;
  PORTB |=  CLOCK_PORT; // Clock on
 
  PORTB &= ~CLOCK_PORT; // Clock off
  if (data & B00000100) PORTB |= DATA_PORT; else PORTB &= ~DATA_PORT;
  PORTB |=  CLOCK_PORT; // Clock on
 
  PORTB &= ~CLOCK_PORT; // Clock off
  if (data & B00001000) PORTB |= DATA_PORT; else PORTB &= ~DATA_PORT;
  PORTB |=  CLOCK_PORT; // Clock on
 
  PORTB &= ~CLOCK_PORT; // Clock off
  if (data & B00010000) PORTB |= DATA_PORT; else PORTB &= ~DATA_PORT;
  PORTB |=  CLOCK_PORT; // Clock on
 
  PORTB &= ~CLOCK_PORT; // Clock off
  if (data & B00100000) PORTB |= DATA_PORT; else PORTB &= ~DATA_PORT;
  PORTB |=  CLOCK_PORT; // Clock on
 
  PORTB &= ~CLOCK_PORT; // Clock off
  if (data & B01000000) PORTB |= DATA_PORT; else PORTB &= ~DATA_PORT;
  PORTB |=  CLOCK_PORT; // Clock on
 
  PORTB &= ~CLOCK_PORT; // Clock off
  if (data & B10000000) PORTB |= DATA_PORT; else PORTB &= ~DATA_PORT;
  PORTB |=  CLOCK_PORT; // Clock on
 
  PORTB |=  LATCH_PORT; // Latch on
 
}