#include <avr/io.h>
#include <stdio.h> 
#include <avr/interrupt.h>
#include <util/delay.h> 
#include <math.h> 
#include "lcd_h.h"

char menu = 0x00, buffer [16];
int gx1,gy1,gz1; 
int uhelx1, uhely1, uhelz1;
int ux,uy,uz;

int main()
{

DDRB=0x00;
DDRC=0x00;

ADMUX = 0b00000000;	// kanál nula AD převodníku	
ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIF)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);	
//povolení AD převodu, přerušení po dokončení převodu, předdělička 128

lcd_init();			// inicilaizace displeje
lcd_clrscr();

sei();
while(1)
	{

/*******************************************************************
zobrazení na LCD
*******************************************************************/
	
switch(menu)
	{
	case 0:
		lcd_gotoxy(0,0);
		sprintf(buffer,"Ux=  %d mV",ux);		// napětí na ose x
		lcd_puts(buffer);
		lcd_gotoxy(0,1);
		if (gx1>=0)								// tíhové zrychleni g osa x
			{
			sprintf(buffer,"g= %d,%d", gx1/100, gx1%100); 	
			lcd_puts(buffer);
			}
			else
				{
				gx1=(-1)*gx1;					// tíhové zrychleni g záporné osa x 
				sprintf(buffer,"g=-%d,%d", gx1/100, gx1%100); 
				lcd_puts(buffer);
				}
		lcd_gotoxy(8,1);
		if (uhelx1>=0)							// úhel náklonu osa x
			{
			sprintf(buffer,"u= %d,%d", uhelx1/100, uhelx1%100); 	
			lcd_puts(buffer);
			}
			else
				{
				uhelx1=(-1)*uhelx1;				// úhel náklonu záporný osa x
				sprintf(buffer,"u=-%d,%d", uhelx1/100, uhelx1%100); 
				lcd_puts(buffer);
				}
		break;
	
	case 1:
		lcd_gotoxy(0,0);
		sprintf(buffer,"Uy=  %d mV",uy);		// napětí na ose y
		lcd_puts(buffer);
		lcd_gotoxy(0,1);
		if (gy1>=0)								// tíhové zrychleni g osa y
			{
			sprintf(buffer,"g= %d,%d", gy1/100, gy1%100); 
			lcd_puts(buffer);
			}
			else
				{
				gy1=(-1)*gy1;					// tíhové zrychleni g záporné osa y
				sprintf(buffer,"g=-%d,%d", gy1/100, gy1%100); 
				lcd_puts(buffer);
				}
		lcd_gotoxy(8,1);
		if (uhely1>=0)							// úhel náklonu osa x
			{
			sprintf(buffer,"u= %d,%d", uhely1/100, uhely1%100); 	
			lcd_puts(buffer);
			}
			else
				{
				uhely1=(-1)*uhely1;				// úhel náklonu záporný osa x
				sprintf(buffer,"u=-%d,%d", uhely1/100, uhely1%100); 
				lcd_puts(buffer);
				}
		break;

	case 2:
		lcd_gotoxy(0,0);
		sprintf(buffer,"Uz=  %d  mV",uz);		// napětí na ose z
		lcd_puts(buffer);
		lcd_gotoxy(0,1);
		if (gz1>=0)								// tíhové zrychleni g osa y
			{
			sprintf(buffer,"g= %d,%d", gz1/100, gz1%100); 
			lcd_puts(buffer);
			}
			else
				{
				gz1=(-1)*gz1;					// tíhové zrychleni g záporné osa y
				sprintf(buffer,"g=-%d,%d", gz1/100, gz1%100); 
				lcd_puts(buffer);
				}
		lcd_gotoxy(8,1);
		if (uhelz1>=0)							// úhel náklonu osa x
			{
			sprintf(buffer,"u= %d,%d", uhelz1/100, uhelz1%100); 	
			lcd_puts(buffer);
			}
			else
				{
				uhelz1=(-1)*uhelz1;				// úhel náklonu záporný osa x
				sprintf(buffer,"u=-%d,%d", uhelz1/100, uhelz1%100); 
				lcd_puts(buffer);
				}
		break;
	default:
		menu=0;
	}

/*******************************************************************
obsluha tlačítek
*******************************************************************/

if (bit_is_clear(PINB,1))		// posun v menu dopředu
	{
	_delay_ms(1);
	if (bit_is_clear(PINB,1))	// ošetření zákmitů opětovnou kontrolou stisku tlačítka
		{		   			
		menu++;
		_delay_ms(100);    
	   	}
	}

if (bit_is_clear(PINB,2))		// posun v menu dopředu
	{
	_delay_ms(1);
	if (bit_is_clear(PINB,2))	// ošetření zákmitů opětovnou kontrolou stisku tlačítka
		{		   			
		menu--;				// posun v menu doleva
	 if (menu<0)				
			{
			menu=2;
			}
	_delay_ms(100);    
		} 

	}
}
}
/*******************************************************************
dokončení AD převodu
*******************************************************************/

ISR(ADC_vect) 				
{

int napeti,x,y,z; 
double uhelx, uhely, uhelz;
double gx, gy, gz;

napeti = (ADCW);	

switch(ADMUX)
	{
	case 0:
		napeti = (ADCW);
		x = ((napeti)*(3.3/1023)*1000);		// vypočet napětí osa x
		ux=x;
		gx=((x-1650)/8.1);		// výpočet tíhového zrychlení osa x, stokrát větší
		gx1=gx;
		uhelx=(asin(gx/100))/3.14*18000;	// výpočet úhlu náklonu osa x, stokrát větší
		uhelx1=uhelx;
		break;

	case 1:
		napeti = (ADCW);
		y = ((napeti)*(3.3/1023)*1000);		// vypočet napětí osa y
		uy=y;
		gy=((y-1650)/8.1);		// výpočet tíhového zrychlení osa y, stokrát větší
		gy1=gy;
		uhely=(asin(gy/100))/3.14*18000;	// výpočet úhlu náklonu osa y, stokrát větší
		uhely1=uhely;
		break;

	case 2:
		napeti = (ADCW);
		z = ((napeti)*(3.3/1023)*1000);		// vypočet napětí osa z
		uz=z;
		gz=((z-1650)/8.1);		// výpočet tíhového zrychlení osa z, stokrát větší
		gz1=gz;
		uhelz=(asin(gz/100))/3.14*18000;	// výpočet úhlu náklonu osa y, stokrát větší
		uhelz1=uhelz;
		break;
	}

ADMUX++;	// posun na další kanál AD převodníku

if (ADMUX>2)
{
ADMUX=0;
}
ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIF)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);	
// opětovné spuštění AD převodu
}











