//************************************************************************************
//**  
//**  File name:     C:\FC1\paraproba\kesz_paramero.c
//**  Generated by:  Flowcode v4.1.1.55
//**  Date:          Thursday, March 18, 2010 13:19:31
//**  Licence:       Professional
//**  Registered to: dudzsi
//**  
//**  
//**  http://www.matrixmultimedia.com
//************************************************************************************


#define MX_PIC

//Mikrovezérl? definíciók
#define P16F676
#define MX_EE
#define MX_EE_TYPE1
#define MX_EE_SIZE 128

//Függvények
#include <system.h>
#pragma CLOCK_FREQ 32768

//Konfigurációs adatok
#pragma DATA 0x2007, 0x3fb4

//Bels? függvények
#include "C:\Program Files\Matrix Multimedia\Flowcode V4\FCD\internals.h"

//Makró deklarációk
void FCM_1khz();
void FCM_kimenet();
void FCM_int();
void FCM_manualis_kapcsolo();
void FCM_timer1();


//Változó deklarációk
char FCV_MOTOR;
short FCV_SZENZOR;
char FCV_SLEEP;
short FCV_X;
char FCV_MAN;
char FCV_VEGALAS;
short FCV_M;
char FCV_KI;
short FCV_S;
char FCV_TIMER1;
char FCV_IRANY;


//Defines:

/**** Macro Substitutions ****
0 = Which ADC Channel
40 = Acquisition time
3 = Conversion Speed
0 = VRef+ Option
300 = VRef Voltage x 0.01V
******************************/




//ADC0: //Makró deklarációk

void FCD_ADC0_SampleADC();
char FCD_ADC0_ReadAsByte();
short FCD_ADC0_ReadAsInt();
float FCD_ADC0_ReadAsVoltage();
void FCD_ADC0_ReadAsString(char* FCR_RETVAL, char FCR_RETVAL_SIZE);



//ADC0: //Makró implementációk


void FCD_ADC0_SampleADC()
{
	
	/*******Supported Devices******************************************************************
	// 16F616, 16F676, 16F677, 16F684, 16F685, 16F687, 16F688, 16F689, 16F690
	******************************************************************************************/

		#define MX_ADC_CHANNEL		0
		#define MX_ADC_SAMP_TIME 	40
		#define MX_ADC_CONV_SP		3
		#define MX_ADC_VREF_OPT		0

		//set up ADC conversion
		char old_tris, cnt;

		//assign conversion rate
		adcon1 = ((MX_ADC_CONV_SP & 0x07) << 4);

		//find appropriate bit
		#if (MX_ADC_CHANNEL == 0)
			#define MX_ADC_TRIS_REG  trisa
			#define MX_ADC_TRIS_MSK  0x01
			ansel = 0x01;
		#endif
		#if (MX_ADC_CHANNEL == 1)
			#define MX_ADC_TRIS_REG  trisa
			#define MX_ADC_TRIS_MSK  0x02
			ansel = 0x02;
			#if (MX_ADC_VREF_OPT == 1)
				#pragma error "Target device is currently using AN1 for VREF+"
			#endif
		#endif
		#if (MX_ADC_CHANNEL == 2)
			#define MX_ADC_TRIS_REG  trisa
			#define MX_ADC_TRIS_MSK  0x04
			ansel = 0x04;
		#endif
		#if (MX_ADC_CHANNEL == 3)
			#define MX_ADC_TRIS_REG  trisa
			#define MX_ADC_TRIS_MSK  0x10
			ansel = 0x08;
		#endif
		#if (MX_ADC_CHANNEL == 4)
			#define MX_ADC_TRIS_REG  trisc
			#define MX_ADC_TRIS_MSK  0x01
			ansel = 0x10;
		#endif
		#if (MX_ADC_CHANNEL == 5)
			#define MX_ADC_TRIS_REG  trisc
			#define MX_ADC_TRIS_MSK  0x02
			ansel = 0x20;
		#endif
		#if (MX_ADC_CHANNEL == 6)
			#define MX_ADC_TRIS_REG  trisc
			#define MX_ADC_TRIS_MSK  0x04
			ansel = 0x40;
		#endif
		#if (MX_ADC_CHANNEL == 7)
			#define MX_ADC_TRIS_REG  trisc
			#define MX_ADC_TRIS_MSK  0x08
			ansel = 0x80;
		#endif
		#if (MX_ADC_CHANNEL == 8)
			#define MX_ADC_TRIS_REG  trisc
			#define MX_ADC_TRIS_MSK  0x40
			anselh = 0x01;
		#endif
		#if (MX_ADC_CHANNEL == 9)
			#define MX_ADC_TRIS_REG  trisc
			#define MX_ADC_TRIS_MSK  0x80
			anselh = 0x02;
		#endif
		#if (MX_ADC_CHANNEL == 10)
			#define MX_ADC_TRIS_REG  trisb
			#define MX_ADC_TRIS_MSK  0x10
			anselh = 0x04;
		#endif
		#if (MX_ADC_CHANNEL == 11)
			#define MX_ADC_TRIS_REG  trisb
			#define MX_ADC_TRIS_MSK  0x20
			anselh = 0x08;
		#endif

		//sanity check
		#ifndef MX_ADC_TRIS_REG
			#pragma error "ADC Type 3 conversion code error - please contact technical support"
		#endif

		//store old tris value, and set the i/o pin as an input
		old_tris = MX_ADC_TRIS_REG;
		MX_ADC_TRIS_REG = MX_ADC_TRIS_REG | MX_ADC_TRIS_MSK;

		//turn ADC on
		adcon0 = 0x01 | (MX_ADC_CHANNEL << 2);

		//assign VREF functionality
		#if (MX_ADC_VREF_OPT == 1)
			set_bit(adcon0, VCFG);
		#endif

		//wait the acquisition time
		cnt = 0;
		while (cnt < MX_ADC_SAMP_TIME) cnt++;

		//begin conversion and wait until it has finished
		adcon0 = adcon0 | 0x02;
		while (adcon0 & 0x02);

		//restore old tris value, and reset adc registers
		MX_ADC_TRIS_REG = old_tris;
		ansel = 0x00;
		adcon0 = 0x00;

		#if(anselh)
			anselh = 0x00;
		#endif

		#undef MX_ADC_TRIS_REG
		#undef MX_ADC_TRIS_MSK
		#undef MX_ADC_SAMP_TIME
		#undef MX_ADC_CHANNEL
		#undef MX_ADC_CONV_SP
		#undef MX_ADC_VREF_OPT

}

