/* Проек OpenVoron
ЧП Ворон
ЧП Магетэкс
---------------------------------------
Автор:
Геннадий Чернов, Днепропетровск 2011
Gennady Chernov, Dnepropetrovsk 2011
---------------------------------------
Датчик контроля протечки воды - Автономный модуль 
версия v-1.0
---------------------------------------
программная среда
HI-TECH C Compiler for PIC10/12/16 MCUs (PRO Mode)  V9.83
MPLAB 8.83
*/
#include <htc.h>				// для настройки под выбранный контроллер
//----------------------------------------------------
							
// Контроллер PIC10F222, тактирование - внутрений генератор с частотой 8MHZ.

//---------------------------------------------------------------------------
// конфигурирование контроллера
__CONFIG(
 IOSCFS_8MHZ 	& 				// Тактовый генератор на 8 MHz
 MCPU_OFF		&				// Pull-up резистор отключен
 WDTE_ON		&				// Сторожевой таймер включен
 CP_ON			&				// Защита кода включена
 MCLRE_ON);						// Вывод GP3/MCLR настроен на функцию MCLR
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// Описание переменных
bit	BEEP,						// флаг аварии протески
ALARM;							// флаг состояния порога контроля АЦП 

int timer,						// таймер формирующий длительность светового индикатора
dlitel,							// переменная формирующая период мигания светового индикатора
timerBeep,						// таймер формирующий длительность звукового сигнала
dlitelBeepOFF,dlitelBeepON;		// переменная формирующая период звукового сигнала
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// определения
#define		LED		GP1			// порт индикации 
#define		OUT		GP2			// выход управления 

#define		POROG	100			//80
#define		GISTER	5			//20
#define _XTAL_FREQ 	8000000		// для __delay
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// сама программа
void main(void)
{
// Настройка контроллера
	CLRWDT(); 					//сброс сторожевого таймера +++++++++++++++++++++- 
// загрузку калибровочной константы си берет на себя
// обнуление порта (правда Си тоже это делает)
	GPIO=0;
// настройка регистра OPTION
	OPTION=0b11001111;
//			 |||||+++--- PS<2:0>: настройка предделителя
//			 ||||+------ PSA: пределитель подключен к сторожевому таймеру
//			 |||+------- T0SE: счет по фронту импульса на входе T0CKI
//			 ||+-------- T0CS: вход таймера подключен к внутренему генератору
//			 |+--------- GPPU: подтягивающие резисторы на GP0, GP1, GP3 отключены
//           +---------- GPWU: побуждение по входам GP0, GP1, GP3 отключено

//  настройка портов ввода вывода
  TRISGPIO=0b11111001;
//			 |||||||+--- GP0: вход
//			 ||||||+---- GP1: выход
//			 |||||+----- GP2: выход
//			 ||||+------ GP3: вход
//			 ++++------- не используются

// настройка АЦП
	ADCON0=0b01000001;
//			 |||||||+--- ADON: АЦП включен
//			 ||||||+---- GO/DONE: статус и запуск конвертирования
//			 ||||++----- CHS<1:0>: АЦП подключен к входу GP0/AN0
//			 ||++------- не используются
//			 |+--------- ANS0: вывод GP0/AN0 настроен как аналоговый
//			 +---------- ANS1: вывод GP1/AN1 настроен как цифровой

	CLRWDT(); 					//сброс сторожевого таймера +++++++++++++++++++++- 
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// задежка необходимая для заряда входной емкости фильтра
// после подачи питания
	timerBeep++;				// 
	while(timerBeep)			//
	{
		GO=1;					// включить конвертирование
		while(GO);				// ожидание окончания конвертирования
		timerBeep++;			// 
	}
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// главный цикл работы
	while(1)
	{
		CLRWDT(); 				//сброс сторожевого таймера +++++++++++++++++++++- 	
//--------------------------------------------------------------------
// измерение потенциала между электродами		
		GO=1;					// включить конвертирование АЦП		
		while(GO);				// ожидание окончания конвертирования		
//--------------------------------------------------------------------
// определения состояния аварии		
		if (ADRES<POROG-GISTER)	// сравниваем полученное значение из АЦП
		{
			if (ALARM==0)       // если небыло аварии
			{
				ALARM=1;       	// установить аварию
				dlitel=5000;	// задаем длительность мигания светодиода индикатора
				timer=0;		// инициализация таймера индикации светодиода
			}
		}
		else if (ADRES>POROG+GISTER)	// сравниваем полученное значение из АЦП
		{	
			if (ALARM==1)       // если была аварии
			{
				ALARM=0;       	// сбросим аварию
				dlitel=60000; 	// задаем длительность мигания светодиода индикатора
				timer=0;		// инициализация таймера индикации светодиода
			}					
		}
//--------------------------------------------------------------------
// управление светодиодом-индикатором контроля работы датчика		
		timer++;
		if(timer==dlitel && LED==0) // если светодиод отключен и timer==dlitel
		{
			LED=1;					// выключить светодиод
			timer=0;				// инициализация таймера индикации светодиода
		}	
		else if(timer==dlitel && LED==1) // если светодиод включен и timer==dlitel
		{
			LED=0;					// включить светодиод
			timer=0;				// инициализация таймера индикации светодиода
		}				
//--------------------------------------------------------------------
// управление зуммером - подачей звукового сигнала
		if(ALARM==1)BEEP=1;			// защелка сигнала аварии

		if(BEEP==1)					// если была авария
		{		
			if(BEEP==1 && ALARM==1)	// проверим состояние авария и защелка
			{
				 dlitelBeepOFF=20000;// равномерный сигнал
				 dlitelBeepON=20000;
			}
			else
			{
				 dlitelBeepOFF=65000;// "попискивание"
				 dlitelBeepON=1000;
			}				 
			// формирование звукового сигнала	 			
			timerBeep++;
			if(timerBeep==dlitelBeepOFF && OUT==0)
			{
				OUT=1;
				timerBeep=0;
			}	
			else if(timerBeep==dlitelBeepON && OUT==1)
			{
				OUT=0;
				timerBeep=0;
			}
		}	
	}
//---------------------------------------------------------------------------	
	
}//end programm===============================================================
	