/*
проект : прогрев двигателя автомобиля
автор : LINKS_234	(icq - 2-392-465)
06.09.2008

МК: ATMega8
кварц : 8МГц или внутренний генератор на 8 МГц 

*/

#include<avr/io.h>
#include<util/delay.h> 
#include <stdbool.h>
#include <avr/interrupt.h>

//-----------------------------------------
#define i1 PINC0  // вход управления с сигналки 
#define i2 PINC1  // сигнал ручника
#define i3 PINC2  // сигнал с лампы аккума
#define i4 PINC3  // сигнал с кнопки "стоп"
/* #define i5 PINC4 */ // сигнал состояния сигналки
/* #define i6 PINC5  */ // сигнал с концевиков
#define o1 PB0  // сигнал запуска стартера
#define o2 PD6  // сигнал зажигания
#define o3 PD7  // сигнал на "пикание" 

//----------------------------------------


bool i_1;     //логические уровни на входах 
bool i_2;
bool i_3;
bool i_4;
bool i_5=false;		//переменная , заюзаная только для выключения таймера (состояние сигналки до зажигания )


bool o_1=true;     // логич . уровни на выходах . 
bool o_2=true;
bool o_3=true;

bool temp_1=false;		// переменная для контроля состояния двигателя ( запущен / заглушен )
unsigned int i=0;   // переменная проходов для паузы 
unsigned int t=0;  //переменная таймера

// -----------------------------------------------------------

void start (void);
void stop (void);



//------------------------------------------------------------




int main (void)
{
DDRC=0x00;
PORTC=0b00111111;
PORTB=0b00000001;
DDRB=0b00000001;
PORTD=0b11000000;
DDRD=0b11000000;

TIMSK=0b00000100;  // прерывание по переполнению счётчика1



	while(1);
	{
		if(i_1==false)  // проверка пришёл ли сигнал на зажигание 
		{
			if(temp_1==false)  // проверка включено ли зажигание . если выкл - завестись , иначе заглушить.
			{
				if(i_2==false)    // проверка включен ли ручник 
				{
				i_5=~PINC4;    // переменная для сохранения сигнала со входа контроля состояния сигналки
				start();		// включен - завестись и занести в переменную состояние сигналки до зажигания
				}
				else		// ручник выключен - подать сигнал и ничего больше не делать 
				{
				o_3=false;				
				_delay_ms(400);
				o_3=true;
				};
			}
			else
			{
			stop();
			};
			
		};
		
		if(i_4 || (~temp_1)==0)			// если нажали кнопку "стоп"- заглушить двигатель . 
		{
		stop();
		};
		
		
		if(i_5 && PINC4 && (~PINC5) && temp_1==true)    // сигнал на выходе сост. сигналки до зажигания , после и концевики 
		{
		TCCR1B=0x00;
		t=0;
		};
		
		if(i_5 || PINC4 || (~temp_1)==false)				//  i5  - сигнала нет (0) , PINC4 - сигнал появился (0) -- выключить двигло 
		{
		stop();
		};
		
		
		
		
		
	}
};






void start (void)
{
o_2=false;

	for(i=0;i<3;i++)   // задержка 3 секунды 
	{
	_delay_ms(1000);
	};
	
o_1=false;

	for(i=0;i<250;i++)   // гоняем 5 сек стартер , если есть сигнал с аккума 
	{
	_delay_ms(20);
		if(i_3==true)    // сигнал с аккума - нету : выключить стартер ,  запустить таймер на 10 мин.
		{
		o_1=true;
		i=249;
		TCCR1B=0b00000101;
		TCNT1=0x48E5;
		temp_1=true;
		}
		else
		{
		
			if(i==249)
			{
			stop();
			};
		};
	};
	

};


void stop (void)
{
cli();
o_1=true;
_delay_ms(500);
o_2=true;

TCCR1B=0x00;
t=0;
TCNT1=0x0000;
temp_1=false;
sei();

};


SIGNAL(TIMER1_OVF_vect)
{
t++;

	if(t==100)
	{
	stop();	
	};
	
TCNT1=0x48E5;
};


