/*
 * avtomat Bobr_M.c
 *
 * Created: 30.03.2016 18:11:06
 * Author : User
 */ 
#define F_CPU 8000000UL//установка частоты контроллера ATMEGA16 8Мгц
#include <avr/io.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include "twi.h"
#include "lcdtwi.h"
#include "lcd.h"
//#include "adc.h"
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <stdio.h>
#include <stdlib.h>
#define  BUTON_1 (PINC&1<<2)
#define BUTON_SAVE (PIND&1<<3)
#define btn_plus (PINC&1<<3)
#define btn_minus (PINC&1<<7)
#define NIZ       (PIND&1<<2)
#define menu_btn
#define menu_lcd

#define ADC_ON   ADCSRA|=(1<<ADEN)
#define ADC_OF  ADCSRA&=~(1<<ADEN)


#define FIRST_ADC_INPUT 0//деректива ввода первого вывода АЦП
#define LAST_ADC_INPUT 3//последнего вывода АЦП
#define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (0<<ADLAR))//деректива установки опорного напряжения оно установлено 5в
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];

volatile  unsigned int  r1,r2,r3,pauza=0,pauza1=0,pauza2=0,pauza_x=0,pauza_x1=0,pauza_z=0
                                                          ,a,b,c,d;// переменная для прерывания по кнопке
// volatile float result;
volatile unsigned char bit1=0,bit2=1,bit_finish=0,bit_adc_obriv=0,bit_adc_peregruz=0,bit6=0,bit_status=0,bit_status1=0,bit9=0,r,menu=0 ,E=0,n=0,k=0,
flag1=0,flag2=0,flag_obriv=0,flag_lcd_clr=0,flag_peregruz=0,flag6=0,flag7=0,flag8=0,flag9=0,flag_start=0,flag11=0;
struct  
{
	 char menu_btn;
	 char menu_lcd;
	 
	
}*nastroyki;
char buf1[10];
char buf2[10];
char buf3[10];
char buf4[10];
char buf5[10];
char buf6[10];
char buf7[10];
char buf8[10];


//-lprintf_flt
//uint16_t  save1 EEMEM;
//uint16_t save2  EEMEM;
//uint16_t  save3 EEMEM;
//uint16_t  save4 EEMEM;
ISR(TIMER0_COMP_vect)
{
	TCNT0=0;//счетный регистр
	pauza++;
	//asm("wdr");
	
	
	if (!(BUTON_1))
	{
		//asm("wdr");
		//bit8=0;
		pauza=0;
		
		
		pauza_z=0;
			flag2=0;
			
		pauza_x=0;
		flag1=1;
		
	}
	
	if (flag1==1&&BUTON_1&&pauza>10&&pauza<25)
	{
		
		
		
		
			flag2=0;
			
			flag1=0;
			//menu++;n++;
			
		nastroyki->menu_btn;
	     nastroyki->menu_lcd;
			menu++;
			
		
	}
	if (flag2==1&&BUTON_1&&pauza>25&&pauza<50)
	{
			flag2=0;
			
			flag1=0;
			menu=0;n=0;
		nastroyki->menu_btn=0;
		
	}

}


ISR(TIMER1_COMPB_vect)
{
	TCNT1H=0;
	TCNT1L=0;
		//	pauza_z=0;
		
	
}

ISR(TIMER2_COMP_vect)
{
	TCNT2=0;
		   //pauza_x++;
		   
			
	    if (!(PIND&1<<1))
	    {
		    flag11=1;
			//pauza_x=0;
			
		   pauza_x++;
		   
		    bit_adc_obriv=0;
		    flag_obriv=0;
	    }
	    if (flag11==1&&PIND&1<<1&&pauza_x>1&&pauza_x<300)
	    {
		    flag11=0;
		    bit_adc_obriv=1;
		    flag_obriv=1;
		    
		    

		    
		    
	    } 
	     
		
		
	   
}


ISR(ADC_vect)
{
	//char flag2=0;
	
	static unsigned char input_index=0;
	// Read the AD conversion result
	adc_data[input_index]=ADCW;
	// Select next ADC input
	if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
	input_index=0;
	ADMUX=(FIRST_ADC_INPUT | ADC_VREF_TYPE)+input_index;
	// Delay needed for the stabilization of the ADC input voltage
	_delay_us(10);
	// Start the AD conversion
	ADCSRA|=(1<<ADSC);
	 
}
void program_1(void)
 { 
	if (pauza>10)
	{
       flag_lcd_clr=1;
	}
	
	if (pauza>15)
	{
		
			flag_lcd_clr=0;
	            bit_adc_obriv=0; 
		      	flag_obriv=0;
		
	}
	if (pauza>20)
	{
			
			
		
	}
	
	   if (pauza>1900)
	{

		flag_start=1;
		
	   
		 
	}
	 if (pauza>2029)
	{
	  bit_adc_obriv=1; 
	  
	}
	 if (pauza>2030)
	 {
		 flag_start=0;
		 
	 }
	 
    
	if (flag_start==1)
	{
		PORTD|=(1<<5);
		
	}
	if (flag_start==0)
	{
		PORTD&=~(1<<5);
	}
	
}

void program_3(void)
{
	 if (pauza_z>1)
	   {
	
	   }
	   
	   if (pauza_z>200)
	    {
			  
			  PORTD&=~(1<<7);
			  DDRD&=~(1<<7);
		
	  }
	
}


