//	CFlicker for the ATtiny 25/45/85
//	copyright 2007 by
//	Villy G. Madsen
//	all rights reserved
//
#include <stdint.h>
#include <stdio.h>
#include <avr/interrupt.h> 
unsigned int ShiftRegisterL, ShiftRegisterH, FeedBackBit;
unsigned int ShiftRegisterLB, ShiftRegisterHB, FeedBackBitB;
unsigned int ShiftRegisterLC, ShiftRegisterHC, FeedBackBitC;
unsigned int ShiftRegisterLD, ShiftRegisterHD, FeedBackBitD;
unsigned int ShiftRegisterLE, ShiftRegisterHE, FeedBackBitE;

unsigned char IOTest;
int main(void)
{
	CLKPR = ( 1 << CLKPCE);
	CLKPR = (3 << CLKPS0);
	TCCR1 = (1 << CTC1) | (9 << CS10); 
	OCR1A = 200;	// making this value smaller increases the speed of the flicker	
	PLLCSR = 0;
	TIMSK = (1 << OCIE1A);
	PORTB = 0b11111;
	DDRB = 0b11111;
	IOTest = PINB;
	PORTB = 0;
	ShiftRegisterL = 1;
	ShiftRegisterH = 0;
	ShiftRegisterLB = 1;
	ShiftRegisterHB = 0;
	ShiftRegisterLC = 1;
	ShiftRegisterHC = 0;
	ShiftRegisterLD = 1;
	ShiftRegisterHD = 0;
	ShiftRegisterLE = 1;
	ShiftRegisterHE = 0;

	sei();
	for (;;)
	{
	}
	return 0;
}

ISR(TIM1_COMPA_vect)
{
	FeedBackBit = ((ShiftRegisterL >> 2) & 1) ^
	  ((ShiftRegisterH >> 14) & 1);
	ShiftRegisterH = (ShiftRegisterH << 1) |
	     ((ShiftRegisterL >> 15) & 1);
	ShiftRegisterL = (ShiftRegisterL << 1) | 
	     (FeedBackBit & 1);

	FeedBackBitB = ((ShiftRegisterLB >> 1) & 1) ^
	  ((ShiftRegisterHB >> 12) & 1);
	ShiftRegisterHB = (ShiftRegisterHB << 1) |
	     ((ShiftRegisterLB >> 15) & 1);
	ShiftRegisterLB = (ShiftRegisterLB << 1) | 
	     (FeedBackBitB & 1);

	FeedBackBitC = ((ShiftRegisterLC >> 2) & 1) ^
	  ((ShiftRegisterHC >> 11) & 1);
	ShiftRegisterHC = (ShiftRegisterHC << 1) |
	     ((ShiftRegisterLC >> 15) & 1);
	ShiftRegisterLC = (ShiftRegisterLC << 1) | 
	     (FeedBackBitC & 1);

	FeedBackBitD = ((ShiftRegisterLD >> 2) & 1) ^
	  ((ShiftRegisterHD >> 8) & 1);
	ShiftRegisterHD = (ShiftRegisterHD << 1) |
	     ((ShiftRegisterLD >> 15) & 1);
	ShiftRegisterLD = (ShiftRegisterLD << 1) | 
	     (FeedBackBitD & 1);

	FeedBackBitE = ((ShiftRegisterLE >> 2) & 1) ^
	  ((ShiftRegisterHE >> 3) & 1);
	ShiftRegisterHE = (ShiftRegisterHE << 1) |
	     ((ShiftRegisterLE >> 15) & 1);
	ShiftRegisterLE = (ShiftRegisterLE << 1) | 
	     (FeedBackBitE & 1);

	PORTB = (FeedBackBitC << 4) | (FeedBackBitB << 3)
	| (FeedBackBit <<2) | (FeedBackBitD << 1)
	| FeedBackBitE;

}
