
/********************************************************************
// adc_xhruby00.c
//-------------------------------------------------------------------
// 
// AD prevodnik
// 
// Michal Hrubý 2011
// VUTBR
// xhruby00
//
********************************************************************/

#define F_CPU 8000000UL			// frekvence hodinového s;ignálu (nutné pro delay.h)
#include <avr/io.h>				// hlavičkový soubor pro mikrokontrolér ATmega16
#include <util/delay.h>     	// hlavičkový soubor pro zpoždění

#include "adc_xhruby00.h" 		// headerfile LCD




void initADC(void){
	/***************************************************************
	Inicializace ADC
	
	Nastaveni:
	MUX   =  7 kanal (PD7)
	REF   =  Vnejsi reference - mame 5V
	ADLAR =  Zarovnani doleva - uprava na 8bitovy
	ADPS  =  delicka 1:128
	ADEN  =  Zapinuti AD prevodnik.

	****************************************************************/

	ADMUX = (0<<REFS1) | (0<<REFS0) | (1<<ADLAR);   // vybrana vnější reference + zarovnani doleva

	ADCSRA= (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // Delici faktor = 128 + zapnuti ADC
	
}



char readADC(void){
	/***************************************************************
	Vycteni ADC prevodu
	
	Navratova hodnota:
	char -  0-256 protoze je ADC pouzivan pouze jako 8bitovy

	Nastaveni:
	ADMUX = cteny kanal - konstanta ADC_CHANNEL
	ADSC  = start prevodu 

	****************************************************************/

	ADMUX|=ADC_CHANNEL;

	//Start prevodu
	ADCSRA|=(1<<ADSC);

	//Cekni na konec prevodu
	while(!(ADCSRA & (1<<ADIF)));

	//nulovani ADIF 
	ADCSRA|=(1<<ADIF);

	// vrati obsah ADCH - horni 8 bitu
	return(ADCH);	
}


char averageADC(char count){
	/***************************************************************
	Prumerna hodnota cteni

	Argumenty:
	1)char count : pocet mereni
	
	Navratova hodnota:
	char :  0-256 protoze je ADC pouzivan pouze jako 8bitovy

	****************************************************************/
		
	char i;					// pomocna
	int average=0;			// vysledek
	for (i=0; i<count;i++){	// provedeni mereni
	
		average += readADC();
	}	

	average /= (int)count;	// prumerovani

	return (char)average;
}


char batery_check(char adc_value)
{	
	/***************************************************************
	Kontrola baterie a char pro prirazeni k ikone
	
	Argumenty:
	1)char adc_value : predani hodnoty z AD prevodu

	Navratova hodnota:
	char :  0-5 podle stavu baterie (0 - vybito; 5 - plne nabiti)

	Pozn:
	Pokud je stav baterie 0 = vybito, jsou vypnuty motory a uzivateli
	zobrazeno varovne hlaseni 

	****************************************************************/

	char energy;
	
	if(adc_value>=185){			//  >=14.30V
		energy=5;				// 	Plne nabita baterie
	}else if (adc_value>175){	//	14.30 az 13.67 V 
		energy=4;				// 	1 dilek chybi
	}else if (adc_value>170){	//	13.67 az 13.28 V 
		energy=3;				// 	2 dilky chybi
	}else if (adc_value>150){	//	13.28 az 12.50 V	
		energy=2;				// 	3 dilky chybi
	}else if (adc_value>128){	//	12.50 az 10.00 V	
		energy=1;				// 	4 dilky chybi
	}else if (adc_value<=128){	//	mene nez 10.00 V  ------------------- VYPNOUT
		energy=0;				// 	Baterie vybita - Varovne hlaseni - vypnuti!
		lcd_lines_print("   Baterie vybita", " !VYPNETE ZARIZENI!");	//varovne hlaseni
		motors_disa();			// vypnout motory
		while(1);				// provede zacykleni - aby uzivatel nemohl hlaseni obejit
	}

	return energy;
}







