/*
 * 1urok_poputka_PARROV.c
 *
 * Created: 19.04.2021 15:25:23
 * Author : Tanya
 */ 

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
//nclude <util/delay.h>
#define  RELAYPORT PORTB
#define  RELAY 4
#define  LEDPORT PORTB
#define  LED 0
#define KEYPORT PINB
#define TIME30 1
#define TIME60 2

#define sbit(var,bite) var |=(1<<bite)
#define cbit(var,bite) var &=~(1<<bite)
#define tbit(var,bite) var ^=(1<<bite)
#define bit_is_set(var,bite) (var & (1<<bite))
#define bit_is_clr(var,bite) !bit_is_set(var,bite)
enum stat{IDLE,COUNT30,COUNT60};
	//объявите свои глобальные переменные здесь
	unsigned int time=0;
	unsigned int blinktime=0;
	unsigned char status=IDLE;

ISR(TIM0_COMPA_vect)
{
	PORTB^=(1<<PORTB3);
	if(time !=0){time--;}
		else
		{
			status=IDLE;//статус пустой, не занятый
			cbit(RELAYPORT,RELAY);
			cbit(LEDPORT,LED);			
			TCCR0B=0;
		}
		if(blinktime==10)
		{
			tbit(LEDPORT,LED);        
			blinktime=0;
		}
		blinktime++;
}

	
	//таймер 0 выход сравните процедуру обслуживания прерываний
int main(void)
{
	#pragma optsize-
	CLKPR=(1<<CLKPCE);
	CLKPR|=(0<<CLKPCE)|(0<<CLKPS3)|(0<<CLKPS2)|(1<<CLKPS1)|(1<<CLKPS0);
	#ifdef _OPTIMIZE_SIZE_
	#pragma optimize+
	#endif
	
	//MCUCR|=(0<<ISC01)|(0<<ISC00);
	//GIMSK=0b00000000;
	//DIDR0|=(0<<AIN0D)|(0<<AIN1D);
//вход/выход инцилизации порта
//иницилизация порта В
//функции: Бит5=вход, Бит4=вход, Бит3=вход, Бит2=вход, Бит1=вход, Бит0=вход
DDRB=(0<<DDB5)|(1<<DDB4)|(0<<DDB3)|(0<<DDB2)|(0<<DDB1)|(1<<DDB0);//все порты на вход кроме нулевого и четвертого (ВЫХОД)
//состояние, положение: Бит5=Т, Бит4=Т, Бит3=Т, Бит2=Т, Бит1=Т, Бит0=Т
PORTB|=(0<<PORTB5)|(0<<PORTB4)|(0<<PORTB3)|(0<<PORTB2)|(0<<PORTB1)|(0<<PORTB0);//все порты низкий уровень
//таймер/счетчик 0 инициализация
//источник тактовых импульсов: тактовый генератор системный
//тактовый сигнал: 1,172kHz
//способ: CTC top=OCR0A
//OC0A выход: разъединенный
//OC0B выход: разъединенный
//таймер период: 99,84 ms
TCCR0A|=(0<<COM0A1)|(0<<COM0A0)|(0<<COM0B1)|(COM0B0)|(1<<WGM01)|(0<<WGM00);//режим стс ???
TCCR0B|=(0<<WGM02)|(1<<CS02)|(0<<CS01)|(1<<CS00);//делитель на 1024
TCNT0=0x00;
OCR0A=0x74;
OCR0B=0x00;	
//таймер/счетчик 0 иницилизация прерывания
TIMSK0|=(0<<OCIE0B)|(1<<OCIE0A)|(0<<TOIE0);
//иницилизация внешнего прерывания
//INT0: выключен
//прерывание при любом изменении контактов PCINTO-5: выключеное состояние
GIMSK=(0<<INT0)|(0<<PCIE);
//GIMSK=0b00000000;
MCUCR|=(0<<ISC01)|(0<<ISC00);
//инициализация аналогового компаратора
//аналоговый компаратор: выключенное состояние
//аналоговый компаратор это-положительный вход
//подключено к контакту ANT0
//отрицательный вход аналогового компаратора
//подключено к контакту ANT1
ACSR|=(1<<ACD)|(0<<ACBG)|(0<<ACO)|(0<<ACI)|(0<<ACIE)|(0<<ACIS1)|(0<<ACIS0);
ADCSRB=(0<<ACME);
//цифровой входной буфер на AIN0 Вкл
//цифровой входной буфер на AIN1 Вкл
DIDR0|=(0<<AIN0D)|(0<<AIN1D);
//иницилизация АДС
//выключить АДС
ADCSRA=(0<<ADEN)|(0<<ADSC)|(0<<ADATE)|(0<<ADIF)|(0<<ADIE)|(0<<ADPS2)|(0<<ADPS1)|(0<<ADPS0);

sei();
    while (1) 
    {
	if(bit_is_clr(KEYPORT,TIME30))
	{
	_delay_ms(50);
while(bit_is_clr(KEYPORT,TIME30));
if(status !=COUNT30 && status !=COUNT60)
{status=COUNT30;
cli();
time=300;//300;//тут для отладки уменьшил время до 30сек, было 18000
TCCR0B=(0<<WGM02)|(1<<CS02)|(0<<CS01)|(1<<CS00);
sei();
sbit(RELAYPORT,RELAY);

}
else
{
TCCR0B-0;
status=IDLE;
cbit(RELAYPORT,RELAY);
cbit(LEDPORT,LED);

time=0;
}
}
if(bit_is_clr(KEYPORT,TIME60))
{
_delay_ms(50);
	while(bit_is_clr(KEYPORT,TIME60));
if(status !=COUNT30 && status !=COUNT60)
{
status=COUNT60;
cli();
time=36000;//36000;
TCCR0B=(0<<WGM02)|(1<<CS02)|(0<<CS01)|(1<<CS00);
sei();
sbit(RELAYPORT,RELAY);
}
else
{
TCCR0B=0;
status=IDLE;
cbit(RELAYPORT,RELAY);
cbit(LEDPORT,LED);
time=0;
}
    }
}
}