char FCD_ADC0_ReadAsByte()
{
	
		FCD_ADC0_SampleADC();

		return adresh;

}

short FCD_ADC0_ReadAsInt()
{
	
		short iRetVal;

		FCD_ADC0_SampleADC();

		iRetVal = (adresh << 2);
		iRetVal = iRetVal | (adresl >> 6);

		return (iRetVal);

}

float FCD_ADC0_ReadAsVoltage()
{
	

		int iSample;
		float fSample, fVoltage, fVperDiv;

		#define MX_ADC_VREF_V		300

		iSample = FCD_ADC0_ReadAsInt();											//Read as 10-bit Integer

		fVoltage = float32_from_int32(MX_ADC_VREF_V);					//Convert reference voltage count to floating point (0 - 500 x 10mV)
		fVoltage = float32_mul(fVoltage, 0.01);							//Convert reference voltage count to actual voltage (0 - 5)
		fVperDiv = float32_mul(fVoltage, 0.000976);						//Convert actual voltage to voltage per division (VRef / 1024)
		fSample = float32_from_int32(iSample);							//Convert to floating point variable
		fVoltage = float32_mul(fSample, fVperDiv);						//Calculate floating point voltage

		#undef MX_ADC_VREF_V
		return (fVoltage);

}

void FCD_ADC0_ReadAsString(char* FCR_RETVAL, char FCR_RETVAL_SIZE)
{
	
		float fVoltage;

		fVoltage = FCD_ADC0_ReadAsVoltage();
		FCI_FLOAT_TO_STRING(fVoltage, 2, FCR_RETVAL, FCR_RETVAL_SIZE);	//Convert to String

}

//Makró implementációk

void FCM_1khz()
{
	
	//Számítás
	//Számítás:
	//  x = x + 1
	FCV_X = FCV_X + 1;
	

	//Feltételes elágazás
	//Feltételes elágazás: x < 4?
	if (FCV_X < 4)
	{
		//Feltételes elágazás
		//Feltételes elágazás: x < 2?
		if (FCV_X < 2)
		{
			//Számítás
			//Számítás:
			//  ki = 1
			FCV_KI = 1;
			

		}


	} else {
		//Számítás
		//Számítás:
		//  x = 0
		//  ki = 0
		//  s = s + 1
		FCV_X = 0;
		FCV_KI = 0;
		FCV_S = FCV_S + 1;
		

	}


	//Feltételes elágazás
	//Feltételes elágazás: s = 1000?
	if (FCV_S == 1000)
	{
		//Számítás
		//Számítás:
		//  s = 0
		FCV_S = 0;
		

	}


}

