RGB LED Fader

From PaulJMac
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Abstract

This is a neat little thing that will generate a very smooth fading RGB LED. I used these little ShiftBright modules which have the A6281 already mounted along with an RGB LED. I don't have the ability to solder a 3mm x 3mm QFN myself.

Parts

  • ATtiny44
  • A6281 3-Channel Constant Current LED Driver with Programmable PWM Control

Code

main.c

#include <avr/io.h>
#include <util/delay.h>

#define bit_get(p,m) ((p) & (m))
#define bit_set(p,m) ((p) |= (m))
#define bit_clear(p,m) ((p) &= ~(m))
#define bit_flip(p,m) ((p) ^= (m))
#define bit_write(c,p,m) (c ? bit_set(p,m) : bit_clear(p,m))
#define BIT(x) (0x01 << (x))
#define LONGBIT(x) ((unsigned long)0x00000001 << (x))
#define NOP asm("nop")

#define E_S bit_set(PORTA,BIT(0));
#define E_C bit_clear(PORTA,BIT(0)); //OE is active low, this turns lights on

#define L_S bit_set(PORTA,BIT(1));
#define L_C bit_clear(PORTA,BIT(1));

#define LED_OFF bit_clear(PORTA,BIT(7));
#define LED_ON bit_set(PORTA,BIT(7));

#define shift USICR|=(1<<USICLK);	//generates a shift in the SPI register
#define clock USICR|=(1<<USITC);	//generates a clock on the SPI bus 


//PA1 is Latch inout
//PA0 is Enable output

volatile uint8_t x=0;

void Port_setup(void){
	DDRA|=(1<<PA7)|(0<<PA6)|(1<<PA5)|(1<<PA4)|(1<<PA1)|(1<<PA0); //seting up the apropriate SPI i/o's
	USICR|=(0<<USIWM1)|(1<<USIWM0)|(0<<USICS1)|(0<<USICS0); //SPI mode
	DDRB|=(0<<PB1);
	PORTB|=(1<<PORTB0);
	LED_OFF;
	
	E_C;
	L_C;
}

void shft8bit(unsigned char val)
{
   USIDR = val;
   USISR = (1<<USIOIF);
   do {
      USICR = (1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC);
	  _delay_us(40);
   } while ((USISR & (1<<USIOIF)) == 0);
} 


void colors(uint16_t red, uint16_t green, uint16_t blue)
{
	volatile uint32_t packet=1;

	packet = (packet << 2)| (blue & 1023);
	packet = (packet << 10)| (red & 1023);
	packet = (packet << 10)| (green & 1023);

	shft8bit((packet>>24) & 0xff);
	shft8bit((packet>>16) & 0xff);
	shft8bit((packet>>8) & 0xff);
	shft8bit((packet>>0) & 0xff);
	L_S;
	_delay_us(40);
	L_C;
}

void LED_setup(void)
{
	shft8bit(0b11111111);
	shft8bit(0b11111111);
	shft8bit(0b11111111);
	shft8bit(0b00111111);
	L_S;
	_delay_us(40);
	L_C;
}

void Blue(void)
{
	// blue
	shft8bit(0b10111111);
	shft8bit(0b11110000);
	shft8bit(0b00000000);
	shft8bit(0b00000000);
	L_S;
	_delay_us(40);
	L_C;
}

void Red(void)
{
	// red		
	shft8bit(0b10000000);
	shft8bit(0b00001111);
	shft8bit(0b11111100);
	shft8bit(0b00000000);
	L_S;
	_delay_us(40);
	L_C;
}

void Green(void)
{
	// green
	shft8bit(0b10000000);
	shft8bit(0b00000000);
	shft8bit(0b00000011);
	shft8bit(0b11111111);
	L_S;
	_delay_us(40);
	L_C;
}

void Clear(void)
{
	// green
	shft8bit(0b10000000);
	shft8bit(0b00000000);
	shft8bit(0b00000000);
	shft8bit(0b00000000);
	L_S;
	_delay_us(40);
	L_C;
}

void Delay(void)
{
	_delay_ms(40);
}

int main (void)
{
	E_S;
	Delay();
	Port_setup();
	LED_setup();
	Clear();
	Clear();
	E_C;
	LED_ON;
	for(;;)
	{	
		int y=0;
		for(int i=1023;i>0;i--)
		{
			y++;
			colors(i,y,0);
			Delay();
		}
		y=0;
		for(int i=1023;i>0;i--)
		{
			y++;
			colors(0,i,y);
			Delay();
		}
		y=0;
		for(int i=1023;i>0;i--)
		{
			y++;
			colors(y,0,i);
			Delay();
		}
	}
}