/*
 * THC_V1.c
 *
 * Created: 07.05.2016 20:30:53
 *  Author: Ð°Ð½Ð´Ñ€ÑŽÑ…Ð°
 

 Vihodi na displei
 
 PORTB1-  data DB7
 PORTB2-  data DB6
 PORTB3-  data DB5
 PORTB4-  data DB4
 
 PORTB4-E takt signal
 PORTB5-R\W Read\Write
 PORTB6-A\O data\komand
 
 *****************************
 Vihodi na dvigatel
 PD1-Step
 PD0-Dir

 *****************************
 Vivodi na istochnik plazmi
 PE5-Vkluchenie
 PE6-estDuga
 PE7-vihod s delitely
 *****************************
           na os Z
 PG3-verh predel
 PG4-niz predel
 PB7-upor v metall
 ********************************
           K MACH3
 PE0-vihod TNC_ON
 PE1-vihod STOP
 PE2-vhod vklychenie
 PD2-vhod step_x
 PD3-vhod STEP_Y
 */ 

#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <avr/wdt.h>

#define PAUZA(x) for(char i=0;i<x;i++){asm("nop");}
#define ENTER 17
#define REHCOTKA 2
#define ZVEZDA 1
#define ESC 13
#define F1 4
#define F2 3
#define STRELKAVERH 5
#define STRELKANIZ 9
#define STRELKALEVO 20
#define STRELKAPRAVO 18
#define OCHISTKA_VERH_STROKI for(int i=0;i<17;i++){verhnyyStrokaV_Displei[i]=NULL;}
#define OCHISTKA_NIJNEI_STROKI for(int i=0;i<17;i++){nijnyyStrokaV_Displei[i]=NULL;}
#define NASTROIKA 0
#define POISK_POVERHNOSTI 1
#define OCHISTKA_METALLA 2
#define PROKOL 3
#define IZMERENIE_NAPRYJENIY 4
#define REZKA 5
#define WR wdt_reset();
#define STOP dvijenie(0)
#define KOMANDA_V_VERH dvijenie(1)
#define KOMANDA_V_NIZ dvijenie(2)
#define VKLUCHIT_PLAZMU PORTE|=(1<<5)
#define OTKLUCHIT_PLAZMU PORTE&=~(1<<5)
#define TNC_ON PORTE|=(1<<0)
#define TNC_OF PORTE&=~(1<<0)
#define ESTOP PORTE|=(1<<1)
#define VREMY_IZMERENIY_NAPRYJENIY_DUGI 500
#define EST_UPOR_Z PINB&(1<<7)
#define EST_NIZ_PREDEL PING&(1<<4)
#define EST_VERH_PREDEL ~PING&(1<<3)
#define EST_ENEBLE ~PINE&(1<<2)
  
unsigned  long chastotaNapryjenie,perepolnenieTimer3,odnaMilisicunda,vvodimoeChislo=0,vvedennoeChislo;

unsigned int chastotaShaga=1,rezultOprosaKlaviaturi,eeustanovkaVremeniProkola EEMEM=10,ustanovkaVremeniProkola,ustanovkaVisotiOchistki,\
eeustanovkaOtnohenieMM_Hag EEMEM=17,ustanovkaOtnohenieMM_Hag,eeustanovkaTochnostiOciZ EEMEM=50,ustanovkaTochnostiOciZ,\
eeustanovkaNapryjenieMetallNaiden EEMEM=10000,ustanovkaNapryjenieMetallNaiden,eeustanovkaSkorostiPeremehceniyOsiZ EEMEM=252,ustanovkaSkorostiPeremehceniyOsiZ,\
eeustanovkaVisotiRezaMm EEMEM=40,ustanovkaVisotiRezaMm,eeustanovkaVisotiProkolaMm EEMEM=10,ustanovkaVisotiProkolaMm,
eeustanjvkaSkorostiRegVisoti EEMEM=245,ustanjvkaSkorostiRegVisoti,eeustanovkaNapryjenieUpora EEMEM=1000,ustanovkaNapryjenieUpora;
char avariyNomer,komandaV_Displei=0,vremyDispleiZanyt,ochistkaBaitaPoslePeredachiDannihV_Displei=0,periodOprosaKlaviaturi,\
adresVerhneiStroki=0,tekuhciiAdres,stranica=2,adresNijStr=0,\
ochistkaBaitaPoslePeredachiKomandyV_Displei=0,flagZanytAndAdres=0,peredachaPolubaitaV_Displey=1,flagPeredachaV_Displei,periodVivodaSlovaDispley=0;
unsigned char cifra1[7]={0},cifra2[7]={0},cifraFloat1[7]={0},cifraFloat2[7]={0},beguhceeSlovo[17]={0},vvedennieComandi[5]={0};
unsigned char *verhnyyStrokaV_Displei[17]={NULL},*nijnyyStrokaV_Displei[17]={NULL};
unsigned char flagSbrosaPeredachiV_Displei;
signed long long polojenieOsiZ_Hag;
unsigned char sRegulirovka[]={"ðåãóëèðîâêà "} ,sRezaka[]={"ðåçàêà "},sVisota[]={"âûñîòà "},sVisoti[]={"âûñîòû "},sVisotu[]={"âûñîòó "},sReza[]={"ðåçà "},sVProcesse[]={"â ïðîöåññå "},\
sUstanovka[]={"óñòàíîâêà "},sUstanovite[]={"óñòàíîâèòå "},sSkorosti[]={"ñêîðîñòè "},sRegulirovki[]={"ðåãóëèðîâêè "},sProkola[]={"ïðîêîëà "}, \
sNapryjenie[]={"íàïðÿæåíèå "},sDugi[]={"äóãè "},sTekuhcay[]={"òåêóùàÿ "},sMm[]={"ÌÌ"} ,sVremy[]={"âðåìÿ "},sMs[]={"ìñ "},sUpravlenieIM[]={"Óïðàâëåíèå ÈÌ "},sUpravlenie[]={"Óïðàâëåíèå "},\
sPlasmorezom[]={"ïëàçìîðåçîì "},sTNC_On[]={"TNC On "},sTNC_Of[]={"TNC Of "},sDvijenieOsiZ[]={"Äâèæåíèå îñè Z "},sDlyVhodaNajmite[]={"äëÿ âõîäà íàæìèòå "},sEnter[]={" Enter "}, sVklycheno[]={"Âêëþ÷åíî "},\
sViklycheno[]={"Âûêëþ÷åíî "},sStrelkami[]={"ñòðåëêàìè  "},sV_Verh[]={"Â âåðõ "},sV_Niz[]={"Â íèç "},sStop[]={"Ñòîï "},sOtnohenie[]={"Îòíîøåíèå "},sHag_Mm[]={"Øàã/Ìì "},\
sTochnosti[]={"òî÷íîñòè "},sMetallNaiden[]={"ìåòàëë íàéäåí "},sPeremehceniyOsiZ[]={"ïåðåìåùåíèÿ îñè z "},sVolt[]={"Âîëüò "},sManitor[]={"Ìàíèòîð "},sVhodnih[]={"âõîäíûõ "},
sSignalov[]={"ñèãíàëîâ "},sSignal[]={"ñèãíàë "},sOsZ[]={"Îñü Z "},sPredel[]={"ïðåäåë "},sVerhnii[]={"âåðõíèé "},sNijnii[]={"íèæíèé "},sUporRezaka[]={"óïîð ðåçàêà "},sPlazma[]={"ïëàçìà "},\
sStep_X[]={"STEP X"},sStep_Y[]={"STEP Y"},sEnable[]={"ENEBLE"},sEst[]={"ÅÑÒÜ "},sNet[]={"ÍÅÒ "},sTrebuemoe[]={"Òðåáóåìîå "},sTekushee[]={"Òóêóùåå "};
void peredachaKomandyDispley(char komandaV_Displei);
void dvijenie(char napravlenie);
char rejimRabotiOchistki,rejimRabotiProkola;
signed char rejimMenu=0,flagIM_V_Rabote=0,napravlenieOciZ;
unsigned char flagRabocheiDugi,flagZahcitiOtPadeniy=3,flagMetallnaiden,rejimRaboti=0,flagProduvka=0;
unsigned int trebuemoeNapryjenie,tekuhceeNapryjenie,pologenieOsiZMm,skorostDvijeniyOsiZ;
ISR(TIMER0_OVF_vect)
{
	odnaMilisicunda++;
	if(odnaMilisicunda%200==0)flagZahcitiOtPadeniy=3;
}
ISR(TIMER3_OVF_vect)
{
	perepolnenieTimer3+=256;
}
ISR(TIMER3_CAPT_vect)
{
	static unsigned long  filtr=0;
	static unsigned int caunt=0;
	TCNT3=0;filtr+=ICR3+perepolnenieTimer3; perepolnenieTimer3=0;caunt++;
	if(filtr>500){ chastotaNapryjenie=filtr/caunt;filtr=0;caunt=0;}
	
}
ISR(TIMER2_COMP_vect)
{	
	
	PORTD^=(1<<1); polojenieOsiZ_Hag+=napravlenieOciZ;
		 
}
ISR(INT2_vect)
{
	flagZahcitiOtPadeniy&=~(1<<0);
}
ISR(INT3_vect)
{
	flagZahcitiOtPadeniy&=~(1<<1);
}