void FCM_kimenet()
{
	
	//Kimenet
	//Kimenet: irany -> C5
	trisc = trisc & 0xdf;
	if (FCV_IRANY)
		portc = (portc & 0xdf) | 0x20;
	else
		portc = portc & 0xdf;


	//Kimenet
	//Kimenet: motor -> C4
	trisc = trisc & 0xef;
	if (FCV_MOTOR)
		portc = (portc & 0xef) | 0x10;
	else
		portc = portc & 0xef;


}

void FCM_int()
{
	
	//Bemenet
	//Bemenet: C2 -> vegalas
	trisc = trisc | 0x04;
	FCV_VEGALAS = ((portc & 0x04) == 0x04);


	//Ciklus
	//Ciklus: Amígvegalas = 0
	while (FCV_VEGALAS == 0)
	{
		//Bemenet
		//Bemenet: C2 -> vegalas
		trisc = trisc | 0x04;
		FCV_VEGALAS = ((portc & 0x04) == 0x04);


		//Feltételes elágazás
		//Feltételes elágazás: vegalas = 0?
		if (FCV_VEGALAS == 0)
		{
			//Számítás
			//Számítás:
			//  irany = 0
			//  motor = 1
			FCV_IRANY = 0;
			FCV_MOTOR = 1;
			

			//Makró hívás
			//Makró hívás: kimenet
			FCM_kimenet();


			//Számítás
			//Számítás:
			//  irany = 0
			//  motor = 0
			FCV_IRANY = 0;
			FCV_MOTOR = 0;
			

			//Makró hívás
			//Makró hívás: kimenet
			FCM_kimenet();


		} else {
			//Számítás
			//Számítás:
			//  irany = 0
			//  motor = 0
			//  timer1 = 1
			FCV_IRANY = 0;
			FCV_MOTOR = 0;
			FCV_TIMER1 = 1;
			

		}


	}


}

void FCM_manualis_kapcsolo()
{
	
}

void FCM_timer1()
{
	
}