void init_PORTS(void)
{
	DDRA|=(0<<0)|(0<<1)|(0<<2)|(0<<3)|(0<<4)|(0<<5)|(0<<6)|(0<<7);
	PORTA|=(0<<0)|(0<<1)|(0<<2)|(0<<3)|(0<<4)|(0<<5)|(0<<6)|(0<<7);
	DDRC|=(0<<0)|(0<<1)|(0<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(0<<7);//настройка порта D на вход "0" и на выход "1"
	PORTC|=(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7);//настройка порта D на вход "0" и на выход "1"
	
	DDRB|=0xFF;//
	PORTB|=0x00;//установка на  выводах портаB
	DDRD|=(0<<0)|(0<<0)|(0<<2)|(0<<3)|(1<<4)|(1<<5)|(0<<6)|(1<<7);//настройка порта D на вход "0" и на выход "1"
	PORTD|=(0<<0)|(1<<1)|(1<<2)|(1<<3)|(0<<4)|(0<<5)|(1<<6)|(0<<7);//установкана всех выводах порта D
}
void init_TIMERS(void)
{
	TCCR1B|=(1<<CS12)|(0<<CS11)|(1<<CS10);
	TCCR1A=0;
	TCNT1H=0;
	TCNT1L=0;
	OCR1B=250;
	TCCR2|=(1<<WGM20);
	
	TCCR2|=(1<<CS22)|(0<<CS21)|(1<<CS20);
	TCNT2=0;
	OCR2=254;
	
	TCCR0|=(1<<WGM01);
	TCCR0|=(1<<CS02) | (0<<CS01) | (1<<CS00);
	TCNT0=0;//счетный регистр
	OCR0=254;//когда пдключаем вход OCR2 счёт идёт на этот вход
	TIMSK|=(1<<OCIE0)|(0<<OCIE1A)|(1<<OCIE1B)|(1<<OCIE2);
	TIFR|=(1<<OCF0)|(0<<OCF1A)|(1<<OCF1B)|(1<<OCF2);//флаг прерывания таймера по сравнению
}

void  init_adc()
{
   

	ADCSRA|=(1<<ADEN);
	ADCSRA|=(1<<ADIF)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
	ADMUX |=(0<<REFS1)|(1<<REFS0);
}

int main(void)
{
	nastroyki->menu_lcd=0;
	nastroyki->menu_btn=0;
	
    init_PORTS();
    init_TIMERS();
    
   init_adc();

	
	
	lcd_init(LCD_DISP_ON);
	lcd_clrscr();

	ADCSRA |=(1<<ADSC);
		
	sei();
	
	while(1)
	{
		
		//menu_bt
		
		//if(nastroyki->menu_btn==0)
		//{
		//}
		
		if(nastroyki->menu_btn==1)
		{
			
		}
		
		if(nastroyki->menu_btn==2)
		{
			
		}
		
		if(nastroyki->menu_btn==3)
		{
			
		}
		
		if(nastroyki->menu_btn==4)
		{
			
		}
		
		if (PIND&1<<2)
		{
			
			asm("cli");
		     
			
			program_1();
			
			
			asm("sei");
		}
		else
		{
	     
	   
			asm("cli");
	       
			pauza=0;
		
	  
	  
		   
		
			asm("sei");
			
		}
	   if(menu==0)
	  {	
			
			
		if (adc_data[0]>300&&adc_data[1]>300&&adc_data[2]>300&&PIND&1<<6)
		{
			
			asm("cli");
			
			bit_status=1;
		
			
			asm("sei");
			
			
	    	}
		
	    	else
	    	{
			   asm("cli");
			
			
		    	bit_status=0;
			   
			
			
		   }
		   if (adc_data[3]<800)
		   {
			 bit_status1=1;  
		   }
		   else
		   {
			 bit_status1=0;  
			   
		   }
		   if (bit_status==1&&bit_status1==1)
		   {
			   asm("cli");
		
		
			  PORTD|=(1<<7);
			  asm("sei");
			  
		   }
		   else
		   {
			   asm("cli");
			   
			  PORTD&=~(1<<7);
	
		
			  asm("sei");
			  
		   }
		   if (bit_adc_obriv==1)
		   {
		   
		   
		      if (adc_data[0]<300&&adc_data[1]>300&&adc_data[2]>300)
		      {
		    	flag_obriv=1;
	            
			  
		      }
			
		       if (adc_data[0]>300&&adc_data[1]<300&&adc_data[2]>300)
		      {
	          
		    	flag_obriv=1;
               
			  
			
	        	}
			
			
		         if (adc_data[0]>300&&adc_data[1]>300&&adc_data[2]<300)
	        	{
	            
		    	   flag_obriv=1;
               
		    	
		         }
	        
		       }
			  if (flag_obriv==1)
			  {
			   asm("cli");
		    	
	        
	
		    	lcd_gotoxy(3,4);
		    	lcd_puts("  EROR_obriv");
				 
			  asm("sei");
				
		 		
		    	}
			
	       
			if (flag_lcd_clr==1)
			{
	           lcd_clrscr();
	         
			}
		   
	        if (bit_adc_peregruz==1)
	        {
	        
		     
		      if(adc_data[3]>800)
	         {
			   flag_peregruz=1;
		    	
		     }
			}
	         if (flag_peregruz==1)
	         {
		    	lcd_gotoxy(8,0);
		    	lcd_puts("PEREGRUZ");
		    	
	         }
	         
	          
	       if (bit_status==1)
        	{
	         lcd_gotoxy(0,1);
              lcd_puts("ON");
		
	         }
	         if (bit_status==0)
	        {
	          lcd_gotoxy(0,1);
              lcd_puts("OF");
		
		
	        }
	
	         lcd_gotoxy(0,0);
            lcd_puts("BobrAVR");
	 
       }
	   if(menu==1)
		{
        	
			
	      lcd_gotoxy(0,0);
          lcd_puts("Mama   ");
       
		}
	}
	
		
}	