/******************************************************************************
 Title:    Code for an IR reciever 
 
 start bit   5ms
 0           1ms
 1           2.5ms

 
 Author:   rue_mohr
 Date:     Jan 8 2006
 Software: AVR-GCC 3.3 
 Hardware: attiny26
 
    
*******************************************************************************/
#include<avr/io.h>

#define Forward            1
#define Reverse            -1

#define OUTPUT             1
#define INPUT              0

// Bit positions
#define Strobe             7
#define Data               5
#define Clock              6

#define NumLeds            123

#define SetBit(BIT, PORT)        PORT |= (1<<BIT)
#define ClearBit(BIT, PORT)      PORT &= ~(1<<BIT)
#define DefBit(BIT, PORT, VALUE) PORT &= (~(1<<BIT))|((VALUE==0?0:1)<<BIT)
#define IsHigh(BIT, PORT)       (PORT & (1<<BIT)) != 0
#define IsLow(BIT, PORT)        (PORT & (1<<BIT)) == 0
#define NOP()                    asm volatile ("nop"::)

#define StrobeH()    SetBit(Strobe, PORTA)
#define StrobeL()    ClearBit(Strobe, PORTA)
#define DataH()      SetBit(Data, PORTB)
#define DataL()      ClearBit(Data, PORTB)
#define SetData(B)   DefBit(Data, PORTB, B)
#define ClockH()     SetBit(Clock, PORTB)
#define ClockL()     ClearBit(Clock, PORTB)
#define ClockPulse() NOP(); ClockH(); NOP(); NOP(); ClockL(); NOP()
#define SendOne()    DataH(); ClockPulse()
#define SendZero()   DataL(); ClockPulse()

void Send (unsigned int bits);
void SetLights(unsigned int bits);
void Delay(unsigned int delay);


int main (void)  {
 
  unsigned int temp;
 
  DDRA = (INPUT << PA0 | INPUT << PA1 |INPUT << PA2 |INPUT << PA3 |INPUT << PA4 |INPUT << PA5 |INPUT << PA6 |OUTPUT << PA7);
  DDRB = (INPUT << PB0 | INPUT << PB1 | INPUT << PB2 | INPUT << PB3 | INPUT << PB4 |OUTPUT << PB5 |OUTPUT << PB6 |INPUT << PB7);
    
  temp = 0;
  
  while(1) {                
    SetLights(temp); 
    temp++;                   
    Delay(3000);
  } 
}
    
//------------------------| FUNCTIONS |------------------------

void TimerInit() {

//set up 10Khz timer

}


//------| Led array output functions |------

void Delay(unsigned int delay) {
  unsigned int x;
  for (x = delay; x != 0; x--) {
    NOP();
  }
}

void SetLights(unsigned int bits) {
  StrobeH();
  Send(bits);
  StrobeL();
}

void Send (unsigned int bits) {
  unsigned int temp;  
  for( temp = 32768; temp != 0; temp = temp >> 1) {    
    if ( (bits & temp) == temp ) {
      SendOne();
    } else {
      SendZero();
    }    
  } 
}