void cifra1PriemZnacheniy(long znachenie)
{
	asm("WDR");
	unsigned char mass[7]={0},razryd=0;
	mass[0]=0x30;
	for(int i=0;i<7;i++)
	{
		cifra1[i]=0;
	}
	cifra1[5]=0x20;
	cifra1[4]=(znachenie%10)+0x30;
	cifra1[3]=(znachenie%100)/10+0x30;
	cifra1[2]=(znachenie%1000)/100+0x30;
	cifra1[1]=(znachenie%10000)/1000+0x30;
	cifra1[0]=(znachenie%100000)/10000+0x30;
	
	if(cifra1[0]==0x30)
	for (int i=0;i<7;i++)
	{
		if(cifra1[i]!=0x30||i==4)
		{
			while(cifra1[i]!=0)
			{
				mass[razryd]=cifra1[i];i++;razryd++;
			}
			i=7;razryd=0;
			while(cifra1[razryd]!=0)
			{
				cifra1[razryd]=mass[razryd];razryd++;
			}
		}
	}
}
void cifra2PriemZnacheniy(unsigned int znachenie)
{
	asm("WDR");
	unsigned char mass[7]={0},razryd=0;
	mass[0]=0x30;
	for(int i=0;i<7;i++)
	{
		cifra2[i]=0;
	}
	cifra2[5]=0x20;
	cifra2[4]=(znachenie%10)+0x30;
	cifra2[3]=(znachenie%100)/10+0x30;
	cifra2[2]=(znachenie%1000)/100+0x30;
	cifra2[1]=(znachenie%10000)/1000+0x30;
	cifra2[0]=(znachenie%100000)/10000+0x30;
	
	if(cifra2[0]==0x30)
	for (int i=0;i<7;i++)
	{
		if(cifra2[i]!=0x30||i==4)
		{
			while(cifra2[i]!=0)
			{
				mass[razryd]=cifra2[i];i++;razryd++;
			}
			i=7;razryd=0;
			while(cifra2[razryd]!=0)
			{
				cifra2[razryd]=mass[razryd];razryd++;
			}
		}
	}
}
void cifraFloat1PriemZnacheniy(unsigned int znachenie)
{
	
	cifraFloat1[5]=0x20;
	cifraFloat1[4]=znachenie%10+0x30;
	cifraFloat1[3]=0x2e;
	cifraFloat1[2]=(znachenie%100)/10+0x30;
	cifraFloat1[1]=(znachenie%1000)/100+0x30;
	cifraFloat1[0]=(znachenie%10000)/1000+0x30;
}
void cifraFloat2PriemZnacheniy(unsigned int znachenie)
{
	
	cifraFloat2[5]=0x20;
	cifraFloat2[4]=znachenie%10+0x30;
	cifraFloat2[3]=0x2e;
	cifraFloat2[2]=(znachenie%100)/10+0x30;
	cifraFloat2[1]=(znachenie%1000)/100+0x30;
	cifraFloat2[0]=(znachenie%10000)/1000+0x30;
}
void ochistkaDispley()
{
	PORTB&=~(1<<5)&~(1<<6);
	peredachaKomandyDispley(0b00000001);
}
void ustanovkaAdresa(char aktivnyiAdresDispley)
{
	sei();
	peredachaKomandyDispley(aktivnyiAdresDispley|=(1<<7));
	
}
void viborStraniciZnakogeneratora(char stranicaZnakogeneratora)
{
	sei();
	PORTB&=~(1<<5)&~(1<<6);
	if(stranicaZnakogeneratora==1)peredachaKomandyDispley(0b00101010);
	else peredachaKomandyDispley(0b00101000);
	stranica=2;
}
void chtenieBaitaZanytosti()
{
	
	flagZanytAndAdres=0b10000000;
	DDRB=0b01110000;
	PORTB&=~(1<<6);PORTB|=(1<<5);
	PAUZA(1);
	for(signed char i=4;i>-1;i-=4)
	{
		if(i==0)
		PAUZA(1);
		PORTB|=(1<<4);
		PAUZA(1);
		flagZanytAndAdres|=((PINB&(1<<3))<<(0+i))|((PINB&(1<<2))<<(1+i))|((PINB&(1<<1))<<(2+i));
		if((PINB&(1<<0))==0&&i==4)flagZanytAndAdres&=~(1<<7);
		if(i==0)flagZanytAndAdres|=((PINB&(1<<0))<<3);
		PAUZA(1);
		PORTB&=~(1<<4);
	}
	DDRB=0b01111111;
	PORTB&=~(1<<5);
	tekuhciiAdres=flagZanytAndAdres;tekuhciiAdres&=~(1<<7);
}
void peredachaKomandyDispley(char komandaV_Displei)
{
	asm("WDR");
	if(peredachaPolubaitaV_Displey==0)
	do{chtenieBaitaZanytosti();}while(flagZanytAndAdres&(1<<7));
	PORTB&=~(1<<6)&~(1<<5);
	PAUZA(5);
	
	for(signed char bit=4;bit>-1;bit-=4)
	{
		PORTB|=(1<<4);
		PAUZA(5);
		if(komandaV_Displei&(1<<(0+bit)))
		PORTB|=(1<<3);
		if(komandaV_Displei&(1<<(1+bit)))
		PORTB|=(1<<2);
		if(komandaV_Displei&(1<<(2+bit)))
		PORTB|=(1<<1);
		if(komandaV_Displei&(1<<(3+bit)))
		PORTB|=(1<<0);
		PAUZA(5);
		PORTB&=~(1<<4);
		PAUZA(5);
		PORTB&=~(1<<0)&~(1<<1)&~(1<<2)&~(1<<3);
		if(peredachaPolubaitaV_Displey==1)
		bit=-4;
	}
	
}
void peredachaBukviV_displey( char peredavaemayBukvaV_Displei)
{
	asm("WDR");
	do {chtenieBaitaZanytosti();}while(flagZanytAndAdres&(1<<7));
	PORTB|=(1<<6);PORTB&=~(1<<5);
	PAUZA(5);
	
	for(signed char bit=4;bit>-1;bit-=4)
	{
		PORTB|=(1<<4);
		PAUZA(5);
		if(peredavaemayBukvaV_Displei&(1<<(0+bit)))
		PORTB|=(1<<3);
		if(peredavaemayBukvaV_Displei&(1<<(1+bit)))
		PORTB|=(1<<2);
		if(peredavaemayBukvaV_Displei&(1<<(2+bit)))
		PORTB|=(1<<1);
		if(peredavaemayBukvaV_Displei&(1<<(3+bit)))
		PORTB|=(1<<0);
		PAUZA(5);
		PORTB&=~(1<<4);
		PAUZA(5);
		PORTB&=~(1<<0)&~(1<<1)&~(1<<2)&~(1<<3);
	}
	
}
char peredachaSlovaV_Displei(unsigned char *slovo,char peredavaemayBukva)
{
	wdt_reset();
	char bukva=1,summaBukv=0;
	while(peredavaemayBukva<17&&bukva>0)
	{	bukva=*(slovo+peredavaemayBukva);
		if(bukva!=0)
		{peredachaBukviV_displey(bukva);summaBukv++;}
		peredavaemayBukva++;
	}
	return (summaBukv);
}
void peredachaStrokV_Displei(char adresVerhStroki,char adresNijStroki,char flagBeguhceiStroki1,char flagBeguhceiStroki2)
{
	static char nomerSlova1=0,nomerSlova2,pervoeSlovoStroki1,pervoeSlovoStroki2,pervayBukvaStroki1=0,pervayBukvaStroki2,nomerBukvi1,nomerBukvi2,zaderjka1Str=0,zaderjka2Str=0;
	char summaBukv=0;	static unsigned char *pervoeSlovo1=NULL,*pervoeSlovo2=NULL;
	asm("WDR");
	ochistkaDispley();
	ustanovkaAdresa(adresVerhStroki);
	//ñäåñü íà÷èíàåì ñ ïåðâîé áóêâû åñëè ñòðîêà èçìåíèëàñü èëè ôëàã áåãóùåé ñòðîêè íå óñòàíîâëåí
	if(pervoeSlovo1!=verhnyyStrokaV_Displei[0]||flagBeguhceiStroki1==0||flagSbrosaPeredachiV_Displei==1){pervoeSlovoStroki1=0;pervayBukvaStroki1=0;zaderjka1Str=0;}
	pervoeSlovo1=verhnyyStrokaV_Displei[0];nomerSlova1=pervoeSlovoStroki1;nomerBukvi1=pervayBukvaStroki1;
	while (*(verhnyyStrokaV_Displei+nomerSlova1)!=NULL&&summaBukv<30)
	{
		summaBukv+=peredachaSlovaV_Displei(*(verhnyyStrokaV_Displei+nomerSlova1),nomerBukvi1);
		nomerSlova1++;nomerBukvi1=0;
	}
	if(zaderjka1Str<5)zaderjka1Str++;if(zaderjka1Str==5)pervayBukvaStroki1++;//çàäåðæêà ïåðâîé áóêâû â íà÷àëå ñòðîêè à çàòåì äåëàåì ïåðâîé ñëåäóþùóþ áóêâó
	if(*(*(verhnyyStrokaV_Displei+pervoeSlovoStroki1)+pervayBukvaStroki1)==0){pervoeSlovoStroki1++;pervayBukvaStroki1=0;}//ñëåäóþùåå ñëåäóþùåå ñëîâî ïåðâûì ïðè âûâîäå
	if(summaBukv<18&&zaderjka1Str<10)zaderjka1Str++;   //çàäåðæêà â êîíöå ñòðîêè
	if(zaderjka1Str==10){pervoeSlovoStroki1=0;pervayBukvaStroki1=0;zaderjka1Str=0;}//ïåðåõîä â íà÷àëî ñòðîêè åñëè  âñÿ ñòðîêà ïðîøëà
	summaBukv=0;
	ustanovkaAdresa(adresNijStroki);
	if(pervoeSlovo2!=nijnyyStrokaV_Displei[0]||flagBeguhceiStroki2==0||flagSbrosaPeredachiV_Displei==1){pervoeSlovoStroki2=0;pervayBukvaStroki2=0;zaderjka2Str=0;}
	pervoeSlovo2=nijnyyStrokaV_Displei[0];nomerSlova2=pervoeSlovoStroki2;nomerBukvi2=pervayBukvaStroki2;
	while (*(nijnyyStrokaV_Displei+nomerSlova2)!=NULL&&summaBukv<21)
	{
		summaBukv+=peredachaSlovaV_Displei(*(nijnyyStrokaV_Displei+nomerSlova2),nomerBukvi2);
		nomerSlova2++;nomerBukvi2=0;
	}
	if(zaderjka2Str<3)zaderjka2Str++;if(zaderjka2Str==3)pervayBukvaStroki2++;
	if(*(*(nijnyyStrokaV_Displei+pervoeSlovoStroki2)+pervayBukvaStroki2)==0){pervoeSlovoStroki2++;pervayBukvaStroki2=0;zaderjka2Str=0;}
	if(summaBukv<15){pervoeSlovoStroki2=0;pervayBukvaStroki2=0;}
	flagSbrosaPeredachiV_Displei=0;
}
void initDisplei()
{
	odnaMilisicunda=0;
	flagZanytAndAdres|=(1<<7);
	while(odnaMilisicunda<50)
	{
		sei();
	}
	
	peredachaKomandyDispley(0b00110000);
	while(odnaMilisicunda<55)
	{
		sei();
	}
	peredachaKomandyDispley(0b00110000);
	while(odnaMilisicunda<60)
	{
		sei();
	}
	peredachaKomandyDispley(0b00110000);
	while(odnaMilisicunda<65)
	{
		sei();
	}
	peredachaKomandyDispley(0b00100000);
	peredachaPolubaitaV_Displey=0;
	peredachaKomandyDispley(0b00101000);
	peredachaKomandyDispley(0b00001000);
	peredachaKomandyDispley(0b00000001);
	peredachaKomandyDispley(0b00000110);
	peredachaKomandyDispley(0b00001100);
	ochistkaDispley();
	viborStraniciZnakogeneratora(1);

}
char oprosKlaviaturi()
{
	char nomerOprosKnopka=0,rezultOprosa=0;
	for(int i=0;i<6;i++)
	{
		PORTC|=(1<<nomerOprosKnopka);
		nomerOprosKnopka++;if(nomerOprosKnopka==5)nomerOprosKnopka=0;
		PORTC&=~(1<<nomerOprosKnopka);
		PAUZA(10);
		if(~PINC&(1<<5)){rezultOprosa=1+nomerOprosKnopka*4;}
		if(~PINC&(1<<6)){rezultOprosa=2+nomerOprosKnopka*4;}
		if(~PINC&(1<<7)){rezultOprosa=3+nomerOprosKnopka*4;}
		if(~PING&(1<<2)){rezultOprosa=4+nomerOprosKnopka*4;}
	}
	return(rezultOprosa);
}
void prinytieDannihKlaviaturi()
{
	asm("WDR");
	static char nomerVvodimogoRazryda,prejniiRezult;
	rezultOprosaKlaviaturi=oprosKlaviaturi();
	if(prejniiRezult==ESC)
	{rezultOprosaKlaviaturi=0;vvodimoeChislo=0;nomerVvodimogoRazryda=0;}
	
	if(rezultOprosaKlaviaturi==0&&prejniiRezult!=0)
	{	 vvedennieComandi[4]=0;
		switch(prejniiRezult)
		{
			case 8:case 6:case 7:case 12:case 10:case 11:case 16:case 14:case 15:case 19:
			vvodimoeChislo*=10;nomerVvodimogoRazryda++;break;
		}
		switch(prejniiRezult)
		{
			case 4:vvedennieComandi[0]=F1;break;
			case 3:vvedennieComandi[0]=F2;break;
			case 2:vvedennieComandi[1]=REHCOTKA;break;
			case 1:vvedennieComandi[1]=ZVEZDA;break;
			case 8:vvodimoeChislo+=1;break;
			case 7:vvodimoeChislo+=2;break;
			case 6:vvodimoeChislo+=3;break;
			case 5:vvedennieComandi[2]=STRELKAVERH;break;
			case 12:vvodimoeChislo+=4;break;
			case 11:vvodimoeChislo+=5;break;
			case 10:vvodimoeChislo+=6;break;
			case 9:vvedennieComandi[2]=STRELKANIZ;break;
			case 16:vvodimoeChislo+=7;break;
			case 15:vvodimoeChislo+=8;break;
			case 14:vvodimoeChislo+=9;break;
			case 20:vvedennieComandi[3]=STRELKALEVO;break;
			case 19:vvodimoeChislo+=0;break;
			case 18:vvedennieComandi[3]=STRELKAPRAVO;break;
			case 17:vvedennieComandi[4]=ENTER;break;
		}
	}
	if(vvedennieComandi[4]==ENTER&&vvodimoeChislo!=0)
	{nomerVvodimogoRazryda=0;vvedennoeChislo=vvodimoeChislo;vvodimoeChislo=0;}
	
	prejniiRezult=rezultOprosaKlaviaturi; //rezultOprosaKlaviaturi=0;
}
void menu()
{
	WR
	static unsigned int kontrolUstanovkaVisotiRezaMm,kontrolUstanovkaVisotiProkolaMm,kontrolUstSkorRegVisoti,kontrolUstanovkaVremeniProkola,
	kontrolUstanovkaOtnohenieMM_Hag,kontrolUstanovkaTochnostiOciZ,kontrolustanovkaNapryjenieMetallNaiden,kontrolUstanovkaSkorostiPeremehceniyOsiZ,
	kontrolUstanovkaNapryjenieUpora;
	static char rejimUpravleniyIM,rejimManitorSignalov, adresVerhStr=0,adresNijStr=0x40,flagVerhBegStr=0,flagNijnBegStr=0;
	if(flagIM_V_Rabote==0&&rejimManitorSignalov==0)
	{
		if(vvedennieComandi[3]==STRELKAPRAVO&&rejimMenu<12){vvedennieComandi[3]=0;rejimMenu++;if(rejimMenu>3&&rejimMenu<9)vvodimoeChislo=0;}
	    if(vvedennieComandi[3]==STRELKALEVO){if(rejimMenu>0){rejimMenu--;if(rejimMenu>3&&rejimMenu<9)vvodimoeChislo=0;}else rejimMenu=11;  }	
			vvedennieComandi[3]=0;
	}

	if(rejimMenu!=0&&rejimMenu!=7&&rejimMenu!=9)adresNijStr=0x45;else adresNijStr=0x40;	
	switch(rejimMenu)
	{
		case 0:verhnyyStrokaV_Displei[0]=sTekushee;cifra1PriemZnacheniy(tekuhceeNapryjenie);verhnyyStrokaV_Displei[1]=cifra1;verhnyyStrokaV_Displei[2]=sNapryjenie;
		nijnyyStrokaV_Displei[0]=sTrebuemoe;cifra2PriemZnacheniy(trebuemoeNapryjenie);nijnyyStrokaV_Displei[1]=cifra2;nijnyyStrokaV_Displei[2]=sNapryjenie;flagVerhBegStr=1;
		flagNijnBegStr=1;
		if(odnaMilisicunda%10==0){odnaMilisicunda+=1;if(rezultOprosaKlaviaturi==STRELKAVERH)trebuemoeNapryjenie++;if(rezultOprosaKlaviaturi==STRELKANIZ)trebuemoeNapryjenie--;}
		break;
		
		case 1:
		if(odnaMilisicunda%300==0) 
		{ odnaMilisicunda+=1;
		if(rezultOprosaKlaviaturi==STRELKAVERH&&ustanovkaVisotiProkolaMm<200)ustanovkaVisotiProkolaMm++;if(rezultOprosaKlaviaturi==STRELKANIZ&&ustanovkaVisotiProkolaMm>0)ustanovkaVisotiProkolaMm--;}
		vvedennieComandi[2]=0;verhnyyStrokaV_Displei[0]=sUstanovite;verhnyyStrokaV_Displei[1]=sVisotu;verhnyyStrokaV_Displei[2]=sProkola;cifraFloat1PriemZnacheniy(ustanovkaVisotiProkolaMm);
		nijnyyStrokaV_Displei[0]=cifraFloat1;nijnyyStrokaV_Displei[1]=sMm;flagVerhBegStr=1;  break;
		
		case 2:
		if(odnaMilisicunda%300==0) 
		{ odnaMilisicunda+=1;
		if(rezultOprosaKlaviaturi==STRELKAVERH&&ustanovkaVisotiRezaMm<200)ustanovkaVisotiRezaMm++;
		if(rezultOprosaKlaviaturi==STRELKANIZ&&ustanovkaVisotiRezaMm>0)ustanovkaVisotiRezaMm--;
		}
		vvedennieComandi[2]=0;verhnyyStrokaV_Displei[0]=sUstanovite;verhnyyStrokaV_Displei[1]=sVisotu;verhnyyStrokaV_Displei[2]=sDugi;
		verhnyyStrokaV_Displei[3]=sReza;cifraFloat1PriemZnacheniy(ustanovkaVisotiRezaMm);nijnyyStrokaV_Displei[0]=cifraFloat1;nijnyyStrokaV_Displei[1]=sMm;
		flagVerhBegStr=1;
		break;
		
		case 3:
		if(odnaMilisicunda%300==0)
		 { odnaMilisicunda+=1;
		if(rezultOprosaKlaviaturi==STRELKAVERH&&ustanjvkaSkorostiRegVisoti<254)ustanjvkaSkorostiRegVisoti++;
		if(rezultOprosaKlaviaturi==STRELKANIZ&&ustanjvkaSkorostiRegVisoti>3)ustanjvkaSkorostiRegVisoti--;}
		verhnyyStrokaV_Displei[0]=sUstanovka;verhnyyStrokaV_Displei[1]=sSkorosti;verhnyyStrokaV_Displei[2]=sRegulirovki;verhnyyStrokaV_Displei[3]=sVisoti;
		verhnyyStrokaV_Displei[4]=sDugi;adresVerhStr=0;cifra2PriemZnacheniy(ustanjvkaSkorostiRegVisoti);nijnyyStrokaV_Displei[0]=cifra2;flagVerhBegStr=1;break;
		
		case 4:if(odnaMilisicunda%100==0) 
		if(vvodimoeChislo>0)ustanovkaVremeniProkola=vvodimoeChislo;
		verhnyyStrokaV_Displei[0]=sUstanovite;verhnyyStrokaV_Displei[1]=sVremy;verhnyyStrokaV_Displei[2]=sProkola;cifra1PriemZnacheniy(ustanovkaVremeniProkola);
		nijnyyStrokaV_Displei[0]=cifra1;nijnyyStrokaV_Displei[1]=sMs; flagVerhBegStr=1;  break;
		case 5:if(vvodimoeChislo>0)ustanovkaOtnohenieMM_Hag=vvodimoeChislo;
			 verhnyyStrokaV_Displei[0]=sUstanovite;verhnyyStrokaV_Displei[1]=sOtnohenie;verhnyyStrokaV_Displei[2]=sHag_Mm;cifra1PriemZnacheniy(ustanovkaOtnohenieMM_Hag);
		nijnyyStrokaV_Displei[0]=cifra1;flagVerhBegStr=1;  break;
		case 6:if(odnaMilisicunda%100==0) 
		if(vvodimoeChislo>0)ustanovkaTochnostiOciZ=vvodimoeChislo;
		verhnyyStrokaV_Displei[0]=sUstanovka;verhnyyStrokaV_Displei[1]=sTochnosti;verhnyyStrokaV_Displei[2]=sRegulirovki;verhnyyStrokaV_Displei[3]=sVisoti;
		verhnyyStrokaV_Displei[4]=sDugi;adresVerhStr=0;cifra2PriemZnacheniy(ustanovkaTochnostiOciZ);nijnyyStrokaV_Displei[0]=cifra2;nijnyyStrokaV_Displei[1]=sVolt;
		flagVerhBegStr=1;break;
		case 7:if(vvodimoeChislo>0)ustanovkaNapryjenieMetallNaiden=vvodimoeChislo;
		verhnyyStrokaV_Displei[0]=sUstanovka;verhnyyStrokaV_Displei[1]=sNapryjenie;verhnyyStrokaV_Displei[2]=sMetallNaiden;
	   cifra2PriemZnacheniy(ustanovkaNapryjenieMetallNaiden);cifra1PriemZnacheniy(tekuhceeNapryjenie);nijnyyStrokaV_Displei[0]=cifra1;
		nijnyyStrokaV_Displei[1]=sVolt; nijnyyStrokaV_Displei[2]=cifra2; adresVerhStr=0;flagVerhBegStr=1;flagNijnBegStr=1;break;
		case 8:if(vvodimoeChislo>0)ustanovkaNapryjenieUpora=vvodimoeChislo;
		verhnyyStrokaV_Displei[0]=sUstanovka;verhnyyStrokaV_Displei[1]=sNapryjenie;verhnyyStrokaV_Displei[2]=sUporRezaka;
		cifra2PriemZnacheniy(ustanovkaNapryjenieUpora);cifra1PriemZnacheniy(tekuhceeNapryjenie);
		nijnyyStrokaV_Displei[0]=cifra1;nijnyyStrokaV_Displei[1]=sVolt;nijnyyStrokaV_Displei[2]=cifra2; adresVerhStr=0;adresNijStr=0x40;
		flagVerhBegStr=1;flagNijnBegStr=1;break;
		
		case 9:if(odnaMilisicunda%300==0) {	 odnaMilisicunda+=1;
			if(rezultOprosaKlaviaturi==STRELKAVERH&&ustanovkaSkorostiPeremehceniyOsiZ<254)ustanovkaSkorostiPeremehceniyOsiZ++;
		if(rezultOprosaKlaviaturi==STRELKANIZ&&ustanovkaSkorostiPeremehceniyOsiZ>3)ustanovkaSkorostiPeremehceniyOsiZ--;}
		verhnyyStrokaV_Displei[0]=sUstanovka;verhnyyStrokaV_Displei[1]=sSkorosti;verhnyyStrokaV_Displei[2]=sPeremehceniyOsiZ;
		cifra2PriemZnacheniy(ustanovkaSkorostiPeremehceniyOsiZ);nijnyyStrokaV_Displei[0]=cifra2;adresVerhStr=0;adresNijStr=0x43;flagVerhBegStr=1;break;
		
		case 10: // Ðåæèì ÈÌ
		       adresNijStr=0x40;
			   if(flagIM_V_Rabote==0)
			   {
			   verhnyyStrokaV_Displei[0]=sUpravlenieIM;nijnyyStrokaV_Displei[0]=sDlyVhodaNajmite;nijnyyStrokaV_Displei[1]=sEnter; flagNijnBegStr=1;
			   if(vvedennieComandi[4]==ENTER){flagIM_V_Rabote=1;vvedennieComandi[4]=0;flagSbrosaPeredachiV_Displei=1;}
			   }
			   if(flagIM_V_Rabote==1)
			   {
		       if(vvedennieComandi[3]==STRELKAPRAVO&&rejimUpravleniyIM<2){rejimUpravleniyIM++;flagSbrosaPeredachiV_Displei=1; }
		       if(vvedennieComandi[3]==STRELKALEVO&&rejimUpravleniyIM>0){rejimUpravleniyIM--;flagSbrosaPeredachiV_Displei=1; }
			   	vvedennieComandi[3]=0;
			   if(vvedennieComandi[4]==ENTER){flagIM_V_Rabote=2;vvedennieComandi[4]=0;flagSbrosaPeredachiV_Displei=1;}
			   if(rezultOprosaKlaviaturi==ESC)flagIM_V_Rabote=0;   
			   switch(rejimUpravleniyIM)
			   {
				   case 0:verhnyyStrokaV_Displei[1]=sPlasmorezom; break;
				   case 1:verhnyyStrokaV_Displei[1]=sTNC_On;break;
				   case 2:verhnyyStrokaV_Displei[1]=sDvijenieOsiZ;break;
			   }
			   verhnyyStrokaV_Displei[0]=sUpravlenie;nijnyyStrokaV_Displei[0]=sDlyVhodaNajmite;nijnyyStrokaV_Displei[1]=sEnter; flagVerhBegStr=1;flagNijnBegStr=1;
			   }
			   if(flagIM_V_Rabote==2)
			   {
				    verhnyyStrokaV_Displei[0]=sUpravlenie;verhnyyStrokaV_Displei[2]=sStrelkami;verhnyyStrokaV_Displei[3]=sV_Verh;
					verhnyyStrokaV_Displei[4]=sV_Niz; flagVerhBegStr=1; flagNijnBegStr=1; adresNijStr=0x43;
				switch(rejimUpravleniyIM)
				{
					case 0:verhnyyStrokaV_Displei[1]=sPlasmorezom;
					if(vvedennieComandi[2]==STRELKAVERH){VKLUCHIT_PLAZMU;}if(PINE&(1<<5))nijnyyStrokaV_Displei[0]=sVklycheno;else	nijnyyStrokaV_Displei[0]=sViklycheno;
					if(vvedennieComandi[2]==STRELKANIZ){OTKLUCHIT_PLAZMU;} break;
					case 1:verhnyyStrokaV_Displei[1]=sTNC_On;
					if(vvedennieComandi[2]==STRELKAVERH){TNC_ON;}if(PINE&(1<<0))nijnyyStrokaV_Displei[0]=sVklycheno;else nijnyyStrokaV_Displei[0]=sViklycheno; 
					if(vvedennieComandi[2]==STRELKANIZ){TNC_OF;} break;
					case 2:verhnyyStrokaV_Displei[1]=sDvijenieOsiZ;
					if(rezultOprosaKlaviaturi==STRELKAVERH){dvijenie(1);nijnyyStrokaV_Displei[0]=sV_Verh;}
					if(rezultOprosaKlaviaturi==STRELKANIZ){dvijenie(2);nijnyyStrokaV_Displei[0]=sV_Niz;}
					if(rezultOprosaKlaviaturi!=STRELKAVERH&&rezultOprosaKlaviaturi!=STRELKANIZ)
					{dvijenie(0);nijnyyStrokaV_Displei[0]=sStop; }
						 
					cifraFloat1PriemZnacheniy(pologenieOsiZMm);nijnyyStrokaV_Displei[1]=cifraFloat1;nijnyyStrokaV_Displei[2]=sMm;
					if(rezultOprosaKlaviaturi==ZVEZDA)polojenieOsiZ_Hag=0; break;		
				}
				  if(rezultOprosaKlaviaturi==ESC){flagIM_V_Rabote=0;OTKLUCHIT_PLAZMU;TNC_OF;dvijenie(0);} 
			   }
		break;
		case 11:if(rejimManitorSignalov>0) //Ìàíèòîð âõîäîâ
		{
			if(vvedennieComandi[3]==STRELKAPRAVO&&rejimManitorSignalov<7){rejimManitorSignalov++;vvedennieComandi[3]=0;}
			if(vvedennieComandi[3]==STRELKALEVO&&rejimManitorSignalov>1){rejimManitorSignalov--;vvedennieComandi[3]=0;}
			if(rezultOprosaKlaviaturi==ESC){rejimManitorSignalov=0;vvedennieComandi[4]=0;}
			flagNijnBegStr=0;adresNijStr=0x45;		
		}
			else {flagVerhBegStr=1; flagNijnBegStr=1;adresNijStr=0x40; }
		   switch(rejimManitorSignalov)
		   {
			   case 0:verhnyyStrokaV_Displei[0]=sManitor;verhnyyStrokaV_Displei[1]=sVhodnih;verhnyyStrokaV_Displei[2]=sSignalov; 
			   nijnyyStrokaV_Displei[0]=sDlyVhodaNajmite;nijnyyStrokaV_Displei[1]=sEnter;if(vvedennieComandi[4]==ENTER){rejimManitorSignalov=1;vvedennieComandi[4]=0;}
			   break;
			   case 1:verhnyyStrokaV_Displei[0]=sOsZ;verhnyyStrokaV_Displei[1]=sVerhnii;verhnyyStrokaV_Displei[2]=sPredel;
			   if(EST_VERH_PREDEL) nijnyyStrokaV_Displei[0]=sEst;else nijnyyStrokaV_Displei[0]=sNet; break;
			   case 2:verhnyyStrokaV_Displei[0]=sOsZ;verhnyyStrokaV_Displei[1]=sNijnii;verhnyyStrokaV_Displei[2]=sPredel;
			   if(EST_NIZ_PREDEL)nijnyyStrokaV_Displei[0]=sEst;else nijnyyStrokaV_Displei[0]=sNet;break;
			   case 3:verhnyyStrokaV_Displei[0]=sOsZ;verhnyyStrokaV_Displei[1]=sUporRezaka;
			   if(EST_UPOR_Z)nijnyyStrokaV_Displei[0]=sEst;else nijnyyStrokaV_Displei[0]=sNet;break;
			   case 4:verhnyyStrokaV_Displei[0]=sSignal;verhnyyStrokaV_Displei[1]=sPlazma;
			   if(flagRabocheiDugi==0)nijnyyStrokaV_Displei[0]=sNet;else nijnyyStrokaV_Displei[0]=sEst;break;
			   case 5:verhnyyStrokaV_Displei[0]=sSignal;verhnyyStrokaV_Displei[1]=sStep_X;
			   if(flagZahcitiOtPadeniy&(1<<0))nijnyyStrokaV_Displei[0]=sNet;else nijnyyStrokaV_Displei[0]=sEst;break;
			   case 6:verhnyyStrokaV_Displei[0]=sSignal;verhnyyStrokaV_Displei[1]=sStep_Y;
			   if(flagZahcitiOtPadeniy&(1<<1))nijnyyStrokaV_Displei[0]=sNet;else nijnyyStrokaV_Displei[0]=sEst;break;
			   case 7:verhnyyStrokaV_Displei[0]=sSignal;verhnyyStrokaV_Displei[1]=sEnable;
			   if(EST_ENEBLE)nijnyyStrokaV_Displei[0]=sEst;else nijnyyStrokaV_Displei[0]=sNet;break;
		   }
		break;	
		default:rejimMenu=0;break;
	}
	WR
	if(rejimMenu!=1&&kontrolUstanovkaVisotiProkolaMm!=ustanovkaVisotiProkolaMm)
	{eeprom_update_word(&eeustanovkaVisotiProkolaMm,ustanovkaVisotiProkolaMm);kontrolUstanovkaVisotiProkolaMm=ustanovkaVisotiProkolaMm;}
	if(rejimMenu!=2&&kontrolUstanovkaVisotiRezaMm!=ustanovkaVisotiRezaMm)
	{eeprom_update_word(&eeustanovkaVisotiRezaMm,ustanovkaVisotiRezaMm);kontrolUstanovkaVisotiRezaMm=ustanovkaVisotiRezaMm;}
	if(rejimMenu!=3&&kontrolUstSkorRegVisoti!=ustanjvkaSkorostiRegVisoti)
	{eeprom_update_word(&eeustanjvkaSkorostiRegVisoti,ustanjvkaSkorostiRegVisoti);kontrolUstSkorRegVisoti=ustanjvkaSkorostiRegVisoti;}
	if(rejimMenu!=4&&kontrolUstanovkaVremeniProkola!=ustanovkaVremeniProkola)
	{eeprom_update_word(&eeustanovkaVremeniProkola,ustanovkaVremeniProkola);kontrolUstanovkaVremeniProkola=ustanovkaVremeniProkola;}
	if(rejimMenu!=5&&kontrolUstanovkaOtnohenieMM_Hag!=ustanovkaOtnohenieMM_Hag)
	{eeprom_update_word(&eeustanovkaOtnohenieMM_Hag,ustanovkaOtnohenieMM_Hag);kontrolUstanovkaOtnohenieMM_Hag=ustanovkaOtnohenieMM_Hag;}
	if(rejimMenu!=6&&kontrolUstanovkaTochnostiOciZ!=ustanovkaTochnostiOciZ)
	{eeprom_update_word(&eeustanovkaTochnostiOciZ,ustanovkaTochnostiOciZ);kontrolUstanovkaTochnostiOciZ=ustanovkaTochnostiOciZ;}
	if(rejimMenu!=7&&kontrolustanovkaNapryjenieMetallNaiden!=ustanovkaNapryjenieMetallNaiden)
	{eeprom_update_word(&eeustanovkaNapryjenieMetallNaiden,ustanovkaNapryjenieMetallNaiden);kontrolustanovkaNapryjenieMetallNaiden=ustanovkaNapryjenieMetallNaiden;}
	if(rejimMenu!=8&&kontrolUstanovkaNapryjenieUpora!=ustanovkaNapryjenieUpora)
	{ eeprom_update_word(&eeustanovkaNapryjenieUpora,ustanovkaNapryjenieUpora);kontrolUstanovkaNapryjenieUpora=ustanovkaNapryjenieUpora;}
	if(rejimMenu!=9&&kontrolUstanovkaSkorostiPeremehceniyOsiZ!=ustanovkaSkorostiPeremehceniyOsiZ)
	{eeprom_update_word(&eeustanovkaSkorostiPeremehceniyOsiZ,ustanovkaSkorostiPeremehceniyOsiZ);kontrolUstanovkaSkorostiPeremehceniyOsiZ=ustanovkaSkorostiPeremehceniyOsiZ;}
		
	if(odnaMilisicunda%300>0&&odnaMilisicunda%300<2){peredachaStrokV_Displei(adresVerhStr,adresNijStr,flagVerhBegStr,flagNijnBegStr);OCHISTKA_VERH_STROKI OCHISTKA_NIJNEI_STROKI}  
	ustanovkaVisotiOchistki=ustanovkaVisotiProkolaMm+100;
}
void dvijenie(char napravlenie)
{
	WR
	OCR2=255-skorostDvijeniyOsiZ;
	switch(napravlenie)
	{
		case 0:TCCR2=0;break;
		case 1:if(EST_VERH_PREDEL)TCCR2=0; else{PORTD&=~(1<<0); TCCR2=0x0d;napravlenieOciZ=1;} break;
		case 2:if(EST_NIZ_PREDEL) TCCR2=0; else{PORTD|=(1<<0);TCCR2=0x0d;napravlenieOciZ=-1;} break;
	}
	
}
void chtenieIzEEPROM()
{
	WR
	ustanovkaVisotiProkolaMm=eeprom_read_word(&eeustanovkaVisotiProkolaMm);
	ustanovkaVisotiRezaMm=eeprom_read_word(&eeustanovkaVisotiRezaMm);
	ustanjvkaSkorostiRegVisoti=eeprom_read_word(&eeustanjvkaSkorostiRegVisoti);
	ustanovkaVremeniProkola=eeprom_read_word(&eeustanovkaVremeniProkola);
	ustanovkaOtnohenieMM_Hag=eeprom_read_word(&eeustanovkaOtnohenieMM_Hag);
	ustanovkaTochnostiOciZ=eeprom_read_word(&eeustanovkaTochnostiOciZ);
	ustanovkaNapryjenieMetallNaiden=eeprom_read_word(&eeustanovkaNapryjenieMetallNaiden);
	ustanovkaNapryjenieUpora=eeprom_read_word(&eeustanovkaNapryjenieUpora);
	ustanovkaSkorostiPeremehceniyOsiZ=eeprom_read_word(&eeustanovkaSkorostiPeremehceniyOsiZ);
}
void ochistkaMetalla()
{	
	
	WR 
	if(rejimRabotiOchistki==0)
	{
	if(pologenieOsiZMm<ustanovkaVisotiOchistki){KOMANDA_V_VERH;rejimRabotiOchistki=0;}
	if(pologenieOsiZMm>ustanovkaVisotiOchistki){KOMANDA_V_NIZ;rejimRabotiOchistki=0;}
	if(pologenieOsiZMm==ustanovkaVisotiOchistki){STOP;rejimRabotiOchistki=1;}
	}
	if(rejimRabotiOchistki==1){VKLUCHIT_PLAZMU;odnaMilisicunda=0;rejimRabotiOchistki=2;}
	if(rejimRabotiOchistki==2&&odnaMilisicunda>2000){OTKLUCHIT_PLAZMU;KOMANDA_V_VERH;polojenieOsiZ_Hag=0;pologenieOsiZMm=0;rejimRabotiOchistki=3;}	
	if(rejimRabotiOchistki==3&&pologenieOsiZMm>100){rejimRaboti=POISK_POVERHNOSTI;STOP;rejimRabotiOchistki=0;}	
}
void prokolMetalla()
{
	WR	 skorostDvijeniyOsiZ=ustanjvkaSkorostiRegVisoti;
	switch(rejimRabotiProkola)
	{
		case 0:if(pologenieOsiZMm<ustanovkaVisotiProkolaMm){KOMANDA_V_VERH;}
	           if(pologenieOsiZMm>ustanovkaVisotiProkolaMm){KOMANDA_V_NIZ;}
	           if(pologenieOsiZMm==ustanovkaVisotiProkolaMm){STOP;rejimRabotiProkola=1;}
		break;
		case 1:	VKLUCHIT_PLAZMU;odnaMilisicunda=0;rejimRabotiProkola=2;break;
		case 2:	if(flagRabocheiDugi==0&&odnaMilisicunda>2000){OTKLUCHIT_PLAZMU;rejimRabotiProkola=3;}
	            if(flagRabocheiDugi==1){rejimRabotiProkola=4;odnaMilisicunda=0;}
		break;
		case 3:if(odnaMilisicunda>4000){rejimRabotiProkola=0;}	break;
		case 4:	
				 skorostDvijeniyOsiZ=ustanovkaSkorostiPeremehceniyOsiZ;
		         if(pologenieOsiZMm<ustanovkaVisotiRezaMm)KOMANDA_V_VERH;
		         if(pologenieOsiZMm>ustanovkaVisotiRezaMm)KOMANDA_V_NIZ;
		         if(pologenieOsiZMm==ustanovkaVisotiRezaMm){STOP;rejimRabotiProkola=5;}	
		break;
		case 5:if(odnaMilisicunda>ustanovkaVremeniProkola)
		          {TNC_ON;rejimRaboti=IZMERENIE_NAPRYJENIY;odnaMilisicunda=0;rejimRabotiProkola=0;}	
		break;
					  	 
	}	
}
void izmerenieNapryjeniy()
{
	WR	skorostDvijeniyOsiZ=ustanjvkaSkorostiRegVisoti;
	if(flagRabocheiDugi==0)	{TNC_OF;rejimRaboti=POISK_POVERHNOSTI;}
	if(flagZahcitiOtPadeniy<3&&odnaMilisicunda>500&&flagRabocheiDugi==1){trebuemoeNapryjenie=tekuhceeNapryjenie;rejimRaboti=REZKA;}
		
}
void rezka()
{	
	if(flagRabocheiDugi==0)	{TNC_OF;rejimRaboti=POISK_POVERHNOSTI;}
	if(flagZahcitiOtPadeniy<3)
	{
		if(tekuhceeNapryjenie>trebuemoeNapryjenie+ustanovkaTochnostiOciZ){KOMANDA_V_NIZ;}
		if(tekuhceeNapryjenie<trebuemoeNapryjenie){KOMANDA_V_VERH;}
		if(tekuhceeNapryjenie>trebuemoeNapryjenie&&tekuhceeNapryjenie<trebuemoeNapryjenie+ustanovkaTochnostiOciZ){STOP;}	
	}
	
}
int main(void)
{
	TCCR0=0x04;TIMSK=0x81;
	TCCR3B=0xc2;ETIMSK=0x24;
	EIMSK=0x0c;EICRA=0xA0;//âêëþ÷àì âíåøíèå ïðåðûâàíèÿ  íà INT2-INT3
	DDRA=0b11111111;
	PORTA=0b00000000;
	DDRF=0b11111111;
	PORTF=0b00000000;
	DDRD=0b11110011;
	DDRE=0b00100011;
	PORTE=0b00011100;
	DDRG=0b00000011;
	PORTG=0b00000100;
	DDRC=0b00011111;
	PORTC=0b11100000;
	DDRB=0b01111111;
	wdt_enable(5);
	initDisplei();
	chtenieIzEEPROM();
	while(1)
	{ 	sei();WR 
		if(PINE&(1<<6))flagRabocheiDugi=0;else flagRabocheiDugi=1; pologenieOsiZMm=polojenieOsiZ_Hag/ustanovkaOtnohenieMM_Hag; tekuhceeNapryjenie=16000000/chastotaNapryjenie;
		if(flagIM_V_Rabote==0)
		{  
			if(EST_ENEBLE){if(rejimRaboti==NASTROIKA) rejimRaboti=POISK_POVERHNOSTI;}
		    else{rejimRaboti=NASTROIKA;OTKLUCHIT_PLAZMU;TNC_OF;rejimRabotiOchistki=0;rejimRabotiProkola=0;flagProduvka=0;
			   skorostDvijeniyOsiZ=ustanovkaSkorostiPeremehceniyOsiZ;if(EST_VERH_PREDEL)STOP;else KOMANDA_V_VERH;}
		}
		prinytieDannihKlaviaturi();menu();
		if((EST_UPOR_Z||ustanovkaNapryjenieUpora>tekuhceeNapryjenie)&&(rejimRaboti==REZKA||rejimRaboti==NASTROIKA)&&odnaMilisicunda>500)ESTOP; // Óñëè óïîð ðåçàêà   òî ñòîï
		else PORTE&=~(1<<1);		
		if (flagRabocheiDugi==0&&(rejimRaboti==IZMERENIE_NAPRYJENIY||rejimRaboti==REZKA))
		{TNC_OF;OTKLUCHIT_PLAZMU;rejimRabotiOchistki=0;rejimRabotiProkola=0;flagMetallnaiden=0;flagProduvka=0;rejimRaboti=POISK_POVERHNOSTI;}
		switch(rejimRaboti)
		{
			case NASTROIKA: OTKLUCHIT_PLAZMU;rejimRabotiOchistki=0;rejimRabotiProkola=0;flagMetallnaiden=0; break;
			case POISK_POVERHNOSTI:skorostDvijeniyOsiZ=ustanovkaSkorostiPeremehceniyOsiZ;
			   if(flagMetallnaiden==0)
			   {
				 if(tekuhceeNapryjenie>ustanovkaNapryjenieMetallNaiden)
			       {   
				   
				     if(EST_UPOR_Z){STOP;polojenieOsiZ_Hag=0;pologenieOsiZMm=0;rejimRaboti=OCHISTKA_METALLA;skorostDvijeniyOsiZ=ustanjvkaSkorostiRegVisoti;}
					 else { if(flagProduvka==0){flagProduvka=1;odnaMilisicunda=0;VKLUCHIT_PLAZMU;}if(flagProduvka==1&&odnaMilisicunda>100){OTKLUCHIT_PLAZMU;KOMANDA_V_NIZ;}}  
			       } 								 
				 else {STOP;flagMetallnaiden=1;odnaMilisicunda=0;flagProduvka=0;}
			   }
			  if(flagMetallnaiden==1&&odnaMilisicunda>1000)
			   { 
				 skorostDvijeniyOsiZ=ustanjvkaSkorostiRegVisoti;
				 if(tekuhceeNapryjenie>ustanovkaNapryjenieMetallNaiden)
				   {
				    polojenieOsiZ_Hag=0;pologenieOsiZMm=0;flagMetallnaiden=0;rejimRabotiProkola=0;rejimRaboti=PROKOL;
				   }
				 else KOMANDA_V_VERH; 
			   } 
				
			break;
			 case OCHISTKA_METALLA: ochistkaMetalla();break;
			 case PROKOL:prokolMetalla();break;
			 case IZMERENIE_NAPRYJENIY:izmerenieNapryjeniy();break;
			 case REZKA:rezka();break;
			 default: rejimRaboti=0;break;
		}
		
		
	}
}