/* ***********************************************************************
**
**  Copyright (C) 2005  Christian Kranz
**
**  Siemens S65 Display Control for L2F50 Display with Epson Controller
**
*********************************************************************** */
/*********************************************
* Chip type           : ATMEGA32
* Clock frequency     : clock 16 MHz
*********************************************/
#include <avr/io.h>
#include <inttypes.h>
#include <string.h>

#include "disp.h"

uint32_t ReadChannel(uint8_t mux)
{
	uint16_t i;
	uint32_t result;
	uint32_t result2;
 
	ADMUX = mux;                      // Kanal waehlen
	ADMUX = (0<<ADLAR)|(1<<REFS0) | (0<<REFS1); // ADCVCC=ADCVREF
 
	ADCSRA = (1<<ADEN)|(1<<ADPS0)|(1<<ADPS1)|(1<<ADPS2);    // Frequenzvorteiler 
															// setzen auf 128 und ADC aktivieren (1)
 
	/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
		also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
	ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
	while ( ADCSRA & (1<<ADSC) ) {
		;     // auf Abschluss der Konvertierung warten 
	}
	result2 = ADCL;
	result2 = result2 + (ADCH<<8);  // ADCL und ADCH muss einmal gelesen werden,
                  // sonst wird Ergebnis der nächsten Wandlung
                  // nicht übernommen.
 
	/* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
	result = 0;
	result2 = 0; 
	for( i=0; i<100; i++ )
	{
		ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
		while ( ADCSRA & (1<<ADSC) ) {
		;   // auf Abschluss der Konvertierung warten
		}
		result2 = ADCL;
		result2 = result2 + (ADCH<<8);
		result +=result2;
	}
	ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)
	result /= 100;                     // Summe durch vier teilen = arithm. Mittelwert 
	result = (result * 4320)/1024;
	//result = result-2730;
	return result;
}

int main(void)
{
	TCCR0 = (1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS00);//Fast PWM Mode,No Prescaling,f=62,5kHz
	TCNT0 = 0x00;//Timer Null setzen
	OCR0 = 160;//47% High
	DDRB |= (1<<PB3);//OC0 als Ausgang

	uint16_t adc0;
	char nr[10];

	port_init();
	lcd_init_c();
	fill_screen(0x0000);
	prints8x14(26,30,"Temperatur",0xFFFF,0x0000);
	for(;;)
	{
		adc0=ReadChannel(0);
		itoa(adc0,nr,10);
		prints24x50(18, 50,nr,0xFFFF,0x0000);
		_delay_ms(1000);
	}
  	//Ende des Programms
	for(;;){
	}
}







	

 
   