void main()
{
	
	//Inicializálások
	ansel = 0;
	cmcon = 0x07;


	//Megszakítás inicializáló kód
	option_reg = 0xC0;


	//Számítás
	//Számítás:
	//  szenzor = 0
	//  ki = 0
	//  s = 0
	//  m = 0
	//  timer1 = 0
	//  vegalas = 0
	//  x = 0
	//  sleep = 0
	FCV_SZENZOR = 0;
	FCV_KI = 0;
	FCV_S = 0;
	FCV_M = 0;
	FCV_TIMER1 = 0;
	FCV_VEGALAS = 0;
	FCV_X = 0;
	FCV_SLEEP = 0;
	

	//C kód
	//C kód:
	t1con = 0x3F;


	//Megszakítás
	//Megszakítás: Engedélyezés TMR0
	option_reg.T0CS=0;
	option_reg.T0SE=1;
	option_reg = (option_reg & 0xF0) | 0x08;
	intcon.GIE=1;
	intcon.T0IE=1;


	//Megszakítás
	//Megszakítás: Engedélyezés TMR1
	intcon.PEIE=1;
	t1con.T1OSCEN=1;
	t1con.TMR1ON=1;
	t1con.TMR1CS=1;
	t1con = (t1con & 0x0F) | 0x30;
	intcon.GIE=1;
	pie1.TMR1IE=1;


	//Megszakítás
	//Megszakítás: Engedélyezés RA2INT
	option_reg.INTEDG=1;
	intcon.GIE=1;
	intcon.INTE=1;


	//Ciklus
	//Ciklus: Amíg1
	while (1)
	{
		//C kód
		//C kód:
		sleep();


		//Számítás
		//Számítás:
		//  timer1 = timer1 + sleep
		FCV_TIMER1 = FCV_TIMER1 + FCV_SLEEP;
		

		//Feltételes elágazás
		//Feltételes elágazás: timer1 = 4?
		if (FCV_TIMER1 == 4)
		{
			//Számítás
			//Számítás:
			//  timer1 = 0
			//  m = 0
			FCV_TIMER1 = 0;
			FCV_M = 0;
			

		}


		//Feltételes elágazás
		//Feltételes elágazás: timer1 = 0?
		if (FCV_TIMER1 == 0)
		{
			//Ciklus
			//Ciklus: Amígs < 500
			while (FCV_S < 500)
			{
				//Kimenet
				//Kimenet: ki -> C0
				trisc = trisc & 0xfe;
				if (FCV_KI)
					portc = (portc & 0xfe) | 0x01;
				else
					portc = portc & 0xfe;


				//Kimenet
				//Kimenet: 0 -> C1
				trisc = trisc & 0xfd;
				if (0)
					portc = (portc & 0xfd) | 0x02;
				else
					portc = portc & 0xfd;


				//Kimenet
				//Kimenet: 0 -> C0
				trisc = trisc & 0xfe;
				if (0)
					portc = (portc & 0xfe) | 0x01;
				else
					portc = portc & 0xfe;


				//Kimenet
				//Kimenet: ki -> C1
				trisc = trisc & 0xfd;
				if (FCV_KI)
					portc = (portc & 0xfd) | 0x02;
				else
					portc = portc & 0xfd;


				//Komponens makró hívása
				//Komponens makró hívása: szenzor=ADC(0)::ReadAsInt
				FCV_SZENZOR = FCD_ADC0_ReadAsInt();


			}


			//Kimenet
			//Kimenet: 0 -> C1
			trisc = trisc & 0xfd;
			if (0)
				portc = (portc & 0xfd) | 0x02;
			else
				portc = portc & 0xfd;


			//Ciklus
			//Ciklus: Amígm = 0
			while (FCV_M == 0)
			{
				//Feltételes elágazás
				//Feltételes elágazás: m = 0?
				if (FCV_M == 0)
				{
					//Bemenet
					//Bemenet: C2 -> vegalas
					trisc = trisc | 0x04;
					FCV_VEGALAS = ((portc & 0x04) == 0x04);


					//Zsalu zárása
					//Feltételes elágazás: szenzor < 26 AND vegalas = 1?
					if (FCV_SZENZOR < 26 & FCV_VEGALAS == 1)
					{
						//Számítás
						//Számítás:
						//  irany = 1
						//  motor = 0
						FCV_IRANY = 1;
						FCV_MOTOR = 0;
						

						//Makró hívás
						//Makró hívás: kimenet
						FCM_kimenet();


						//Számítás
						//Számítás:
						//  motor = 1
						FCV_MOTOR = 1;
						

						//Makró hívás
						//Makró hívás: kimenet
						FCM_kimenet();


						//Feltételes elágazás
						//Feltételes elágazás: vegalas = 0?
						if (FCV_VEGALAS == 0)
						{
							//Számítás
							//Számítás:
							//  motor = 0
							//  m = 1
							FCV_MOTOR = 0;
							FCV_M = 1;
							

							//Makró hívás
							//Makró hívás: kimenet
							FCM_kimenet();


						}


					} else {
						//Zsalu nyitasa
						//Feltételes elágazás: szenzor > 30 AND vegalas = 0?
						if (FCV_SZENZOR > 30 & FCV_VEGALAS == 0)
						{
							//Számítás
							//Számítás:
							//  irany = 0
							FCV_IRANY = 0;
							

							//Makró hívás
							//Makró hívás: kimenet
							FCM_kimenet();


							//Számítás
							//Számítás:
							//  motor = 1
							FCV_MOTOR = 1;
							

							//Makró hívás
							//Makró hívás: kimenet
							FCM_kimenet();


							//Feltételes elágazás
							//Feltételes elágazás: vegalas = 1?
							if (FCV_VEGALAS == 1)
							{
								//Számítás
								//Számítás:
								//  motor = 0
								//  m = 1
								FCV_MOTOR = 0;
								FCV_M = 1;
								

								//Makró hívás
								//Makró hívás: kimenet
								FCM_kimenet();


							}


						} else {
							//Számítás
							//Számítás:
							//  irany = 0
							//  motor = 0
							FCV_IRANY = 0;
							FCV_MOTOR = 0;
							

							//Makró hívás
							//Makró hívás: kimenet
							FCM_kimenet();


							//Számítás
							//Számítás:
							//  m = 1
							FCV_M = 1;
							

						}


					}


				} else {
					//Számítás
					//Számítás:
					//  motor = 0
					//  irany = 0
					FCV_MOTOR = 0;
					FCV_IRANY = 0;
					

					//Makró hívás
					//Makró hívás: kimenet
					FCM_kimenet();


				}


			}


			//Számítás
			//Számítás:
			//  sleep = 1
			FCV_SLEEP = 1;
			

		}


	}


	mainendloop: goto mainendloop;
}

void interrupt(void)
{
	//Handler code for [TMR0]
	if ((intcon & (1 << T0IF)) && (intcon & (1 << T0IE)))
	{
		FCM_1khz();
		clear_bit(intcon, T0IF);
	}


	//Handler code for [TMR1]
	if ((pir1 & (1 << TMR1IF)) && (pie1 & (1 << TMR1IE)))
	{
		FCM_timer1();
		clear_bit(pir1, TMR1IF);
	}


	//Handler code for [RA2INT]
	if ((intcon & (1 << INTF)) && (intcon & (1 << INTE)))
	{
		FCM_int();
		clear_bit(intcon, INTF);
	}


}



