/*

Led flasher

PB0  pwm channel 1
PB1  pwm channel 2
PB2
PB3  Analog 2 in
PB4  Analog 1 in
PB5 (RESET)


*/
#include<avr/io.h>

#define OUTPUT  1
#define INPUT   0

#define SetBit(BIT, PORT)     PORT |= (1<<BIT)
#define ClearBit(BIT, PORT)   PORT &= ~(1<<BIT)
#define IsHigh(BIT, PORT)    (PORT & (1<<BIT)) != 0
#define IsLow(BIT, PORT)     (PORT & (1<<BIT)) == 0

#define CH1On()                 SetBit(0, PORTB)
#define CH1Off()                ClearBit(0, PORTB)

#define CH2On()                 SetBit(1, PORTB)
#define CH2Off()                ClearBit(1, PORTB)

void Delay(unsigned int delay);
void InitADC( void );
void readADC(void) ;
 
 
int main( void ) {
 
  unsigned int i, d;
 
  // Set clock prescaler: 0 gives full 4.8 MHz from internal oscillator.
  CLKPR = (1 << CLKPCE);
  CLKPR = 0;

  DDRB = ((OUTPUT << PB0) | (OUTPUT << PB1) |(INPUT << PB2) |(INPUT << PB3) |(INPUT << PB4) |(INPUT << PB5 ));
  
  InitADC();

  while(1)  {
    d = 33000;
    
    readADC();
    i = (ADC*4)+980;
    d -= i;
    
        
    ADMUX = 3;  
    CH1On();    
    for(; i != 0; i--) asm volatile ("nop"::); // 900 is 0.5ms, 5000 is 2.5ms
    CH1Off();  
   
              
    
    readADC();
    i = (ADC*4)+980;
    d -= i;
    
    ADMUX = 2;
    CH2On();    
    for(; i != 0; i--) asm volatile ("nop"::); // 900 is 0.5ms, 5000 is 2.5ms
    CH2Off();  
    
    Delay(d); // 18000 is a full 17ms cycle 
  }
  
}



void Delay(unsigned int delay) {
  unsigned int x;
  for (x = delay; x != 0; x--) {
    asm volatile ("nop"::); 
  }
}



void InitADC( void ) {
  // VCC voltager ref, ADC2 (PB4) as default input
  ADMUX = 2;
  // Enable ADC, ADC prescaler /64
  ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);

  // Start conversion and wait for it to complete (result not used)
  ADCSRA |= (1<<ADSC);            // Start convertion
  while (ADCSRA & (1<<ADSC));     // Wait for conversion to complete
  ADCSRA = ADCSRA;                // Clear ADC interrupt flag

 
}

void readADC(void) {

    SetBit(ADIF, ADCSRA);
    SetBit(ADSC, ADCSRA);    

    while(IsLow(ADIF, ADCSRA));  // wait for conversion done, ADIF flag active

}
