#include <avr/io.h>
#include <stdio.h>
#include <inttypes.h>


#define F_CPU 8000000           /* oscillator-frequency in Hz */
#include <avr/delay.h>
#define F_OSC 8000000           /* oscillator-frequency in Hz */
#define UART_BAUD_RATE 9600
#define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC) ((F_OSC)/((UART_BAUD_RATE)*16l)-1)

#define usec_count_(x) ((F_OSC*(x))/4000000)
#define delay_us(x) _delay_loop_2(usec_count_(x))

void delay_ms(unsigned int ms)
/* delay for a minimum of <ms> */
{
	// we use a calibrated macro. This is more
	// accurate and not so much compiler dependent
	// as self made code.
	while(ms){
		_delay_ms(0.96);
		ms--;
	}
}


void adc_init(void)
{


  DDRC=0x00; PORTC=0x00;


  unsigned char channel = 0;
  ADMUX=(channel & 0x0f);

  // ADCSRA: ADC Control and Status Register
  // ADPS2..ADPS0: ADC frequency Prescaler Select Bits
  // ADEN: Analog Digital Converter Enable, set this before setting ADSC

  ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Set ADC prescalar to 128 - 125KHz sample rate @ 16MHz

  ADMUX |= (1 << REFS0); // Set ADC reference to AVCC
  ADMUX |= (1 << ADLAR); // Left adjust ADC result to allow easy 8 bit reading

  // No MUX values needed to be changed to use ADC0

  //  ADCSRA |= (1 << ADFR);  // Set ADC to Free-Running Mode
    ADCSRA |= (1 << ADEN);  // Enable ADC
    ADCSRA |= (1 << ADSC);  // Start A2D Conversions 
}

void init_uart(void)
{
  // set baud rate
  UBRRH = (uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_OSC)>>8);
  UBRRL = (uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_OSC);

  // Enable receiver and transmitter; enable RX interrupt
  UCSRB = (1<<RXEN) | (1<<TXEN);

  //asynchronous 8N1
  UCSRC = (1<<URSEL) | (3<<UCSZ0);
}

static int uart_putchar(char c, FILE *stream);

static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL,_FDEV_SETUP_WRITE);

static int uart_putchar(char c, FILE *stream)
{
  
  //  if (c == '\n')
  //  uart_putchar('\r', stream);
  loop_until_bit_is_set(UCSRA, UDRE);
  UDR = c;
  return 0;
}

int main(void) {
  unsigned char c, oldc, rand, accum, rr;
  unsigned int xx,x;

  c=rand=accum=rr=xx=0;

  //      adc_init();

DDRC=0x00; PORTC=0x00;

  init_uart(); // init USART

  stdout = &mystdout;

  //  sei();  // enable interrupts
  
  // send initial character

  while (1){
    

    for (x=0;x<333;x++){
   
    c=PINC&0x01;
        delay_us(5);
    if (c==0) xx++;
    }

    if (xx&1==1) x=0;
    else x=1;
    xx=0;    
    rand=(x<<accum)|rand;
	accum++;
	if (accum==8)
	  {
	    accum=0;
	    printf("%c", rand);
	    rand=0;
	  }

  }
  



  return 0;
}

