#include <avr/io.h>
#include <stdint.h>
#include <stdlib.h>
#include <inttypes.h>
#include <avr/signal.h>
#include <avr/interrupt.h>

void uart_init(void);
void uart_send(uint8_t);
void uart_send_string(char *datastring);

unsigned int adc_capture(unsigned char channel);

unsigned char buffer[10];
unsigned int  timer=34286; // Prescaler:256 --> 31250 Schritte bis Overflow, 65.536 - 31.250
unsigned int adc0=0,adc1=0,adc2=0,adc3=0,adc4=0,adc5=0;

int main(void)
{
	OSCCAL=0x9f;
	uart_init();
	uart_send(0x0C);
	DDRD |= (1<<PD1)|(1<<PD2);
	
	TCCR1B |= (1<<CS12); 	// Prescaler:256 
	TCNT1 = timer;       	
	TIMSK1 |= (1<<TOIE1);	// Enable Overflow Interrupt Timer1
	sei();					// Enable Interrupts
      
	for (;;)                            /* loop forever */
	{	

		
	}	
    return 0;
}


/*
 Timer1 Overflow 1x/Sekunde
*/

SIGNAL(SIG_OVERFLOW1)
{
TCNT1 = timer;

uart_send(0x0D);	//CR 
uart_send_string("V;");

adc0=adc_capture(0);						// ADC auf Kanal 0 starten
if(adc0 < 1000) uart_send_string("0");
if(adc0 < 100)  uart_send_string("0");
if(adc0 < 10)   uart_send_string("0");
uart_send_string(itoa(adc0,buffer,10));	// Wert übermitteln (wenn vorhanden, sonst 0)
uart_send_string(";");

adc1=adc_capture(1);						// ADC auf Kanal 1 starten
if(adc1 < 1000) uart_send_string("0");
if(adc1 < 100)  uart_send_string("0");
if(adc1 < 10)   uart_send_string("0");
uart_send_string(itoa(adc1,buffer,10));	// Wert übermitteln (wenn vorhanden, sonst 0)
uart_send_string(";");

adc2=adc_capture(2);						// ADC auf Kanal 2 starten
if(adc2 < 1000) uart_send_string("0");
if(adc2 < 100)  uart_send_string("0");
if(adc2 < 10)   uart_send_string("0");
uart_send_string(itoa(adc2,buffer,10));	// Wert übermitteln (wenn vorhanden, sonst 0)
uart_send_string(";");

adc3=adc_capture(3);						// ADC auf Kanal 3 starten
if(adc3 < 1000) uart_send_string("0");
if(adc3 < 100)  uart_send_string("0");
if(adc3 < 10)   uart_send_string("0");
uart_send_string(itoa(adc3,buffer,10));	// Wert übermitteln (wenn vorhanden, sonst 0)
uart_send_string(";");

adc4=adc_capture(4);						// ADC auf Kanal 4 starten
if(adc4 < 1000) uart_send_string("0");
if(adc4 < 100)  uart_send_string("0");
if(adc4 < 10)   uart_send_string("0");
uart_send_string(itoa(adc4,buffer,10));	// Wert übermitteln (wenn vorhanden, sonst 0)
uart_send_string(";");

adc5=adc_capture(5);						// ADC auf Kanal 5 starten
if(adc5 < 1000) uart_send_string("0");
if(adc5 < 100)  uart_send_string("0");
if(adc5 < 10)   uart_send_string("0");
uart_send_string(itoa(adc5,buffer,10));	// Wert übermitteln (wenn vorhanden, sonst 0)



PORTD ^= (1<<PD2);
}


unsigned int adc_capture(unsigned char mux)
{
  unsigned int i;
  unsigned int result = 0;
  ADCSRA = (1<<ADEN) | (1<<ADPS2) |(0<<ADPS1) | (1<<ADPS0);    // Frequenzvorteiler 
									// setzen auf 32 (1) und ADC aktivieren (1)
 
  ADMUX = mux;						// Kanal waehlen
  ADMUX &=~ (1<<REFS0); 			// VCC(5V) als Referenzspannung nutzen 
 
  /* 1x Dummy-Read */
  ADCSRA |= (1<<ADSC);	
  while ( ADCSRA & (1<<ADSC) ) {
     ;
  }
 
  /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
  for(i=0;i<4;i++)
  {
    ADCSRA |= (1<<ADSC);	// eine Wandlung "single conversion"
    while ( ADCSRA & (1<<ADSC) ) {
      ;						// auf Abschluss der Konvertierung warten
    }
    result += ADCW;			// Wandlungsergebnisse aufaddieren
  }
  ADCSRA &= ~(1<<ADEN);	// ADC deaktivieren (2)
  result /= 4;
  return result;
}

void uart_init(void)
{
  UBRR0H= 0;
  UBRR0L= 51; 
  UCSR0B = (1<<TXEN0);
  UCSR0C = (1<<UCSZ01)|(1<<UCSZ00); // 8data, 1stopbit
}



void uart_send(unsigned char data)
{
  while ( !(UCSR0A & (1<<UDRE0)) )
    ;
  UDR0 = data;
}


void uart_send_string(char *datastring)
{
    for (;*datastring !='\0';datastring++){
	  loop_until_bit_is_set(UCSR0A, UDRE0);
	  UDR0=*datastring;
	}
}


