// 				AVR scope 					   //
//		Vysoké učení technické v Brně          //
//			Ústav radioeletroniky              //
//                                             //
//                                             //
//	Vytvořil: Kocián Daniel                    //
//			  Pazour Zbyněk                    //
//	Verze   : 1.1                              //
//	Dne		: 28.4.2009                        //
//..............................................

#include<stdio.h>
#include<avr/io.h>
#include "ks0108.h"
#define  F_OSC 16000000UL
#include "delay.c"
#include "avrlcd.h"
#include <avr/pgmspace.h>

short int viewport_top = 0;
short int viewport_left = 0;
short int viewport_right = 127;
short int viewport_bottom = 63;
#include "font.h"
#include "avrlcd_fonts.h"


int main (void)
{
//nastaveni lCD//
ks0108ClearScreen();		// Smazání displeje
ks0108SetReset(1);			// Reset nastavim na HIGH a tak musi i zustat
delay_ms(1000);				// Cekam nez LCD "nabehne:"
ks0108Init(NON_INVERTED);	// Inicializace LCD	


//Uvítací obrazovka//
current_font=font13;
draw_text_ex(40, 0, 100, 10, 0, 1, "AVR scope", DT_NORMAL);

draw_text_ex(10, 30, 36, 10, 0, 1, "Bc. Kocián Daniel", DT_NORMAL);

draw_text_ex(10, 40, 36, 10, 0, 1, "Bc. Pazour Zbyněk", DT_NORMAL);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);


//deklarace proměných//
char nap [9];
short int pred=0;
int data [400];
int maximum=0,minimum=2000,index_min=0,index_max=0,index_stred=0,stred,stred2;
unsigned int vpp2,pomoc,vpp,data2;
int i,r,s,a;


//nastaveni AD prevodniku
ADMUX |= (1<<REFS0)|(1<<MUX0);   // Referenční napětí VCC, Převodník  ADC1 (PA1)
ADCSRA |= (1<<ADEN)|(1<<ADPS2);	 // Zapnutí A/D převodníku, Předdělička 16


//Samotný program osciloskopu//
while(1)
{
	

//Navzorkovani periody//
		
	for ( i=0;i<400;i++)
		{
		ADCSRA |= (1<<ADSC);				//spusteni AD prevodu 
		loop_until_bit_is_set(ADCSRA,ADIF);	//cekam dokud prevod neskonci
		data[i] = ADCW;						//vysledek ulozim do pole hodnot 
		}
//nalezeni maxima a minima navzorkované amplitudy//
  	maximum=0;
	minimum=1024;
	for ( i=0;i<300;i++) 
	{
			if (maximum<data[i]) 			//	|
				{							//	|
				maximum=data[i];			//	} Nalezení maxima
				index_max=i;				//	|
				}
				
				if (minimum>data[i])		//	|
				{							//	|
				minimum=data[i];			//	} Nalezení minima
				index_min=i;				//	|
				}
							
	}
//Nalezení středu amplitudy//
	
	stred = (maximum + minimum)/2;
	stred2=0;							
	for ( i=0;i<300;i++) 
	{

		if (data[i]<=stred)
		{
		if (data[i]>stred2 && data[i+1]>stred)
		{
		stred2=data[i];
		index_stred=i;
		if(stred2!=0 && data[i+1]>stred ) i=200;
		}
		}
		
	}

//Výpočet aktuální hodnoty napětí Vpp (pička-pička) 
pomoc = (maximum-minimum);
vpp = (5*pomoc)/1023;		 			 //Napeti VPP  (V)
vpp2 = (((pomoc*50)/1023))-(vpp*10);	 //Napětí Vpp  (mV)
sprintf (nap,"%d,%dV",vpp,vpp2);		 //Konstanta pro zobrazení napětí 
current_font=font13;					 


// Zobrazení popisu os na displeji
delay_ms(300);
ks0108ClearScreen();
draw_text_ex(1, 52, 0, 0, 0, 1, "0", DT_NORMAL);		//	|
draw_text_ex(76, 52, 0, 0, 0, 1, "1,5ms", DT_NORMAL);	//	} Popis osy x
draw_text_ex(109, 20, 0, 0, 0, 1, "Upp", DT_NORMAL);	//	|
draw_text_ex(108, 30, 0,0 , 0, 1, nap, DT_NORMAL);		//	} Zobrazení napětí Vpp
rectangle (107,21,127,42,2);							//	  Aktuální hodnota napětí Vpp v tečkovaném obdélníku
draw_text_ex(101, 25, 0,0 , 0, 1, "0", DT_NORMAL);		//	|
draw_text_ex(101, -3, 0,0 , 0, 1, "+2,5V", DT_NORMAL);  //	} Popis osy y
draw_text_ex(101, 52, 0,0 , 0, 1, "-2,5V", DT_NORMAL);	//	|


//algoritmus nastaveni rastru displeje

	for ( r=0;r<100;r+=2)
		{
		pixel (r,31,1);
		}
	for ( s=0;s<63;s+=2)
		{
		pixel (49,s,1);	
		}
	pixel(99,31,1);
	pixel(0,0,1);
	pixel(24,0,1);
	pixel(74,0,1);
	pixel(99,0,1);
	pixel(0,16,1);
	pixel(24,16,1);
	pixel(74,16,1);
	pixel(99,16,1);
	pixel(0,47,1);
	pixel(24,47,1);
	pixel(74,47,1);
	pixel(99,47,1);
	pixel(0,63,1);
	pixel(24,63,1);
	pixel(74,63,1);
	pixel(99,63,1);
	pixel(0,30,1);
	pixel(24,30,1);
	pixel(74,30,1);
	pixel(99,30,1);
	pixel(0,32,1);
	pixel(24,32,1);
	pixel(74,32,1);
	pixel(99,32,1);	
	line(100,0,100,63,1);		
	line(0,0,0,63,1);			
	line(0,0,100,0,1);			
	line(0,63,100,63,1);		
//konec nastaveni rastru displeje//


//zobrazeni na displeji //
		
	for ( a=0;a<100;a++)			//Rozsah zobrazované oblasti 63x100 pixelů     
	{
	data2 =63-(((63000/1023)*(data[index_stred+a]))/1000); //Začátek zobrazení vdy od středu amplitudy (0V)
		
		
			if (a>0)
			{
			line (a-1,pred,a,data2,1);
			}
			pred=data2;
	}		

}

}


