//************************************************************************************
//**  
//**  File name:     D:\Flowcode V4 Projekte\Zirkulation\5\Zirkulation.c
//**  Generated by:  Flowcode v4.3.7.63
//**  Date:          Saturday, August 06, 2011 12:03:42
//**  Licence:       Professional
//**  Registered to: CARSTEN LAUKAMP
//**  
//**  
//**  http://www.matrixmultimedia.com
//************************************************************************************


#define MX_PIC

//Definitionen für Microcontroller
#define P16F876
#define MX_EE
#define MX_EE_SIZE 256
#define MX_SPI
#define MX_SPI_C
#define MX_SPI_SDI 4
#define MX_SPI_SDO 5
#define MX_SPI_SCK 3
#define MX_UART
#define MX_UART_C
#define MX_UART_TX 6
#define MX_UART_RX 7
#define MX_I2C
#define MX_MI2C
#define MX_I2C_C
#define MX_I2C_SDA 4
#define MX_I2C_SCL 3
#define MX_PWM
#define MX_PWM_CNT 2
#define MX_PWM_TRIS1 trisc
#define MX_PWM_1 2
#define MX_PWM_TRIS2 trisc
#define MX_PWM_2 1

//Funktionen
#define MX_CLK_SPEED 4000000
#ifdef _BOOSTC
#include <system.h>
#endif
#ifdef HI_TECH_C
#include <pic.h>
#endif

//Konfigurations-Daten

//Interne Funktionen
#include "C:\Programme\Matrix Multimedia\Flowcode V4\FCD\internals.h"

//Makro-Funktions-Deklarationen
char FCM_Daten_EEPROM_RD(char FCL_ADDRESSMSB, char FCL_ADDRESSLSB, char FCL_DEVICEADDESS);
char FCM_Daten_RTC_auslesen(char FCL_DEVICEADDRESS);
void FCM_Daten_RTC_setzen(char FCL_DEVICEADDRESS, char FCL_VALUE, char FCL_REGISTER);
void FCM_Reaktion_auf_RS232();
void FCM_RS232_Var_beschr();
void FCM_Expander1Ausgabe(char FCL_DEVICEADDRESS, char FCL_VALUE);
char FCM_Expander1Eingabe(char FCL_DEVICEADDRESS);
void FCM_Timer_Zeitscheiben_Bearbeitung();
void FCM_LM75_auslesen(char FCL_DEVICEADDRESS);
void FCM_Daten_EEPROM_WR(char FCL_ADDRESSMSB, char FCL_ADDRESSLSB, char FCL_DEVICEADDRESS, char FCL_DATA0, char FCL_DATA1);
void FCM_PmpFRG_SchZt(char FCL_NUMWOCHTG, char FCL_AKTTEMP, char FCL_ZGZEIT, char FCL_AKTMIN, char FCL_AKTSTD, char FCL_ZWANG);
void FCM_PanelTastenEinlesen();
void FCM_PanelLEDsAusgeben();
void FCM_TemperaturenEinlesen();


//Variablen-Deklarationen
#define FCSZ_ZTAG 2
#define FCSZ_JAHR 4
#define FCSZ_WTAG 10
#define FCSZ_ZMON 2
#define FCSZ_SEK 2
#define FCSZ_TAG 2
#define FCSZ_ZEIT 8
#define FCSZ_MON1 2
#define FCSZ_ZMIN 2
#define FCSZ_ZSTD 2
#define FCSZ_DATUM 10
#define FCSZ_MIN 2
#define FCSZ_WOCHENTAG 10
#define FCSZ_ZSEK 2
#define FCSZ_STD 2
char FCV_ZEICHENEMPFANGEN;
char FCV_ZTAG[FCSZ_ZTAG];
char FCV_RETVAL;
char FCV_MIN_SCH;
char FCV_STD_SCH;
char FCV_LM75_AM_BEDIENPANEL_L;
char FCV_JAHR[FCSZ_JAHR];
char FCV_RTC_TAG_10;
char FCV_ZWANGAKTIV;
float FCV_ABBRUCHZAEHLER;
short FCV_SCHALTJAHRBASIS;
char FCV_TMP;
char FCV_RTC_TAG_1;
char FCV_RTC_WOCHENTAG;
char FCV_FLANKENMERKER;
char FCV_TAKT_65MS;
char FCV_WTAG[FCSZ_WTAG];
char FCV_ZMON[FCSZ_ZMON];
char FCV_RS232_40;
char FCV_LM75_AM_BOILER_H;
char FCV_SEK[FCSZ_SEK];
char FCV_DEC_T;
char FCV_RS232_41;
char FCV_FEHLERVAR;
char FCV_TAG[FCSZ_TAG];
char FCV_RTC_MON_1;
char FCV_DEC_U;
short FCV_ZEIT20MIN;
char FCV_RETVAL0;
char FCV_ZAEHLER100MS;
char FCV_PUMPEDTEINAUS;
char FCV_RS232_32;
char FCV_BETRIEB_EINAUS;
char FCV_RTC_STD_10;
char FCV_ZEIT[FCSZ_ZEIT];
char FCV_MON1[FCSZ_MON1];
char FCV_RS232_33;
char FCV_LEDZEIT;
char FCV_LM75_AM_BOILER_L;
short FCV_RTC_JAHR;
char FCV_RS232_34;
char FCV_ABFRZ;
char FCV_RTC_MIN_10;
char FCV_ZMIN[FCSZ_ZMIN];
char FCV_PUMPEEIN;
char FCV_RS232_35;
char FCV_LM75_H;
char FCV_RTC_SEC_1;
char FCV_RTC_SEC_10;
char FCV_ZEIT1MIN;
char FCV_RS232_36;
char FCV_SW1;
char FCV_RTC_MIN_1;
char FCV_ZAEHLERBASIS;
char FCV_ZSTD[FCSZ_ZSTD];
char FCV_DATUM[FCSZ_DATUM];
char FCV_LED_0;
char FCV_RS232_37;
char FCV_SW2;
char FCV_TAKT_1S;
char FCV_LED_1;
char FCV_LED_GESAMT;
char FCV_RS232_38;
char FCV_RTC_STD_1;
char FCV_TMP1;
char FCV_ZAEHLER1S;
char FCV_LED_2;
char FCV_RS232_39;
char FCV_LM75_L;
char FCV_LM75_AM_BEDIENPANEL_H;
char FCV_RCREG;
char FCV_MIN[FCSZ_MIN];
char FCV_WOCHENTAG[FCSZ_WOCHENTAG];
char FCV_TMP2;
char FCV_SCHALTZEITAKTIV;
char FCV_LED_3;
char FCV_FRGEIN;
char FCV_SCHALTZEITAKTIVZW;
char FCV_TMP3;
char FCV_RTC_MON_10;
char FCV_EINGABETASTEN;
char FCV_TMP4;
char FCV_ZSEK[FCSZ_ZSEK];
char FCV_STD[FCSZ_STD];
char FCV_RTC_JAHRESKENNUNG;


//Defines:

/**** Macro Substitutions ****
portb = D1 Port
trisb = D1 Data Direction
portb = D2 Port
trisb = D2 Data Direction
portb = D3 Port
trisb = D3 Data Direction
portb = D4 Port
trisb = D4 Data Direction
portb = RS Port
trisb = RS Data Direction
portb = E Port
trisb = E Data Direction
0 = Data 1_Pin
1 = Data 2 Pin
2 = Data 3 Pin
3 = Data 4 Pin
5 = RS Pin
4 = Enable Pin
LCD_262842 = Unique Component Reference Number
4 = Row Count
16 = Column Count
******************************/

	//component connections
	#define LCD_262842_PORT0    portb
	#define LCD_262842_TRIS0    trisb
	#define LCD_262842_PORT1    portb
	#define LCD_262842_TRIS1    trisb
	#define LCD_262842_PORT2    portb
	#define LCD_262842_TRIS2    trisb
	#define LCD_262842_PORT3    portb
	#define LCD_262842_TRIS3    trisb
	#define LCD_262842_PORT4    portb
	#define LCD_262842_TRIS4    trisb
	#define LCD_262842_PORT5    portb
	#define LCD_262842_TRIS5    trisb
	#define LCD_262842_BIT0    	0
	#define LCD_262842_BIT1    	1
	#define LCD_262842_BIT2    	2
	#define LCD_262842_BIT3    	3
	#define LCD_262842_RS      	5
	#define LCD_262842_E       	4
	#define LCD_262842_ROWCNT	4
	#define LCD_262842_COLCNT	16

	#ifdef _BOOSTC
	  #define LCD_262842_DELAY   delay_10us(10)
	#endif
	#ifdef _C2C_
	  #define LCD_262842_DELAY   delay_us(100)
	#endif
	#ifdef HI_TECH_C
	  #define LCD_262842_DELAY   __delay_us(120)
	#endif
	#ifndef LCD_262842_DELAY
	  #define LCD_262842_DELAY   delay_us(100)
	#endif




//LCDDisplay(0): //Makro-Funktions-Deklarationen

void FCD_LCDDisplay0_RawSend(char in, char mask);
void FCD_LCDDisplay0_Start();
void FCD_LCDDisplay0_Clear();
void FCD_LCDDisplay0_PrintASCII(char Character);
void FCD_LCDDisplay0_Command(char in);
void FCD_LCDDisplay0_Cursor(char x, char y);
void FCD_LCDDisplay0_PrintNumber(short Number);
void FCD_LCDDisplay0_PrintString(char* String, char MSZ_String);
void FCD_LCDDisplay0_ScrollDisplay(char Direction, char Num_Positions);
void FCD_LCDDisplay0_ClearLine(char Line);
void FCD_LCDDisplay0_RAM_Write(char nIdx, char d0, char d1, char d2, char d3, char d4, char d5, char d6, char d7);
//Defines:

/**** Macro Substitutions ****
0 = SM BUS Enable
0 = Slew Rate Enable
20 = Baud Rate
1 = Hardware or Bitbanged I2C
portc = Bitbanged Port Register
trisc = Bitbanged Data Direction Register
3 = Bitbanged Clock Pin
4 = Bitbanged Data Pin
MI2C_328402 = Unique component ID
******************************/

//common defines
#define MI2C_328402_MX_MI2C_SMBUS  	0
#define MI2C_328402_MX_MI2C_SLEW  	0
#define MI2C_328402_MX_MI2C_BAUD 	20
#define MI2C_328402_MX_HARDWARE  	1
#define MI2C_328402_MX_PORT		  	portc
#define MI2C_328402_MX_TRIS  		trisc
#define MI2C_328402_MX_SCL  			3
#define MI2C_328402_MX_SDA  			4

#define MI2C_328402_MX_I2C_DELAY 	delay_us(10);
#define MI2C_328402_SET_SCL			set_bit(MI2C_328402_MX_TRIS,MI2C_328402_MX_SCL);
#define MI2C_328402_CLEAR_SCL		{clear_bit(MI2C_328402_MX_TRIS,MI2C_328402_MX_SCL); clear_bit(MI2C_328402_MX_PORT,MI2C_328402_MX_SCL);}
#define MI2C_328402_SET_SDA			set_bit(MI2C_328402_MX_TRIS,MI2C_328402_MX_SDA);
#define MI2C_328402_CLEAR_SDA		{clear_bit(MI2C_328402_MX_TRIS,MI2C_328402_MX_SDA); clear_bit(MI2C_328402_MX_PORT,MI2C_328402_MX_SDA);}




//I2C_Master(0): //Makro-Funktions-Deklarationen

void FCD_I2C_Master0_MI2C_Init();
void FCD_I2C_Master0_MI2C_Start();
void FCD_I2C_Master0_MI2C_Restart();
void FCD_I2C_Master0_MI2C_Stop();
char FCD_I2C_Master0_MI2C_Transmit_Byte(char Data);
char FCD_I2C_Master0_MI2C_Receive_Byte(char Last);
void FCD_I2C_Master0_MI2C_Send_Byte_Transaction(char Device_ID, char AddrH, char AddrL, char Data);
char FCD_I2C_Master0_MI2C_Receive_Byte_Transaction(char Device_ID, char AddrH, char AddrL);
//Defines:

/**** Macro Substitutions ****
portc = RTS Port
trisc = RTS Data Direction
portc = CTS Port
trisc = CTS Data Direction
0 = RTS Pin
4 = CTS Pin
1 = UART Selection		(0-SW / 1-UART1 / 2-UART2)
0 = Flow Control		(0-Off / 1-On)
0 = Debug Enable		(0-Off / 1-On)
0 = Echo Enable		(0-Off / 1-On)
4 = UART TXSTA Value
12 = UART SPBRG Value
RS232_262890 = Unique ID
Unused = Bitbanged Receive Port Register
Unused = Bitbanged Receive Data Direction Register
Unused = Bitbanged Receive Pin
Unused = Bitbanged Transmit Pin
4 = Bitbanged BAUD Rate Delay
0 = Timout	Selection	(0-Legacy / 1-MS Timeout)
0 = Data Size			(0-8 bits / 1-9 bits / 2-7 bits & Only available on BitBanged components)
0 = Parity Enable		(0-No Parity / 1-Odd Parity / 2-Even Parity)
0 = Legacy Return		(0-Legacy mode return 255 / 1-New mode return MSB err flags)
Unused = Bitbanged Transmit Port Register
Unused = Bitbanged Transmit Data Direction Register
******************************/

#define RS232_262890_RTS_PORT			portc
#define RS232_262890_RTS_TRIS			trisc
#define RS232_262890_CTS_PORT			portc
#define RS232_262890_CTS_TRIS			trisc
#define RS232_262890_RTS_PIN			0
#define RS232_262890_CTS_PIN			4
#define RS232_262890_UART				1
#define RS232_262890_TOUT  			0
#define RS232_262890_DATASIZE			0
#define RS232_262890_PARITY			0
#define RS232_262890_LEGACY_RV			0

#if (0 == 1)
  	#define RS232_262890_HARDWARE
#endif

#if (0 == 1)
  	#define RS232_262890_DEBUG
#endif

#if (0 == 1)
  	#define RS232_262890_ECHO
#endif

#if (RS232_262890_UART == 0)
	#define RS232_262890_RX_PORT		Unused
	#define RS232_262890_RX_TRIS		Unused
	#define RS232_262890_SW_RX		Unused
	#define RS232_262890_SW_TX		Unused
	#define RS232_262890_SW_BAUD		4
	#define RS232_262890_TX_PORT		Unused
	#define RS232_262890_TX_TRIS		Unused
#else
	#define RS232_262890_TXSTA_VAL  	4
	#define RS232_262890_SPBRG_VAL  	12
	#define RS232_262890_SW_BAUD		0
#endif

#if (RS232_262890_LEGACY_RV == 0)
	#if (RS232_262890_DATASIZE == 1)
		#ifdef _BOOSTC
			#pragma error "Chip does not have second UART capability"
		#endif
		#ifdef HI_TECH_C
			#error "Chip does not have second UART capability"
		#endif
	#endif
#endif

#define RS232_262890_STATUS_LOOP		0
#define RS232_262890_STATUS_TIMEOUT	1
#define RS232_262890_STATUS_RXBYTE	2





//RS232(0): //Makro-Funktions-Deklarationen

void FCD_RS2320_SendRS232Char(short nChar);
void FCD_RS2320_SendRS232String(char* String, char MSZ_String);
short FCD_RS2320_ReceiveRS232Char(short nTimeout);
void FCD_RS2320_ReceiveRS232String(char* FCR_RETVAL, char FCR_RETVAL_SIZE, char nTimeout, char NumBytes);
void FCD_RS2320_RS232_Delay(char mode);



//LCDDisplay(0): //Makro-Implementierungen


void FCD_LCDDisplay0_RawSend(char in, char mask)
{
		unsigned char pt;

		clear_bit(LCD_262842_PORT0, LCD_262842_BIT0);
		clear_bit(LCD_262842_PORT1, LCD_262842_BIT1);
		clear_bit(LCD_262842_PORT2, LCD_262842_BIT2);
		clear_bit(LCD_262842_PORT3, LCD_262842_BIT3);
		clear_bit(LCD_262842_PORT4, LCD_262842_RS);
		clear_bit(LCD_262842_PORT5, LCD_262842_E);
		pt = ((in >> 4) & 0x0f);
		if (pt & 0x01)
		    set_bit(LCD_262842_PORT0, LCD_262842_BIT0);
		if (pt & 0x02)
		    set_bit(LCD_262842_PORT1, LCD_262842_BIT1);
		if (pt & 0x04)
		    set_bit(LCD_262842_PORT2, LCD_262842_BIT2);
		if (pt & 0x08)
		    set_bit(LCD_262842_PORT3, LCD_262842_BIT3);
		if (mask)
		    set_bit(LCD_262842_PORT4, LCD_262842_RS);
		LCD_262842_DELAY;
		set_bit (LCD_262842_PORT5, LCD_262842_E);
		LCD_262842_DELAY;
		clear_bit (LCD_262842_PORT5, LCD_262842_E);
		pt = (in & 0x0f);
		LCD_262842_DELAY;
		clear_bit(LCD_262842_PORT0, LCD_262842_BIT0);
		clear_bit(LCD_262842_PORT1, LCD_262842_BIT1);
		clear_bit(LCD_262842_PORT2, LCD_262842_BIT2);
		clear_bit(LCD_262842_PORT3, LCD_262842_BIT3);
		clear_bit(LCD_262842_PORT4, LCD_262842_RS);
		clear_bit(LCD_262842_PORT5, LCD_262842_E);
		if (pt & 0x01)
		    set_bit(LCD_262842_PORT0, LCD_262842_BIT0);
		if (pt & 0x02)
		    set_bit(LCD_262842_PORT1, LCD_262842_BIT1);
		if (pt & 0x04)
		    set_bit(LCD_262842_PORT2, LCD_262842_BIT2);
		if (pt & 0x08)
		    set_bit(LCD_262842_PORT3, LCD_262842_BIT3);
		if (mask)
		    set_bit(LCD_262842_PORT4, LCD_262842_RS);
		LCD_262842_DELAY;
		set_bit (LCD_262842_PORT5, LCD_262842_E);
		LCD_262842_DELAY;
		clear_bit (LCD_262842_PORT5, LCD_262842_E);
		LCD_262842_DELAY;
}

void FCD_LCDDisplay0_Start()
{
	
		clear_bit(LCD_262842_TRIS0, LCD_262842_BIT0);
		clear_bit(LCD_262842_TRIS1, LCD_262842_BIT1);
		clear_bit(LCD_262842_TRIS2, LCD_262842_BIT2);
		clear_bit(LCD_262842_TRIS3, LCD_262842_BIT3);
		clear_bit(LCD_262842_TRIS4, LCD_262842_RS);
		clear_bit(LCD_262842_TRIS5, LCD_262842_E);

		Wdt_Delay_Ms(12);

		FCD_LCDDisplay0_RawSend(0x33, 0);
		Wdt_Delay_Ms(2);
		FCD_LCDDisplay0_RawSend(0x33, 0);
		Wdt_Delay_Ms(2);
		FCD_LCDDisplay0_RawSend(0x32, 0);
		Wdt_Delay_Ms(2);
		FCD_LCDDisplay0_RawSend(0x2c, 0);
		Wdt_Delay_Ms(2);
		FCD_LCDDisplay0_RawSend(0x06, 0);
		Wdt_Delay_Ms(2);
		FCD_LCDDisplay0_RawSend(0x0c, 0);
		Wdt_Delay_Ms(2);

		//clear the display
		FCD_LCDDisplay0_RawSend(0x01, 0);
		Wdt_Delay_Ms(2);
		FCD_LCDDisplay0_RawSend(0x02, 0);
		Wdt_Delay_Ms(2);

}

void FCD_LCDDisplay0_Clear()
{
	
		FCD_LCDDisplay0_RawSend(0x01, 0);
		Wdt_Delay_Ms(2);
		FCD_LCDDisplay0_RawSend(0x02, 0);
		Wdt_Delay_Ms(2);

}

void FCD_LCDDisplay0_PrintASCII(char Character)
{
	
		FCD_LCDDisplay0_RawSend(Character, 0x10);

}

void FCD_LCDDisplay0_Command(char in)
{
	
		FCD_LCDDisplay0_RawSend(in, 0);
		Wdt_Delay_Ms(2);

}

void FCD_LCDDisplay0_Cursor(char x, char y)
{
	
	  #if (LCD_262842_ROWCNT == 1)
	    y=0x80;
	  #endif

	  #if (LCD_262842_ROWCNT == 2)
		if (y==0)
			y=0x80;
		else
			y=0xc0;
	  #endif

	  #if (LCD_262842_ROWCNT == 4)
		if (y==0)
			y=0x80;
		else if (y==1)
			y=0xc0;

		#if (LCD_262842_COLCNT == 16)
			else if (y==2)
				y=0x90;
			else
				y=0xd0;
		#endif

		#if (LCD_262842_COLCNT == 20)
			else if (y==2)
				y=0x94;
			else
				y=0xd4;
		#endif
	  #endif

		FCD_LCDDisplay0_RawSend(y+x, 0);
		Wdt_Delay_Ms(2);

}

void FCD_LCDDisplay0_PrintNumber(short Number)
{
	
		short tmp_int;
		char tmp_byte;
		if (Number < 0)
		{
			FCD_LCDDisplay0_RawSend('-', 0x10);
			Number = 0 - Number;
		}

		tmp_int = Number;
		if (Number >= 10000)
		{
			tmp_byte = tmp_int / 10000;
			FCD_LCDDisplay0_RawSend('0' + tmp_byte, 0x10);

			while (tmp_byte > 0)
			{
				tmp_int = tmp_int - 10000;
				tmp_byte--;
			}
		}
		if (Number >= 1000)
		{
			tmp_byte = tmp_int / 1000;
			FCD_LCDDisplay0_RawSend('0' + tmp_byte, 0x10);

			while (tmp_byte > 0)
			{
				tmp_int = tmp_int - 1000;
				tmp_byte--;
			}
		}
		if (Number >= 100)
		{
			tmp_byte = tmp_int / 100;
			FCD_LCDDisplay0_RawSend('0' + tmp_byte, 0x10);

			while (tmp_byte > 0)
			{
				tmp_int = tmp_int - 100;
				tmp_byte--;
			}
		}
		if (Number >= 10)
		{
			tmp_byte = tmp_int / 10;
			FCD_LCDDisplay0_RawSend('0' + tmp_byte, 0x10);

			while (tmp_byte > 0)
			{
				tmp_int = tmp_int - 10;
				tmp_byte--;
			}
		}
		FCD_LCDDisplay0_RawSend('0' + tmp_int, 0x10);

}

void FCD_LCDDisplay0_PrintString(char* String, char MSZ_String)
{
	
		char idx = 0;

		for (idx=0; idx<MSZ_String; idx++)
		{
			#ifdef _BOOSTC
				if (String[idx] == 0)
				{
					break;
				}
				FCD_LCDDisplay0_RawSend(String[idx], 0x10);
			#endif

			#ifdef HI_TECH_C
				if (*String == 0)
				{
					break;
				}
				FCD_LCDDisplay0_RawSend(*String, 0x10);
				String++;
			#endif
		}

}

void FCD_LCDDisplay0_ScrollDisplay(char Direction, char Num_Positions)
{
	
		char cmd = 0;
		char count;

		//Choose the direction
		switch (Direction)
		{
			case 0:
			case 'l':
			case 'L':

				cmd = 0x18;
				break;

			case 1:
			case 'r':
			case 'R':

				cmd = 0x1C;
				break;

			default:
				break;
		}

		//If direction accepted then scroll the specified amount
		if (cmd)
		{
			for (count = 0; count < Num_Positions; count++)
				FCD_LCDDisplay0_Command(cmd);
		}

}

void FCD_LCDDisplay0_ClearLine(char Line)
{
	
		char count;
		char rowcount;

		//Define number of columns per line
		#if (LCD_262842_ROWCNT == 1)
			rowcount=80;
		#endif

		#if (LCD_262842_ROWCNT == 2)
			rowcount=40;
		#endif

		#if (LCD_262842_ROWCNT == 4)
			#if (LCD_262842_COLCNT == 16)
				rowcount=16;
			#endif
			#if (LCD_262842_COLCNT == 20)
				rowcount=20;
			#endif
		#endif

		//Start at beginning of the line
		FCD_LCDDisplay0_Cursor (0, Line);

		//Send out spaces to clear line
		for (count = 0; count < rowcount; count++)
			FCD_LCDDisplay0_RawSend(' ', 0x10);

		//Move back to the beginning of the line.
		FCD_LCDDisplay0_Cursor (0, Line);

}

void FCD_LCDDisplay0_RAM_Write(char nIdx, char d0, char d1, char d2, char d3, char d4, char d5, char d6, char d7)
{
	   //set CGRAM address
	   FCD_LCDDisplay0_RawSend(64 + (nIdx << 3), 0);
	   delay_ms(2);

	   //write CGRAM data
	   FCD_LCDDisplay0_RawSend(d0, 0x10);
	   FCD_LCDDisplay0_RawSend(d1, 0x10);
	   FCD_LCDDisplay0_RawSend(d2, 0x10);
	   FCD_LCDDisplay0_RawSend(d3, 0x10);
	   FCD_LCDDisplay0_RawSend(d4, 0x10);
	   FCD_LCDDisplay0_RawSend(d5, 0x10);
	   FCD_LCDDisplay0_RawSend(d6, 0x10);
	   FCD_LCDDisplay0_RawSend(d7, 0x10);

	   //Clear the display
	   FCD_LCDDisplay0_RawSend(0x01, 0);
	   delay_ms(2);
	   FCD_LCDDisplay0_RawSend(0x02, 0);
	   delay_ms(2);
}



//I2C_Master(0): //Makro-Implementierungen


void FCD_I2C_Master0_MI2C_Init()
{
		#if MI2C_328402_MX_HARDWARE == 1									//Use Master I2C Hardware
			#ifndef MX_MI2C
				#warning "This chip does not have Master I2C capability"
			#else
				#ifdef MX_I2C_A
					#define MI2C_328402_MX_I2C_TRIS trisa
				#endif
				#ifdef MX_I2C_B
					#define MI2C_328402_MX_I2C_TRIS trisb
				#endif
				#ifdef MX_I2C_C
					#define MI2C_328402_MX_I2C_TRIS trisc
				#endif
				#ifdef MX_I2C_D
					#define MI2C_328402_MX_I2C_TRIS trisd
				#endif
				#if MI2C_328402_MX_MI2C_SLEW == 1
					cr_bit (sspstat,SMP);					//Slew Rate Control Enabled
				#else
					st_bit (sspstat,SMP);					//Slew Rate Control Disabled
				#endif
				#if MI2C_328402_MX_MI2C_SMBUS == 1
					st_bit (sspstat,CKE);					//Enable SMBus specific inputs
				#else
					cr_bit (sspstat,CKE);					//Disable SMBus specific inputs
				#endif

				#ifdef _BOOSTC
				  #ifdef SSPCON
					sspcon = 0x28;								//Setup I2C into Master Mode
				  #endif
				  #ifdef SSPCON1
					sspcon1 = 0x28;								//Setup I2C into Master Mode
				  #endif
				#endif

				#ifdef HI_TECH_C
				  #ifdef sspcon
					sspcon = 0x28;								//Setup I2C into Master Mode
				  #endif
				  #ifdef sspcon1
					sspcon1 = 0x28;								//Setup I2C into Master Mode
				  #endif
				#endif

				sspadd = MI2C_328402_MX_MI2C_BAUD;						//Set the Baud Rate
				sspcon2 = 0x00;								//Clear the control bits
				st_bit(intcon, GIE);
				set_bit(MI2C_328402_MX_TRIS, MI2C_328402_MX_SCL);			//Configure SCL as Input
				set_bit(MI2C_328402_MX_TRIS, MI2C_328402_MX_SDA);			//Configure SDA as Input
			#endif
		#else												//Use Software
	    	clear_bit(MI2C_328402_MX_PORT,MI2C_328402_MX_SCL);						//Set Outputs to 0
			clear_bit(MI2C_328402_MX_PORT,MI2C_328402_MX_SDA);
			MI2C_328402_SET_SDA;										//Configure SDA as Input
			MI2C_328402_SET_SCL;										//Configure SCL as Input
		#endif
}

void FCD_I2C_Master0_MI2C_Start()
{
		#if MI2C_328402_MX_HARDWARE == 1								//Use Master I2C Hardware
			#ifndef MX_MI2C
				#warning "This chip does not have Master I2C capability"
			#else
				cr_bit(pir1,SSPIF);							//Clear SSP interrupt flag
				st_bit(sspcon2,SEN);						//Initiate start condition
				while(ts_bit(sspcon2,SEN));					//Wait for start bit to be generated
			#endif
		#else												//Use Software I2C
			MI2C_328402_SET_SCL;										//Make Sure SCL is Set
			MI2C_328402_SET_SDA;										//Make Sure SDA is Set
			MI2C_328402_MX_I2C_DELAY;									//Small Delay
			MI2C_328402_CLEAR_SDA;										//Clear SDA
			MI2C_328402_MX_I2C_DELAY;
			MI2C_328402_CLEAR_SCL;										//Clear SCL
			MI2C_328402_MX_I2C_DELAY;
		#endif
}

void FCD_I2C_Master0_MI2C_Restart()
{
		#if MI2C_328402_MX_HARDWARE == 1									//Use Master I2C Hardware
			#ifndef MX_MI2C
				#warning "This chip does not have Master I2C capability"
			#else
				cr_bit(pir1,SSPIF);							//Clear SSP interrupt flag
				st_bit(sspcon2,RSEN);						//Initiate restart condition
				while(ts_bit(sspcon2,RSEN));				//Wait for restart bit to be generated
			#endif
		#else												//Use Software I2C
			MI2C_328402_SET_SDA;										//Set SDA High
			MI2C_328402_MX_I2C_DELAY;
			MI2C_328402_SET_SCL;										//Set SCL High
			MI2C_328402_MX_I2C_DELAY;
			MI2C_328402_CLEAR_SDA;										//Set SDA Low
			MI2C_328402_MX_I2C_DELAY;
			MI2C_328402_CLEAR_SCL;										//Set SCL Low
			MI2C_328402_MX_I2C_DELAY;
		#endif
}

void FCD_I2C_Master0_MI2C_Stop()
{
		#if MI2C_328402_MX_HARDWARE == 1									//Use Master I2C Hardware
			#ifndef MX_MI2C
				#warning "This chip does not have Master I2C capability"
			#else
				cr_bit(pir1,SSPIF);							//Clear SSP interrupt flag
				st_bit(sspcon2,PEN);						//Initiate stop condition
				while(ts_bit(sspcon2,PEN));					//Wait for stop bit to be generated
				delay_ms(10);								//Wait before reusing the I2C BUS
			#endif
		#else												//Use Software I2C
			MI2C_328402_CLEAR_SCL;										//Set SCL Low
			MI2C_328402_CLEAR_SDA;										//Set SDA Low
			MI2C_328402_MX_I2C_DELAY;
			MI2C_328402_SET_SCL;										//Set SCL High
			MI2C_328402_MX_I2C_DELAY;
			MI2C_328402_SET_SDA;										//Set SDA High
			delay_ms(10);									//Wait before reusing the I2C BUS
		#endif
}

char FCD_I2C_Master0_MI2C_Transmit_Byte(char Data)
{
		#if MI2C_328402_MX_HARDWARE == 1									//Use Master I2C Hardware
			#ifndef MX_MI2C
				#warning "This chip does not have Master I2C capability"
			#else
				cr_bit(pir1,SSPIF);							//Clear SSP interrupt flag
				sspbuf=Data;								//Send byte
				while(ts_bit(pir1,SSPIF) == 0);				//Wait for control bit to be sent
				if(ts_bit(sspcon2,ACKSTAT))					//Check Acknowledgement
					return (1);								//No Acknowledgement
				else return (0);							//Acknowledgement received
			#endif
		#else												//Use Software I2C
			char bit_mask;
			char local_ack = 0;
			for(bit_mask=0x80;bit_mask;bit_mask=bit_mask>>1)
			{
				if(Data & bit_mask)
				{
					MI2C_328402_SET_SDA;								//Set SDA High
				} else {
					MI2C_328402_CLEAR_SDA;								//Set SDA Low
				}
				MI2C_328402_MX_I2C_DELAY;
				MI2C_328402_SET_SCL;									//Set SCL High
				MI2C_328402_MX_I2C_DELAY;
				MI2C_328402_CLEAR_SCL;									//Set SCL Low
				MI2C_328402_MX_I2C_DELAY;
			}
			MI2C_328402_SET_SDA;										//Set SDA High
			MI2C_328402_MX_I2C_DELAY;
			MI2C_328402_SET_SCL;										//Set SCL High
			MI2C_328402_MX_I2C_DELAY;
			if (test_bit(MI2C_328402_MX_PORT,MI2C_328402_MX_SDA))					//Get the Status Bit
				local_ack = 1;
			MI2C_328402_MX_I2C_DELAY;
			MI2C_328402_CLEAR_SCL;										//Set SCL Low
			MI2C_328402_MX_I2C_DELAY;
			return (local_ack);								//0 = Ack received : 1 = Ack not received
		#endif
}

char FCD_I2C_Master0_MI2C_Receive_Byte(char Last)
{
		#if MI2C_328402_MX_HARDWARE == 1									//Use Master I2C Hardware
			#ifndef MX_MI2C
				#warning "This chip does not have Master I2C capability"
			#else
				cr_bit(pir1,SSPIF);							//Clear SSP interrupt flag
				st_bit(sspcon2,RCEN);						//Initiate Read
				while(ts_bit(pir1,SSPIF) == 0);				//Wait for data read
				if (Last)
					st_bit(sspcon2,ACKDT);					//Send Nack
				else cr_bit(sspcon2,ACKDT);					//Send Ack
				st_bit(sspcon2,ACKEN);						//Initiate Nack
				while(ts_bit(sspcon2,ACKEN));				//Wait for data read
				return(sspbuf);								//Store incoming data
			#endif
		#else												//Use Software I2C
			char bit_mask;
			char Data = 0;
			char local_ack;
			MI2C_328402_SET_SDA;										//Set SDA High
			MI2C_328402_MX_I2C_DELAY;
			for(bit_mask=0x80;bit_mask;bit_mask=bit_mask>>1)
			{
				MI2C_328402_SET_SCL;									//Set SCL High
				MI2C_328402_MX_I2C_DELAY;
				MI2C_328402_SET_SDA;
				if(test_bit(MI2C_328402_MX_PORT,MI2C_328402_MX_SDA))				//Read Incoming Bit
					Data = Data | bit_mask;					//Add data to variable
				MI2C_328402_CLEAR_SCL;									//Set SCL Low
				MI2C_328402_MX_I2C_DELAY;
			}
			if (Last)										//Acknowledge?
			{
				MI2C_328402_SET_SDA;									//Send Nack
			} else {
				MI2C_328402_CLEAR_SDA;									//Send Ack
			}
			MI2C_328402_MX_I2C_DELAY;
			MI2C_328402_SET_SCL;										//Set SCL High
			MI2C_328402_MX_I2C_DELAY;
			MI2C_328402_CLEAR_SCL;										//Set SCL Low
			MI2C_328402_MX_I2C_DELAY;
			return (Data);
		#endif
}

void FCD_I2C_Master0_MI2C_Send_Byte_Transaction(char Device_ID, char AddrH, char AddrL, char Data)
{
	
		Device_ID = Device_ID << 1;			//Shift Device ID to enable write mode

		FCD_I2C_Master0_MI2C_Start();						//Start transaction
		FCD_I2C_Master0_MI2C_Transmit_Byte(Device_ID);		//Transmit Device Address
		FCD_I2C_Master0_MI2C_Transmit_Byte(AddrH);			//Transmit Internal Address
		FCD_I2C_Master0_MI2C_Transmit_Byte(AddrL);
		FCD_I2C_Master0_MI2C_Transmit_Byte(Data);			//Send Data byte
		FCD_I2C_Master0_MI2C_Stop();						//Stop Transaction

}

char FCD_I2C_Master0_MI2C_Receive_Byte_Transaction(char Device_ID, char AddrH, char AddrL)
{
	
		char RetVal = 0;
		Device_ID = Device_ID << 1;			//Shift Device ID to enable write mode

		FCD_I2C_Master0_MI2C_Start();						//Start transaction
		FCD_I2C_Master0_MI2C_Transmit_Byte(Device_ID);		//Transmit Device Address
		FCD_I2C_Master0_MI2C_Transmit_Byte(AddrH);			//Transmit Internal Address
		FCD_I2C_Master0_MI2C_Transmit_Byte(AddrL);
		FCD_I2C_Master0_MI2C_Restart();						//Restart transaction

		Device_ID = Device_ID | 0x01;		//Change Device ID to read mode
		FCD_I2C_Master0_MI2C_Transmit_Byte(Device_ID);		//Transmit Device Address
		RetVal = FCD_I2C_Master0_MI2C_Receive_Byte(1);		//Read data at address
		FCD_I2C_Master0_MI2C_Stop();						//Stop Transaction

		return RetVal;						//Return data

}



//RS232(0): //Makro-Implementierungen


void FCD_RS2320_SendRS232Char(short nChar)
{
	
	#if (RS232_262890_UART == 0)

		char dMask;
		char idx;
		char count = 8;

		#ifdef RS232_262890_HARDWARE
			//wait until CTS is low
			while (( RS232_262890_CTS_PORT & (1 << RS232_262890_CTS_PIN) ) != 0);
		#endif

		#if(RS232_262890_DATASIZE == 1)
			count = 9;
		#endif
		#if(RS232_262890_DATASIZE == 2)
			count = 7;
		#endif

		clear_bit( RS232_262890_TX_PORT, RS232_262890_SW_TX);			// Send Start bit
		FCD_RS2320_RS232_Delay(0);

		for (idx = 0; idx < count; idx++)
		{
			dMask = nChar & 0x01;					// Mask off data bit

			if (dMask)
				set_bit( RS232_262890_TX_PORT, RS232_262890_SW_TX);
			else
				clear_bit( RS232_262890_TX_PORT, RS232_262890_SW_TX);

			FCD_RS2320_RS232_Delay(0);
			nChar = nChar >> 1;						// Move to next data bit
		}

		set_bit( RS232_262890_TX_PORT, RS232_262890_SW_TX);				// Send Stop bit
		FCD_RS2320_RS232_Delay(0);

	#endif

	#if (RS232_262890_UART == 1)

		#ifndef MX_UART
			#ifdef _BOOSTC
				#pragma error "Chip does not have second UART capability"
			#endif
			#ifdef HI_TECH_C
				#error "Chip does not have second UART capability"
			#endif
		#endif

		st_bit(txsta, TXEN);
		while (ts_bit(pir1, TXIF) == 0);

		#ifdef RS232_262890_HARDWARE
			//wait until CTS is low
			while (( RS232_262890_CTS_PORT & (1 << RS232_262890_CTS_PIN) ) != 0);
		#endif

		#if(RS232_262890_DATASIZE == 1)
			if (test_bit(nChar, 8))
				st_bit(txsta, TX9D);
			else
				cr_bit(txsta, TX9D);
		#endif

		txreg = nChar;

	#endif

	#if (RS232_262890_UART == 2)

		#ifndef MX_UART2
			#ifdef _BOOSTC
				#pragma error "Chip does not have second UART capability"
			#endif
			#ifdef HI_TECH_C
				#error "Chip does not have second UART capability"
			#endif
		#endif

		st_bit(txsta2, TXEN);
		while (ts_bit(pir3, TX2IF) == 0);

		#ifdef RS232_262890_HARDWARE
			//wait until CTS is low
			while (( RS232_262890_CTS_PORT & (1 << RS232_262890_CTS_PIN) ) != 0);
		#endif

		#if( RS232_262890_DATASIZE == 1)
			if (test_bit(nChar, 8))
				st_bit(txsta2, TX9D);
			else
				cr_bit(txsta2, TX9D);
		#endif

		txreg2 = nChar;

	#endif

}

void FCD_RS2320_SendRS232String(char* String, char MSZ_String)
{
		char idx;
		for(idx = 0; idx < MSZ_String; idx++)
		{
			#ifdef _BOOSTC
				if (String[idx] == 0)
					break;
				else FCD_RS2320_SendRS232Char(String[idx]);
			#endif
			#ifdef HI_TECH_
				if (*String == 0)
					break;
				else FCD_RS2320_SendRS232Char(*String);
				String++;
			#endif
		}
}

short FCD_RS2320_ReceiveRS232Char(short nTimeout)
{
	
		char delay1 = 0;
		char delay2 = 0;
		char regcheck = 0;
		char dummy = 0;
		short retVal = 512;
		char bWaitForever = 0;
		char rxStatus = RS232_262890_STATUS_LOOP;
		char idx;
		char count = 8;

		#if ( RS232_262890_LEGACY_RV == 0)
			retVal = 255;
		#endif

		#if ( RS232_262890_UART == 1)
			#ifndef MX_UART
				#ifdef _BOOSTC
					#pragma error "Chip does not have second UART capability"
				#endif
				#ifdef HI_TECH_C
					#error "Chip does not have second UART capability"
				#endif
			#endif
		#endif

		#if ( RS232_262890_UART == 2)
			#ifndef MX_UART2
				#ifdef _BOOSTC
					#pragma error "Chip does not have second UART capability"
				#endif
				#ifdef HI_TECH_C
					#error "Chip does not have second UART capability"
				#endif
			#endif
		#endif

		#ifdef RS232_262890_HARDWARE
			//ready to accept data
			clear_bit( RS232_262890_RTS_PORT, RS232_262890_RTS_PIN);
		#endif

		if (nTimeout == 255)
			bWaitForever = 1;

		#if ( RS232_262890_UART == 1)
			st_bit(rcsta, CREN);
		#endif

		#if ( RS232_262890_UART == 2)
			st_bit(rcsta2, CREN);
		#endif

		while (rxStatus == RS232_262890_STATUS_LOOP)
		{
			if (bWaitForever == 0)
			{
				//don't wait forever, so do timeout thing...
				if (nTimeout == 0)
				{
					rxStatus = RS232_262890_STATUS_TIMEOUT;
				}
				else
				{
					if ( RS232_262890_TOUT)
					{
						delay_us(10);
						delay1 = delay1 + 1;
						if(delay1 == 100)
						{
							nTimeout = nTimeout - 1;
							delay1 = 0;
						}
					}
					else
					{
						//decrement timeout
						delay1 = delay1 - 1;
						if (delay1 == 0)
						{
							nTimeout = nTimeout - 1;
						}
					}
				}
			}

			#if ( RS232_262890_UART == 0)
				regcheck = test_bit(RS232_262890_RX_PORT, RS232_262890_SW_RX);	//Test for start bit
				if (regcheck == 0)
					rxStatus = RS232_262890_STATUS_RXBYTE;
			#endif

			#if ( RS232_262890_UART == 1)
				regcheck = ts_bit(pir1, RCIF);
				if (regcheck != 0)
					rxStatus = RS232_262890_STATUS_RXBYTE;
			#endif

			#if ( RS232_262890_UART == 2)
				regcheck = ts_bit(pir3, RC2IF);
				if (regcheck != 0)
					rxStatus = RS232_262890_STATUS_RXBYTE;
			#endif
		}

		if (rxStatus == RS232_262890_STATUS_RXBYTE)
		{
			#if ( RS232_262890_UART > 0)

				#if ( RS232_262890_UART == 1)
					regcheck = ts_bit(rcsta, FERR);
				#endif

				#if ( RS232_262890_UART == 2)
					regcheck = ts_bit(rcsta2, FERR);
				#endif

				if (regcheck != 0)
				{
					#if ( RS232_262890_UART == 1)
						dummy = rcreg;      //need to read the rcreg to clear FERR
					#endif

					#if ( RS232_262890_UART == 2)
						dummy = rcreg2;      //need to read the rcreg to clear FERR
					#endif

					#ifdef RS232_262890_DEBUG
						FCD_RS2320_SendRS232Char('<');
						FCD_RS2320_SendRS232Char('F');
						FCD_RS2320_SendRS232Char('E');
						FCD_RS2320_SendRS232Char('R');
						FCD_RS2320_SendRS232Char('R');
						FCD_RS2320_SendRS232Char('>');
					#endif

					#if ( RS232_262890_LEGACY_RV == 1)
						retVal = 0x400;					//Framing Error Flag
					#endif
				}
				else
				{
					#if ( RS232_262890_UART == 1)
						regcheck = ts_bit(rcsta, OERR);
					#endif

					#if ( RS232_262890_UART == 2)
						regcheck = ts_bit(rcsta2, OERR);
					#endif

					if (regcheck != 0)
					{
						//need to read the rcreg to clear error
						#if ( RS232_262890_UART == 1)
							cr_bit(rcsta, CREN);
							st_bit(rcsta, CREN);
						#endif

						#if ( RS232_262890_UART == 2)
							cr_bit(rcsta2, CREN);
							st_bit(rcsta2, CREN);
						#endif

						#ifdef RS232_262890_DEBUG
							FCD_RS2320_SendRS232Char('<');
							FCD_RS2320_SendRS232Char('O');
							FCD_RS2320_SendRS232Char('E');
							FCD_RS2320_SendRS232Char('R');
							FCD_RS2320_SendRS232Char('R');
							FCD_RS2320_SendRS232Char('>');
						#endif

						#if ( RS232_262890_LEGACY_RV == 1)
							retVal = 0x800;					//Overrun Error Flag
						#endif

					}
					else
					{
						retVal = 0;

						#if ( RS232_262890_UART == 1)

							#if( RS232_262890_DATASIZE == 1)
								if(ts_bit(rcsta, RX9D));
									retVal = 0x100;
							#endif
							retVal = retVal | rcreg; 			//no error, so rx byte is valid

						#endif

						#if ( RS232_262890_UART == 2)

							#if( RS232_262890_DATASIZE == 1)
								if(ts_bit(rcsta2, RX9D));
									retVal = 0x100;
							#endif
							retVal = retVal | rcreg2; 			//no error, so rx byte is valid

						#endif

						#ifdef RS232_262890_ECHO
							FCD_RS2320_SendRS232Char(retVal);
						#endif
					}
				}
			#else
				#if( RS232_262890_DATASIZE == 1)
					count = 9;
				#endif

				FCD_RS2320_RS232_Delay(1);
				for (idx = 0; idx < count; idx++)
				{
					retVal = retVal >> 1;

					if(count == 9)
					{
						if (test_bit( RS232_262890_RX_PORT, RS232_262890_SW_RX))
							retVal = retVal | 0x100;
					}
					else
					{
						if (test_bit( RS232_262890_RX_PORT, RS232_262890_SW_RX))
							retVal = retVal | 0x80;
					}
					FCD_RS2320_RS232_Delay(1);
				}

				#ifdef RS232_262890_ECHO
					FCD_RS2320_SendRS232Char(retVal);
				#endif

			#endif
		}
		#ifdef RS232_262890_HARDWARE
			//not ready to accept data
			set_bit( RS232_262890_RTS_PORT, RS232_262890_RTS_PIN);
		#endif

		return (retVal);
}

void FCD_RS2320_ReceiveRS232String(char* FCR_RETVAL, char FCR_RETVAL_SIZE, char nTimeout, char NumBytes)
{
		char idx;
		short in;

		#if ( RS232_262890_LEGACY_RV == 0 )
			#define RS232_TO 	255
		#else
			#define RS232_TO 	256
		#endif

		if (NumBytes > FCR_RETVAL_SIZE)
			NumBytes = FCR_RETVAL_SIZE;

		for (idx = 0; idx < NumBytes; idx++)
		{
			in = FCD_RS2320_ReceiveRS232Char(nTimeout);
			if(in < RS232_TO)
				FCR_RETVAL[idx] = in & 0xFF;
			else
				break;
		}

		if (idx < FCR_RETVAL_SIZE)
			FCR_RETVAL[idx] = 0;

		#undef RS232_TO
}

void FCD_RS2320_RS232_Delay(char mode)
{
		unsigned int iterations;
		unsigned int delay = RS232_262890_SW_BAUD;

		if (mode)
			delay = delay + 1;

		for (iterations = 0; iterations < delay; iterations++);
}

//Makro-Implementierungen

char FCM_Daten_EEPROM_RD(char FCL_ADDRESSMSB, char FCL_ADDRESSLSB, char FCL_DEVICEADDESS)
{
	
	//Lokale Variablen-Definitionen
	char FCL_ADD;

	char FCR_RETVAL;

	//Kommentar:
	//Zelle adressieren


	//Start I²C Transaction
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Start
	FCD_I2C_Master0_MI2C_Start();


	//Device Address + Read bit
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(Daten_EEPROM_RD.DeviceAddess)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_DEVICEADDESS);


	//Send Internal LSB
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(Daten_EEPROM_RD.AddressLSB)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_ADDRESSLSB);


	//Send Internal MSB
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(Daten_EEPROM_RD.AddressMSB)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_ADDRESSMSB);


	//Call Component Macro
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Restart
	FCD_I2C_Master0_MI2C_Restart();


	//Kommentar:
	//Zelle lesen


	//Calculation
	//Berechnung:
	//  Daten_EEPROM_RD.ADD = Daten_EEPROM_RD.DeviceAddess + 1
	FCL_ADD = FCL_DEVICEADDESS + 1;
	

	//Read From Device Command
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(Daten_EEPROM_RD.ADD)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_ADD);


	//Read Byte at adressed location
	//Aufruf Komponenten-Makro: Daten_EEPROM_RD.Return=I2C_Master(0)::MI2C_Receive_Byte(0)
	FCR_RETVAL = FCD_I2C_Master0_MI2C_Receive_Byte(0);


	//Der Ordnung halber
	//Aufruf Komponenten-Makro: RetVal0=I2C_Master(0)::MI2C_Receive_Byte(1)
	FCV_RETVAL0 = FCD_I2C_Master0_MI2C_Receive_Byte(1);


	//Stop I²C Transaction
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Stop
	FCD_I2C_Master0_MI2C_Stop();


	//C Code
	//C-Kode:
	if(FCV_RETVAL != 0)
	{
	FCV_FEHLERVAR.1 = 1;
	}



	return (FCR_RETVAL);
}

char FCM_Daten_RTC_auslesen(char FCL_DEVICEADDRESS)
{
	
	//Lokale Variablen-Definitionen
	char FCL_ADD;
	char FCL_TMPBYTE;

	char FCR_RETVAL;

	//Kommentar:
	//Register 02h adressieren


	//Start I²C Transaction
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Start
	FCD_I2C_Master0_MI2C_Start();


	//Device Address + Read bit
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(Daten_RTC_auslesen.DeviceAddress)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_DEVICEADDRESS);


	//Send
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(0x02)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(0x02);


	//Call Component Macro
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Restart
	FCD_I2C_Master0_MI2C_Restart();


	//Kommentar:
	//Register 02h auslesen


	//Calculation
	//Berechnung:
	//  Daten_RTC_auslesen.ADD = Daten_RTC_auslesen.DeviceAddress + 1
	FCL_ADD = FCL_DEVICEADDRESS + 1;
	

	//Read From Device Command
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(Daten_RTC_auslesen.ADD)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_ADD);


	//Read Byte at adressed location
	//Aufruf Komponenten-Makro: Tmp=I2C_Master(0)::MI2C_Receive_Byte(1)
	FCV_TMP = FCD_I2C_Master0_MI2C_Receive_Byte(1);


	//Stop I²C Transaction
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Stop
	FCD_I2C_Master0_MI2C_Stop();


	//10s_1s_Aufbereitung
	//C-Kode:
	// Sekunden rausfiltern aus dem Byte 02h
	FCV_RTC_SEC_1 = FCV_TMP & 0x0F; 

	// 10er Sekunden rausfiltern aus dem Byte 02h
	FCV_RTC_SEC_10 = FCV_TMP & 0xF0; 
	FCV_RTC_SEC_10 >>= 4;


	//Kommentar:
	//Register 03h adressieren


	//Start I²C Transaction
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Start
	FCD_I2C_Master0_MI2C_Start();


	//Device Address + Read bit
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(Daten_RTC_auslesen.DeviceAddress)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_DEVICEADDRESS);


	//Send
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(0x03)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(0x03);


	//Call Component Macro
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Restart
	FCD_I2C_Master0_MI2C_Restart();


	//Kommentar:
	//Register 03h auslesen


	//Calculation
	//Berechnung:
	//  Daten_RTC_auslesen.ADD = Daten_RTC_auslesen.DeviceAddress + 1
	FCL_ADD = FCL_DEVICEADDRESS + 1;
	

	//Read From Device Command
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(Daten_RTC_auslesen.ADD)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_ADD);


	//Read Byte at adressed location
	//Aufruf Komponenten-Makro: Tmp=I2C_Master(0)::MI2C_Receive_Byte(1)
	FCV_TMP = FCD_I2C_Master0_MI2C_Receive_Byte(1);


	//Stop I²C Transaction
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Stop
	FCD_I2C_Master0_MI2C_Stop();


	//10Min_1Min_Aufbereitung
	//C-Kode:
	// Minuten rausfiltern aus dem Byte 03h
	FCV_RTC_MIN_1 = FCV_TMP & 0x0F; 

	// 10er Minuten rausfiltern aus dem Byte 03h
	FCV_RTC_MIN_10 = FCV_TMP & 0xF0; 
	FCV_RTC_MIN_10 >>= 4;


	//Kommentar:
	//Register 04h adressieren


	//Start I²C Transaction
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Start
	FCD_I2C_Master0_MI2C_Start();


	//Device Address + Read bit
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(Daten_RTC_auslesen.DeviceAddress)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_DEVICEADDRESS);


	//Send
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(0x04)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(0x04);


	//Call Component Macro
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Restart
	FCD_I2C_Master0_MI2C_Restart();


	//Kommentar:
	//Register 04h auslesen


	//Calculation
	//Berechnung:
	//  Daten_RTC_auslesen.ADD = Daten_RTC_auslesen.DeviceAddress + 1
	FCL_ADD = FCL_DEVICEADDRESS + 1;
	

	//Read From Device Command
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(Daten_RTC_auslesen.ADD)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_ADD);


	//Read Byte at adressed location
	//Aufruf Komponenten-Makro: Tmp=I2C_Master(0)::MI2C_Receive_Byte(1)
	FCV_TMP = FCD_I2C_Master0_MI2C_Receive_Byte(1);


	//Stop I²C Transaction
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Stop
	FCD_I2C_Master0_MI2C_Stop();


	//10Std_1Std_Kennungen_Aufbereitung
	//C-Kode:
	// Stunden rausfiltern aus dem Byte 04h
	FCV_RTC_STD_1 = FCV_TMP & 0x0F; 

	// 10er Stunden rausfiltern aus dem Byte 04h
	FCV_RTC_STD_10 = FCV_TMP & 0x30; 
	FCV_RTC_STD_10 >>= 4;

	// Kennung AM/PM rausfiltern aus dem Byte 04h
	FCV_TMP = FCV_TMP & 0xC0; 
	FCV_TMP >>= 6;


	//Kommentar:
	//Register 05h adressieren


	//Start I²C Transaction
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Start
	FCD_I2C_Master0_MI2C_Start();


	//Device Address + Read bit
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(Daten_RTC_auslesen.DeviceAddress)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_DEVICEADDRESS);


	//Send
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(0x05)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(0x05);


	//Call Component Macro
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Restart
	FCD_I2C_Master0_MI2C_Restart();


	//Kommentar:
	//Register 05h auslesen


	//Calculation
	//Berechnung:
	//  Daten_RTC_auslesen.ADD = Daten_RTC_auslesen.DeviceAddress + 1
	FCL_ADD = FCL_DEVICEADDRESS + 1;
	

	//Read From Device Command
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(Daten_RTC_auslesen.ADD)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_ADD);


	//Read Byte at adressed location
	//Aufruf Komponenten-Makro: Tmp=I2C_Master(0)::MI2C_Receive_Byte(1)
	FCV_TMP = FCD_I2C_Master0_MI2C_Receive_Byte(1);


	//Stop I²C Transaction
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Stop
	FCD_I2C_Master0_MI2C_Stop();


	//10Tag_1Tag_Jahr_Aufbereitung
	//C-Kode:
	// Tag rausfiltern aus dem Byte 05h
	FCV_RTC_TAG_1 = FCV_TMP & 0x0F; 

	// 10er Tage rausfiltern aus dem Byte 05h
	FCV_RTC_TAG_10 = FCV_TMP & 0x30; 
	FCV_RTC_TAG_10 >>= 4;

	// Jahrkennung rausfiltern aus dem Byte 05h
	FCV_RTC_JAHRESKENNUNG = FCV_TMP & 0xC0; 
	FCV_RTC_JAHRESKENNUNG >>= 6;


	//Calculation
	//Berechnung:
	//  RTC_Jahr = SchaltjahrBasis +  RTC_Jahreskennung
	FCV_RTC_JAHR = FCV_SCHALTJAHRBASIS +  FCV_RTC_JAHRESKENNUNG;
	

	//Kommentar:
	//Register 06h adressieren


	//Start I²C Transaction
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Start
	FCD_I2C_Master0_MI2C_Start();


	//Device Address + Read bit
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(Daten_RTC_auslesen.DeviceAddress)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_DEVICEADDRESS);


	//Send
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(0x06)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(0x06);


	//Call Component Macro
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Restart
	FCD_I2C_Master0_MI2C_Restart();


	//Kommentar:
	//Register 06h auslesen


	//Calculation
	//Berechnung:
	//  Daten_RTC_auslesen.ADD = Daten_RTC_auslesen.DeviceAddress + 1
	FCL_ADD = FCL_DEVICEADDRESS + 1;
	

	//Read From Device Command
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(Daten_RTC_auslesen.ADD)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_ADD);


	//Read Byte at adressed location
	//Aufruf Komponenten-Makro: Tmp=I2C_Master(0)::MI2C_Receive_Byte(1)
	FCV_TMP = FCD_I2C_Master0_MI2C_Receive_Byte(1);


	//Stop I²C Transaction
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Stop
	FCD_I2C_Master0_MI2C_Stop();


	//C Code
	//C-Kode:
	if(FCV_RETVAL != 0)
	{
	FCV_FEHLERVAR.4 = 1;
	}



	//10Mon_1Mon_Wochentag_Aufbereitung
	//C-Kode:
	// Monat rausfiltern aus dem Byte 06h
	FCV_RTC_MON_1 = FCV_TMP & 0x0F; 

	// 10er Monat rausfiltern aus dem Byte 06h
	FCV_RTC_MON_10 = FCV_TMP & 0x10; 
	FCV_RTC_MON_10 >>= 4;

	// Jahrkennung rausfiltern aus dem Byte 06h
	FCV_RTC_WOCHENTAG = FCV_TMP & 0xE0; 
	FCV_RTC_WOCHENTAG  >>= 5;


	//Decision
	//Entscheidung: RTC_Wochentag == 0?
	if (FCV_RTC_WOCHENTAG == 0)
	{
		//String Manipulation
		//String Manipulation:
		//  Wochentag = "Sonntag   "
		FCI_CONCATENATE("Sonntag   ",10,"",0,FCV_WOCHENTAG,FCSZ_WOCHENTAG);
		

	}


	//Decision
	//Entscheidung: RTC_Wochentag == 1?
	if (FCV_RTC_WOCHENTAG == 1)
	{
		//String Manipulation
		//String Manipulation:
		//  Wochentag = "Montag    "
		FCI_CONCATENATE("Montag    ",10,"",0,FCV_WOCHENTAG,FCSZ_WOCHENTAG);
		

	}


	//Decision
	//Entscheidung: RTC_Wochentag == 2?
	if (FCV_RTC_WOCHENTAG == 2)
	{
		//String Manipulation
		//String Manipulation:
		//  Wochentag = "Dienstag  "
		FCI_CONCATENATE("Dienstag  ",10,"",0,FCV_WOCHENTAG,FCSZ_WOCHENTAG);
		

	}


	//Decision
	//Entscheidung: RTC_Wochentag == 3?
	if (FCV_RTC_WOCHENTAG == 3)
	{
		//String Manipulation
		//String Manipulation:
		//  Wochentag = "Mittwoch  "
		FCI_CONCATENATE("Mittwoch  ",10,"",0,FCV_WOCHENTAG,FCSZ_WOCHENTAG);
		

	}


	//Decision
	//Entscheidung: RTC_Wochentag == 4?
	if (FCV_RTC_WOCHENTAG == 4)
	{
		//String Manipulation
		//String Manipulation:
		//  Wochentag = "Donnerstag"
		FCI_CONCATENATE("Donnerstag",10,"",0,FCV_WOCHENTAG,FCSZ_WOCHENTAG);
		

	}


	//Decision
	//Entscheidung: RTC_Wochentag == 5?
	if (FCV_RTC_WOCHENTAG == 5)
	{
		//String Manipulation
		//String Manipulation:
		//  Wochentag = "Freitag   "
		FCI_CONCATENATE("Freitag   ",10,"",0,FCV_WOCHENTAG,FCSZ_WOCHENTAG);
		

	}


	//Decision
	//Entscheidung: RTC_Wochentag == 6?
	if (FCV_RTC_WOCHENTAG == 6)
	{
		//String Manipulation
		//String Manipulation:
		//  Wochentag = "Samstag   "
		FCI_CONCATENATE("Samstag   ",10,"",0,FCV_WOCHENTAG,FCSZ_WOCHENTAG);
		

	}


	return (FCR_RETVAL);
}

void FCM_Daten_RTC_setzen(char FCL_DEVICEADDRESS, char FCL_VALUE, char FCL_REGISTER)
{
	
	//Lokale Variablen-Definitionen
	char FCL_ADD;

	//Kommentar:
	//Register adressieren


	//Start I²C Transaction
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Start
	FCD_I2C_Master0_MI2C_Start();


	//Device Address + Read bit
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(Daten_RTC_setzen.DeviceAddress)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_DEVICEADDRESS);


	//Register
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(Daten_RTC_setzen.Register)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_REGISTER);


	//Value
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(Daten_RTC_setzen.Value)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_VALUE);


	//Stop I²C Transaction
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Stop
	FCD_I2C_Master0_MI2C_Stop();


	//C Code
	//C-Kode:
	if(FCV_RETVAL != 0)
	{
	FCV_FEHLERVAR.3 = 1;
	}



}

void FCM_Reaktion_auf_RS232()
{
	
	//Kommentar:
	//Wenn Schaltzeiten übertragen werden, 
	//dann die indirekte Registeradressierung 
	//quasi mit einem Bypass versehen


	//Call Component Macro
	//Aufruf Komponenten-Makro: RCREG=RS232(0)::ReceiveRS232Char(255)
	FCV_RCREG = FCD_RS2320_ReceiveRS232Char(255);


	//C-Kode
	//C-Kode:
	FCV_ZEICHENEMPFANGEN = 1;



}

void FCM_RS232_Var_beschr()
{
	
	//Lokale Variablen-Definitionen
	char FCL_TEMP1;
	char FCL_TEMP2;

	//Calculation
	//Berechnung:
	//  Abbruchzaehler = 0
	FCV_ABBRUCHZAEHLER = 0;
	

	//Entscheidung
	//Entscheidung: ZEICHENEMPFANGEN = 1?
	if (FCV_ZEICHENEMPFANGEN == 1)
	{
		//Calculation
		//Berechnung:
		//  RS232_Var_beschr.TEMP1 = RCREG
		FCL_TEMP1 = FCV_RCREG;
		

		//Call Component Macro
		//Aufruf Komponenten-Makro: RS232(0)::SendRS232Char(RS232_Var_beschr.TEMP1)
		FCD_RS2320_SendRS232Char(FCL_TEMP1);


		//Löschen
		//Berechnung:
		//  ZEICHENEMPFANGEN = 0
		//  RCREG = 0
		FCV_ZEICHENEMPFANGEN = 0;
		FCV_RCREG = 0;
		

		//Warten
		//Verbindungspunkt: [C]: C
FCC_RS232_Var_beschr_C:
;


		//Entscheidung
		//Entscheidung: ZEICHENEMPFANGEN = 1?
		if (FCV_ZEICHENEMPFANGEN == 1)
		{
			//Calculation
			//Berechnung:
			//  RS232_Var_beschr.TEMP2 = RCREG
			FCL_TEMP2 = FCV_RCREG;
			

			//Call Component Macro
			//Aufruf Komponenten-Makro: RS232(0)::SendRS232Char(RS232_Var_beschr.TEMP2)
			FCD_RS2320_SendRS232Char(FCL_TEMP2);


			//Switch
			//Switch (Icon für switch..case): RS232_Var_beschr.TEMP1?
			switch (FCL_TEMP1)
			{
				case 32:
				{
					//Calculation
					//Berechnung:
					//  RS232_32 = RS232_Var_beschr.TEMP2
					FCV_RS232_32 = FCL_TEMP2;
					

					break;
				}

				case 33:
				{
					//Calculation
					//Berechnung:
					//  RS232_33 = RS232_Var_beschr.TEMP2
					FCV_RS232_33 = FCL_TEMP2;
					

					break;
				}

				case 34:
				{
					//Calculation
					//Berechnung:
					//  RS232_34 = RS232_Var_beschr.TEMP2
					FCV_RS232_34 = FCL_TEMP2;
					

					break;
				}

				case 35:
				{
					//Calculation
					//Berechnung:
					//  RS232_35 = RS232_Var_beschr.TEMP2
					FCV_RS232_35 = FCL_TEMP2;
					

					break;
				}

				case 36:
				{
					//Calculation
					//Berechnung:
					//  RS232_36 = RS232_Var_beschr.TEMP2
					FCV_RS232_36 = FCL_TEMP2;
					

					break;
				}

				case 37:
				{
					//Calculation
					//Berechnung:
					//  RS232_37 = RS232_Var_beschr.TEMP2
					FCV_RS232_37 = FCL_TEMP2;
					

					break;
				}

				case 38:
				{
					//Calculation
					//Berechnung:
					//  RS232_38 = RS232_Var_beschr.TEMP2
					FCV_RS232_38 = FCL_TEMP2;
					

					break;
				}

				case 39:
				{
					//Calculation
					//Berechnung:
					//  RS232_39 = RS232_Var_beschr.TEMP2
					FCV_RS232_39 = FCL_TEMP2;
					

					break;
				}

				case 40:
				{
					//Calculation
					//Berechnung:
					//  RS232_40 = RS232_Var_beschr.TEMP2
					FCV_RS232_40 = FCL_TEMP2;
					

					break;
				}

				case 41:
				{
					//Calculation
					//Berechnung:
					//  RS232_41 = RS232_Var_beschr.TEMP2
					FCV_RS232_41 = FCL_TEMP2;
					

					break;
				}

			}


			//Löschen
			//Berechnung:
			//  ZEICHENEMPFANGEN = 0
			//  RCREG = 0
			FCV_ZEICHENEMPFANGEN = 0;
			FCV_RCREG = 0;
			

		} else {
			//Calculation
			//Berechnung:
			//  Abbruchzaehler = Abbruchzaehler  + 1
			FCV_ABBRUCHZAEHLER = FCV_ABBRUCHZAEHLER  + 1;
			

			//Decision
			//Entscheidung: Abbruchzaehler == 100000?
			if (FCV_ABBRUCHZAEHLER == 100000)
			{
				//Output
				//Output: 1 -> A0
				trisa = trisa & 0xfe;
				if (1)
					porta = (porta & 0xfe) | 0x01;
				else
					porta = porta & 0xfe;


			}


			//Warten
			//Gehe zum Verbindungspunkt: [C]: C
			goto FCC_RS232_Var_beschr_C;


		}


	}


}

void FCM_Expander1Ausgabe(char FCL_DEVICEADDRESS, char FCL_VALUE)
{
	
	//Call Component Macro
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Start
	FCD_I2C_Master0_MI2C_Start();


	//Device Address
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Transmit_Byte(Expander1Ausgabe.DeviceAddress)
	FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_DEVICEADDRESS);


	//Register
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Transmit_Byte(Expander1Ausgabe.Value)
	FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_VALUE);


	//Stop I²C Transaction
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Stop
	FCD_I2C_Master0_MI2C_Stop();


}

char FCM_Expander1Eingabe(char FCL_DEVICEADDRESS)
{
	
	//Lokale Variablen-Definitionen
	char FCL_ADD;

	char FCR_RETVAL;

	//Kommentar:
	//Vom Expander lesen


	//Start I2C
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Start
	FCD_I2C_Master0_MI2C_Start();


	//Device Address
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Transmit_Byte(Expander1Eingabe.DeviceAddress)
	FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_DEVICEADDRESS);


	//Ports adressieren auf Eingang
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Transmit_Byte(0xF0)
	FCD_I2C_Master0_MI2C_Transmit_Byte(0xF0);


	//Ports adressieren auf Eingang
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Restart
	FCD_I2C_Master0_MI2C_Restart();


	//Calculation
	//Berechnung:
	//  Expander1Eingabe.ADD = Expander1Eingabe.DeviceAddress + 1
	FCL_ADD = FCL_DEVICEADDRESS + 1;
	

	//Read From Device
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Transmit_Byte(Expander1Eingabe.ADD)
	FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_ADD);


	//Call Component Macro
	//Aufruf Komponenten-Makro: Expander1Eingabe.Return=I2C_Master(0)::MI2C_Receive_Byte(1)
	FCR_RETVAL = FCD_I2C_Master0_MI2C_Receive_Byte(1);


	//Call Component Macro
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Stop
	FCD_I2C_Master0_MI2C_Stop();


	return (FCR_RETVAL);
}

void FCM_Timer_Zeitscheiben_Bearbeitung()
{
	
	//Calculation
	//Berechnung:
	//  Zaehler1S = Zaehler1S + 1
	//  Zaehler100ms = Zaehler100ms + 1
	FCV_ZAEHLER1S = FCV_ZAEHLER1S + 1;
	FCV_ZAEHLER100MS = FCV_ZAEHLER100MS + 1;
	

	//Decision
	//Entscheidung: Zaehler100ms = 2?
	if (FCV_ZAEHLER100MS == 2)
	{
		//Calculation
		//Berechnung:
		//  Zaehler100ms = 0
		//  Takt_65ms = 1
		FCV_ZAEHLER100MS = 0;
		FCV_TAKT_65MS = 1;
		

	}


	//Decision
	//Entscheidung: Zaehler1S = 30?
	if (FCV_ZAEHLER1S == 30)
	{
		//Calculation
		//Berechnung:
		//  Zaehler1S = 0
		//  Takt_1s = 1
		FCV_ZAEHLER1S = 0;
		FCV_TAKT_1S = 1;
		

	}


}

void FCM_LM75_auslesen(char FCL_DEVICEADDRESS)
{
	
	//Lokale Variablen-Definitionen
	char FCL_ADD;

	//Calculation
	//Berechnung:
	//  LM75_auslesen.ADD = LM75_auslesen.DeviceAddress + 1
	FCL_ADD = FCL_DEVICEADDRESS + 1;
	

	//Call Component Macro
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Start
	FCD_I2C_Master0_MI2C_Start();


	//Call Component Macro
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(LM75_auslesen.ADD)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_ADD);


	//Call Component Macro
	//Aufruf Komponenten-Makro: LM75_H=I2C_Master(0)::MI2C_Receive_Byte(0)
	FCV_LM75_H = FCD_I2C_Master0_MI2C_Receive_Byte(0);


	//Call Component Macro
	//Aufruf Komponenten-Makro: LM75_L=I2C_Master(0)::MI2C_Receive_Byte(0)
	FCV_LM75_L = FCD_I2C_Master0_MI2C_Receive_Byte(0);


	//Call Component Macro
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Stop
	FCD_I2C_Master0_MI2C_Stop();


	//C Code
	//C-Kode:
	if(FCV_RETVAL != 0)
	{
	FCV_FEHLERVAR.0 = 1;
	}



}

void FCM_Daten_EEPROM_WR(char FCL_ADDRESSMSB, char FCL_ADDRESSLSB, char FCL_DEVICEADDRESS, char FCL_DATA0, char FCL_DATA1)
{
	
	//Kommentar:
	//Zelle adressieren


	//Start I²C Transaction
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Start
	FCD_I2C_Master0_MI2C_Start();


	//Device Address + WR bit
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(Daten_EEPROM_WR.DeviceAddress)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_DEVICEADDRESS);


	//Send Internal LSB
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(Daten_EEPROM_WR.AddressLSB)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_ADDRESSLSB);


	//Send Internal MSB
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(Daten_EEPROM_WR.AddressMSB)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_ADDRESSMSB);


	//Send Data 0
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(Daten_EEPROM_WR.Data0)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_DATA0);


	//Send Data 1
	//Aufruf Komponenten-Makro: RetVal=I2C_Master(0)::MI2C_Transmit_Byte(Daten_EEPROM_WR.Data1)
	FCV_RETVAL = FCD_I2C_Master0_MI2C_Transmit_Byte(FCL_DATA1);


	//Stop I²C Transaction
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Stop
	FCD_I2C_Master0_MI2C_Stop();


	//C Code
	//C-Kode:
	if(FCV_RETVAL != 0)
	{
	FCV_FEHLERVAR.2 = 1;
	}



}

void FCM_PmpFRG_SchZt(char FCL_NUMWOCHTG, char FCL_AKTTEMP, char FCL_ZGZEIT, char FCL_AKTMIN, char FCL_AKTSTD, char FCL_ZWANG)
{
	
	//Lokale Variablen-Definitionen
	char FCL_ZEIGEROFFSET;

	//Decision
	//Entscheidung: Betrieb_EINAUS = 1?
	if (FCV_BETRIEB_EINAUS == 1)
	{
	} else {
		//Variablen löschen
		//C-Kode:
		FCV_SCHALTZEITAKTIVZW = 0;
		FCV_SCHALTZEITAKTIV = 0;
		FCV_PUMPEDTEINAUS = 0;
		FCV_PUMPEEIN.0 = 0; 	// Bit von delta T
		FCV_PUMPEEIN.1 = 0; 	// Bit von der Zwangfreigabe 
		//FCV_PUMPEEIN.2 = 0 	// Bit vom Zwang Einschalten vom Panel (1 Min)
		//FCV_PUMPEEIN.3 = 0 	// Bit vom Ã?bertemperatur Einschalten
		FCV_FRGEIN = 0;
		FCV_ZEIT1MIN = 0; 			// Zeiten lÃ¶schen
		FCV_ZEIT20MIN = 0;			// Zeiten lÃ¶schen
		FCV_LEDZEIT = 0;			// LED Status Stunden - Stellen lÃ¶schen



		//Goto Connection Point
		//Gehe zum Verbindungspunkt: [A]: A
		goto FCC_PmpFRG_SchZt_A;


	}


	//Decision
	//Entscheidung: PumpeDTEinAus = 1?
	if (FCV_PUMPEDTEINAUS == 1)
	{
		//Goto Connection Point
		//Gehe zum Verbindungspunkt: [B]: B
		goto FCC_PmpFRG_SchZt_B;


	}


	//Decision
	//Entscheidung: PmpFRG_SchZt.Zwang == 1?
	if (FCL_ZWANG == 1)
	{
		//Kommentar:
		//EIN - Zwang Steuerung


		//EEPROM auslesen
		//Makro-Aufruf: RetVal=Daten_EEPROM_RD(PmpFRG_SchZt.ZgZeit, RTC_Wochentag, 0xA0)
		FCV_RETVAL = FCM_Daten_EEPROM_RD(FCL_ZGZEIT, FCV_RTC_WOCHENTAG, 0xA0);


		//Decision
		//Entscheidung: PmpFRG_SchZt.AktStd == RetVal?
		if (FCL_AKTSTD == FCV_RETVAL)
		{
			//Kommentar:
			//Einschaltstunde gefunden
			//Einschaltminute holen


			//EIN Minute adressieren
			//Berechnung:
			//  PmpFRG_SchZt.ZeigerOffset = PmpFRG_SchZt.ZgZeit + 1
			FCL_ZEIGEROFFSET = FCL_ZGZEIT + 1;
			

			//EEPROM auslesen
			//Makro-Aufruf: RetVal=Daten_EEPROM_RD(PmpFRG_SchZt.ZeigerOffset, RTC_Wochentag, 0xA0)
			FCV_RETVAL = FCM_Daten_EEPROM_RD(FCL_ZEIGEROFFSET, FCV_RTC_WOCHENTAG, 0xA0);


			//Decision
			//Entscheidung: PmpFRG_SchZt.AktMin == RetVal?
			if (FCL_AKTMIN == FCV_RETVAL)
			{
				//Kommentar:
				//Einschaltstunde gefunden
				//Einschaltminute gefunden
				//Pumpe freigeben


				//Calculation
				//Berechnung:
				//  SchaltzeitAktivZW = 1
				FCV_SCHALTZEITAKTIVZW = 1;
				

			}


		}


		//Kommentar:
		//AUS


		//AUS Stunde adressieren
		//Berechnung:
		//  PmpFRG_SchZt.ZeigerOffset = PmpFRG_SchZt.ZgZeit + 2
		FCL_ZEIGEROFFSET = FCL_ZGZEIT + 2;
		

		//EEPROM auslesen
		//Makro-Aufruf: RetVal=Daten_EEPROM_RD(PmpFRG_SchZt.ZeigerOffset, RTC_Wochentag, 0xA0)
		FCV_RETVAL = FCM_Daten_EEPROM_RD(FCL_ZEIGEROFFSET, FCV_RTC_WOCHENTAG, 0xA0);


		//Decision
		//Entscheidung: PmpFRG_SchZt.AktStd == RetVal?
		if (FCL_AKTSTD == FCV_RETVAL)
		{
			//EIN Minute adressieren
			//Berechnung:
			//  PmpFRG_SchZt.ZeigerOffset = PmpFRG_SchZt.ZgZeit + 3
			FCL_ZEIGEROFFSET = FCL_ZGZEIT + 3;
			

			//EEPROM auslesen
			//Makro-Aufruf: RetVal=Daten_EEPROM_RD(PmpFRG_SchZt.ZeigerOffset, RTC_Wochentag, 0xA0)
			FCV_RETVAL = FCM_Daten_EEPROM_RD(FCL_ZEIGEROFFSET, FCV_RTC_WOCHENTAG, 0xA0);


			//Decision
			//Entscheidung: PmpFRG_SchZt.AktMin == RetVal?
			if (FCL_AKTMIN == FCV_RETVAL)
			{
				//Kommentar:
				//Ausschaltstunde gefunden
				//Ausschaltminute gefunden
				//Pumpe nicht freigeben


				//Calculation
				//Berechnung:
				//  SchaltzeitAktivZW = 0
				FCV_SCHALTZEITAKTIVZW = 0;
				

			}


		}


		//Decision
		//Entscheidung: SchaltzeitAktivZW = 1?
		if (FCV_SCHALTZEITAKTIVZW == 1)
		{
			//C Code
			//C-Kode:
			FCV_FRGEIN.1 = 1;


			//Calculation
			//Berechnung:
			//  ZwangAktiv = 1
			FCV_ZWANGAKTIV = 1;
			

			//C Code
			//C-Kode:
			FCV_PUMPEEIN.1 = 1;



		} else {
			//C Code
			//C-Kode:
			FCV_FRGEIN.1 = 0;


			//Calculation
			//Berechnung:
			//  ZwangAktiv = 0
			FCV_ZWANGAKTIV = 0;
			

			//C Code
			//C-Kode:
			FCV_PUMPEEIN.1 = 0;



		}


	} else {
		//Kommentar:
		//EIN - deltaT Steuerung


		//EEPROM auslesen
		//Makro-Aufruf: RetVal=Daten_EEPROM_RD(PmpFRG_SchZt.ZgZeit, RTC_Wochentag, 0xA0)
		FCV_RETVAL = FCM_Daten_EEPROM_RD(FCL_ZGZEIT, FCV_RTC_WOCHENTAG, 0xA0);


		//Decision
		//Entscheidung: PmpFRG_SchZt.AktStd == RetVal?
		if (FCL_AKTSTD == FCV_RETVAL)
		{
			//Kommentar:
			//Einschaltstunde gefunden
			//Einschaltminute holen


			//EIN Minute adressieren
			//Berechnung:
			//  PmpFRG_SchZt.ZeigerOffset = PmpFRG_SchZt.ZgZeit + 1
			FCL_ZEIGEROFFSET = FCL_ZGZEIT + 1;
			

			//EEPROM auslesen
			//Makro-Aufruf: RetVal=Daten_EEPROM_RD(PmpFRG_SchZt.ZeigerOffset, RTC_Wochentag, 0xA0)
			FCV_RETVAL = FCM_Daten_EEPROM_RD(FCL_ZEIGEROFFSET, FCV_RTC_WOCHENTAG, 0xA0);


			//Decision
			//Entscheidung: PmpFRG_SchZt.AktMin == RetVal?
			if (FCL_AKTMIN == FCV_RETVAL)
			{
				//Kommentar:
				//Einschaltstunde gefunden
				//Einschaltminute gefunden
				//Pumpe freigeben


				//Calculation
				//Berechnung:
				//  SchaltzeitAktiv = 1
				FCV_SCHALTZEITAKTIV = 1;
				

			}


		}


		//Kommentar:
		//AUS


		//AUS Stunde adressieren
		//Berechnung:
		//  PmpFRG_SchZt.ZeigerOffset = PmpFRG_SchZt.ZgZeit + 2
		FCL_ZEIGEROFFSET = FCL_ZGZEIT + 2;
		

		//EEPROM auslesen
		//Makro-Aufruf: RetVal=Daten_EEPROM_RD(PmpFRG_SchZt.ZeigerOffset, RTC_Wochentag, 0xA0)
		FCV_RETVAL = FCM_Daten_EEPROM_RD(FCL_ZEIGEROFFSET, FCV_RTC_WOCHENTAG, 0xA0);


		//Decision
		//Entscheidung: PmpFRG_SchZt.AktStd == RetVal?
		if (FCL_AKTSTD == FCV_RETVAL)
		{
			//EIN Minute adressieren
			//Berechnung:
			//  PmpFRG_SchZt.ZeigerOffset = PmpFRG_SchZt.ZgZeit + 3
			FCL_ZEIGEROFFSET = FCL_ZGZEIT + 3;
			

			//EEPROM auslesen
			//Makro-Aufruf: RetVal=Daten_EEPROM_RD(PmpFRG_SchZt.ZeigerOffset, RTC_Wochentag, 0xA0)
			FCV_RETVAL = FCM_Daten_EEPROM_RD(FCL_ZEIGEROFFSET, FCV_RTC_WOCHENTAG, 0xA0);


			//Decision
			//Entscheidung: PmpFRG_SchZt.AktMin == RetVal?
			if (FCL_AKTMIN == FCV_RETVAL)
			{
				//Kommentar:
				//Ausschaltstunde gefunden
				//Ausschaltminute gefunden
				//Pumpe nicht freigeben


				//Calculation
				//Berechnung:
				//  SchaltzeitAktiv = 0
				FCV_SCHALTZEITAKTIV = 0;
				

			}


		}


		//Decision
		//Entscheidung: SchaltzeitAktiv = 1?
		if (FCV_SCHALTZEITAKTIV == 1)
		{
			//Connection Point
			//Verbindungspunkt: [B]: B
FCC_PmpFRG_SchZt_B:
;


			//C Code
			//C-Kode:
			FCV_FRGEIN.0 = 1;


			//Kommentar:
			//Temperatursteuerung


			//EEPROM auslesen
			//Makro-Aufruf: RetVal=Daten_EEPROM_RD(254, 254, 0xA0)
			FCV_RETVAL = FCM_Daten_EEPROM_RD(254, 254, 0xA0);


			//Kommentar:
			//Einschalttemperatur


			//Decision
			//Entscheidung: PmpFRG_SchZt.AktTemp < RetVal?
			if (FCL_AKTTEMP < FCV_RETVAL)
			{
				//C Code
				//C-Kode:
				FCV_PUMPEEIN.0 = 1;



			}


			//EEPROM auslesen
			//Makro-Aufruf: RetVal=Daten_EEPROM_RD(255, 254, 0xA0)
			FCV_RETVAL = FCM_Daten_EEPROM_RD(255, 254, 0xA0);


			//Kommentar:
			//Ausschalttemperatur


			//Decision
			//Entscheidung: PmpFRG_SchZt.AktTemp > RetVal?
			if (FCL_AKTTEMP > FCV_RETVAL)
			{
				//C Code
				//C-Kode:
				FCV_PUMPEEIN.0 = 0;



			}


		} else {
			//C Code
			//C-Kode:
			FCV_PUMPEEIN.0 = 0;
			FCV_FRGEIN.0 = 0;


		}


	}


	//Connection Point
	//Verbindungspunkt: [A]: A
FCC_PmpFRG_SchZt_A:
;


	//Decision
	//Entscheidung: PumpeEin <> 0?
	if (FCV_PUMPEEIN != 0)
	{
		//Output
		//Output: 1 -> C5
		trisc = trisc & 0xdf;
		if (1)
			portc = (portc & 0xdf) | 0x20;
		else
			portc = portc & 0xdf;


	} else {
		//Output
		//Output: 0 -> C5
		trisc = trisc & 0xdf;
		if (0)
			portc = (portc & 0xdf) | 0x20;
		else
			portc = portc & 0xdf;


	}


}

void FCM_PanelTastenEinlesen()
{
	
	//Expander Eingabe
	//Makro-Aufruf: EingabeTasten=Expander1Eingabe(0x70)
	FCV_EINGABETASTEN = FCM_Expander1Eingabe(0x70);


	//Signalzustände umkehren
	//Berechnung:
	//  EingabeTasten = NOT EingabeTasten
	FCV_EINGABETASTEN = ~ FCV_EINGABETASTEN;
	

	//Bitpositionen richtig schieben
	//C-Kode:
	// Nur die Bits 4-7 durchlassen
	FCV_EINGABETASTEN = FCV_EINGABETASTEN & 0xF0;
	// dann auf Stelle 0-3 schieben
	FCV_EINGABETASTEN >>= 4;



	//Kommentar:
	//Funktionen


	//Kommentar:
	//Betrieb EIN / AUS


	//Flanke von Taste EIN_AUS erkennen
	//C-Kode:
	// selbstgebaute Flanke ausÃ¶sen
	//-------------------------------------------------------
	if (FCV_EINGABETASTEN.0 == 1)
	{
		if (FCV_FLANKENMERKER.0 == 0)
		{
		FCV_FLANKENMERKER.0 = 1;
		FCV_BETRIEB_EINAUS.0 = !FCV_BETRIEB_EINAUS.0;
		}
	}
	exit1:
	// Erst wieder freigeben, wenn Taste losgelassen wurde
	//-------------------------------------------------------
	if (FCV_FLANKENMERKER.0 == 1)
	{
		if (FCV_EINGABETASTEN.0 == 0)
		{
		FCV_FLANKENMERKER.0 = 0;
		}
	}




	//Kommentar:
	//Taste abfragen und demnach Pumpe DeltaT für Zeit 5 Minuten freigeben


	//Flanke von Taste deltaT 20 Min erkennen
	//C-Kode:
	// selbstgebaute Flanke ausÃ¶sen
	//-------------------------------------------------------
	if (FCV_EINGABETASTEN.1 == 1)
	{
		if (FCV_FLANKENMERKER.1 == 0)
		{
		FCV_FLANKENMERKER.1 = 1;
		FCV_ZEIT20MIN = 1200;		// Zeit 20 Minuten 
		FCV_ZEIT1MIN = 0;
		FCV_TAKT_1S = 1;			// 1 Sekunden Schleife 1 mal ausfÃ¼hren
									// damit wird die Reaktion auf den Tastendruck
									// sofort ausgefÃ¼hrt, weil dort der Einschaltbefehl wirkt
		}
	}
	exit2:
	// Erst wieder freigeben, wenn Taste losgelassen wurde
	//-------------------------------------------------------
	if (FCV_FLANKENMERKER.1 == 1)
	{
		if (FCV_EINGABETASTEN.1 == 0)
		{
		FCV_FLANKENMERKER.1 = 0;
		}
	}



	//Kommentar:
	//Taste abfragen und demnach Pumpe Zwang einschalten für 1 Minute


	//Flanke von Taste Zwang 1 Min erkennen
	//C-Kode:
	// selbstgebaute Flanke ausÃ¶sen
	//-------------------------------------------------------
	if (FCV_EINGABETASTEN.2 == 1)
	{
		if (FCV_FLANKENMERKER.2 == 0)
		{
		FCV_FLANKENMERKER.2 = 1;
		FCV_ZEIT1MIN = 60;		// Zeit 60 sec
		FCV_ZEIT20MIN = 0;
		FCV_TAKT_1S = 1;			// 1 Sekunden Schleife 1 mal ausfÃ¼hren
									// damit wird die Reaktion auf den Tastendruck
									// sofort ausgefÃ¼hrt, weil dort der Einschaltbefehl wirkt
		}
	}
	exit3:
	// Erst wieder freigeben, wenn Taste losgelassen wurde
	//-------------------------------------------------------
	if (FCV_FLANKENMERKER.2 == 1)
	{
		if (FCV_EINGABETASTEN.2 == 0)
		{
		FCV_FLANKENMERKER.2 = 0;
		}
	}




	//Kommentar:
	//Taste abfragen und demnach Störung quittieren


	//Flanke von Taste Störung quittieren erkennen
	//C-Kode:
	// selbstgebaute Flanke ausÃ¶sen
	//-------------------------------------------------------
	if ((FCV_EINGABETASTEN.3 == 1) & (FCV_FEHLERVAR != 0))
	{
		if (FCV_FLANKENMERKER.3 == 0)
		{
		FCV_FLANKENMERKER.3 = 1;
		FCV_FEHLERVAR = 0;
		FCD_LCDDisplay0_Clear();
		}
	}
	exit4:
	// Erst wieder freigeben, wenn Taste losgelassen wurde
	//-------------------------------------------------------
	if (FCV_FLANKENMERKER.3 == 1)
	{
		if (FCV_EINGABETASTEN.3 == 0)
		{
		FCV_FLANKENMERKER.3 = 0;
		}
	}




	//Kommentar:
	//Tasten abfragen und demnach -1Std veranlassen


	//Tastenkombination -1Std erkennen
	//C-Kode:
	// selbstgebaute Flanke ausÃ¶sen
	//-------------------------------------------------------
	if ((FCV_EINGABETASTEN.3 == 1) & (FCV_EINGABETASTEN.1 == 1) & (FCV_BETRIEB_EINAUS == 0))
	{
		if (FCV_FLANKENMERKER.4 == 0)
		{
		FCV_FLANKENMERKER.4 = 1;
		FCV_RS232_32 = FCV_STD_SCH - 1;
		FCV_RS232_33 = 3;
		FCV_LEDZEIT = 1;
		}
	}
	exit5:
	// Erst wieder freigeben, wenn Taste losgelassen wurde
	//-------------------------------------------------------
	if (FCV_FLANKENMERKER.4 == 1)
	{
		if (FCV_EINGABETASTEN.4 == 0)
		{
		FCV_FLANKENMERKER.4 = 0;
		}
	}




	//Kommentar:
	//Tasten abfragen und demnach +1Std veranlassen


	//Tastenkombination +1Std erkennen
	//C-Kode:
	// selbstgebaute Flanke ausÃ¶sen
	//-------------------------------------------------------
	if ((FCV_EINGABETASTEN.3 == 1) & (FCV_EINGABETASTEN.2 == 1) & (FCV_BETRIEB_EINAUS == 0))
	{
		if (FCV_FLANKENMERKER.5 == 0)
		{
		FCV_FLANKENMERKER.5 = 1;
		FCV_RS232_32 = FCV_STD_SCH + 1;
		FCV_RS232_33 = 3;
		FCV_LEDZEIT = 2;
		}
	}
	exit6:
	// Erst wieder freigeben, wenn Taste losgelassen wurde
	//-------------------------------------------------------
	if (FCV_FLANKENMERKER.5 == 1)
	{
		if (FCV_EINGABETASTEN.5 == 0)
		{
		FCV_FLANKENMERKER.5 = 0;
		}
	}




	//Kommentar:
	//ALT


	//Bild+
	//C-Kode:
	// selbstgebaute Flanke und Makro auslösen
	//-------------------------------------------------------
	/*
	if (FCV_PORT_D_TASTEN.2 == 1)
	{
		if (FCV_PORT_D_MERKER.2 == 0)
		{
			if (FCV_BILDAKTIV == FCV_BILDNUMMERMAX)
			{
				FCM_BEEP3Modul();
				goto exit1;
			}
		FCV_PORT_D_MERKER.2 = 1;
	    	FCM_BEEP_Modul();
		FCV_BILDNUMMERAKT = FCV_BILDNUMMERAKT + 1;
		}
	}
	exit1:
	// Erst wieder freigeben, wenn Taste losgelassen wurde
	//-------------------------------------------------------
	if (FCV_PORT_D_MERKER.2 == 1)
	{

		if (FCV_PORT_D_TASTEN.2 == 0)
		{
		FCV_PORT_D_MERKER.2 = 0;
		}
	}
	*/




}

void FCM_PanelLEDsAusgeben()
{
	
	//LED 1 grün am Panel BETRIEB
	//C-Kode:
	FCV_LED_GESAMT = 0;
	if (test_bit(FCV_BETRIEB_EINAUS, 0))				//check high
	{
		FCV_LED_GESAMT.0 = 1;			// 1
	}
	else
	{
		FCV_LED_GESAMT.0 = 0;			// 0
	}


	//LED 2 gelb am Panel FREIGABE
	//C-Kode:
	if ((test_bit(FCV_FRGEIN, 0)) | (test_bit(FCV_LEDZEIT, 0)))				//check high
	{
		FCV_LED_GESAMT.1 = 1;			// 1
		if(test_bit(FCV_LEDZEIT, 0))
			{
			delay_ms(500);
			FCV_LEDZEIT = 0;
			}
	}
	else
	{
		FCV_LED_GESAMT.1 = 0;			// 0
	}


	//LED 3 grün am Panel Pumpe
	//C-Kode:
	if ((FCV_PUMPEEIN != 0) | (test_bit(FCV_LEDZEIT, 1)))	//check
	{
		FCV_LED_GESAMT.2 = 1;			// 1
		if(test_bit(FCV_LEDZEIT, 1))
			{
			delay_ms(500);
			FCV_LEDZEIT = 0;
			}
	}
	else
	{
		FCV_LED_GESAMT.2 = 0;			// 0
	}


	//LED 4 rot am Panel Störung
	//C-Kode:
	if (FCV_FEHLERVAR != 0)	//check
	{
		FCV_LED_GESAMT.3 = 1;			// 1
	}
	else
	{
		FCV_LED_GESAMT.3 = 0;			// 0
	}


	//Expander Ausgabe
	//Makro-Aufruf: Expander1Ausgabe(0x70, LED_Gesamt)
	FCM_Expander1Ausgabe(0x70, FCV_LED_GESAMT);


}

void FCM_TemperaturenEinlesen()
{
	
	//Kommentar:
	//LM 75 am Bedienpanel abfragen


	//Call Macro
	//Makro-Aufruf: LM75_auslesen(0x90)
	FCM_LM75_auslesen(0x90);


	//Calculation
	//Berechnung:
	//  LM75_am_Bedienpanel_H = LM75_H
	//  LM75_am_Bedienpanel_L = LM75_L
	FCV_LM75_AM_BEDIENPANEL_H = FCV_LM75_H;
	FCV_LM75_AM_BEDIENPANEL_L = FCV_LM75_L;
	

	//Kommentar:
	//LM 75 am Boiler abfragen


	//Call Macro
	//Makro-Aufruf: LM75_auslesen(0x92)
	FCM_LM75_auslesen(0x92);


	//Calculation
	//Berechnung:
	//  LM75_am_Boiler_H = LM75_H
	//  LM75_am_Boiler_L = LM75_L
	FCV_LM75_AM_BOILER_H = FCV_LM75_H;
	FCV_LM75_AM_BOILER_L = FCV_LM75_L;
	

	//Call Component Macro
	//Aufruf Komponenten-Makro: LCDDisplay(0)::Cursor(0, 4)
	FCD_LCDDisplay0_Cursor(0, 4);


	//Call Component Macro
	//Aufruf Komponenten-Makro: LCDDisplay(0)::PrintString("Panel:")
	FCD_LCDDisplay0_PrintString("Panel:",6);


	//Call Component Macro
	//Aufruf Komponenten-Makro: LCDDisplay(0)::PrintNumber(LM75_am_Bedienpanel_H)
	FCD_LCDDisplay0_PrintNumber(FCV_LM75_AM_BEDIENPANEL_H);


	//Call Component Macro
	//Aufruf Komponenten-Makro: LCDDisplay(0)::Cursor(10, 4)
	FCD_LCDDisplay0_Cursor(10, 4);


	//Call Component Macro
	//Aufruf Komponenten-Makro: LCDDisplay(0)::PrintString("WW:")
	FCD_LCDDisplay0_PrintString("WW:",3);


	//Call Component Macro
	//Aufruf Komponenten-Makro: LCDDisplay(0)::PrintNumber(LM75_am_Boiler_H)
	FCD_LCDDisplay0_PrintNumber(FCV_LM75_AM_BOILER_H);


}

void main()
{
	
	//Initialisierung
	adcon1 = 0x07;

	
	#if (RS232_262890_UART == 0)
		set_bit(RS232_262890_RX_TRIS, RS232_262890_SW_RX);				// Receive pin is a input
		clear_bit(RS232_262890_TX_TRIS, RS232_262890_SW_TX);			// Transmit pin is a output
		set_bit(RS232_262890_TX_PORT, RS232_262890_SW_TX);				// Transmit pin is default high
	#endif

	#if (RS232_262890_UART == 1)
		txsta = RS232_262890_TXSTA_VAL;   					// 8-bit, async, low speed, off
		spbrg = RS232_262890_SPBRG_VAL;   					// set the baud rate
		rcsta = 0;                    				// 8-bit, disabled

		if(RS232_262890_DATASIZE == 1)
		{
			st_bit(txsta, TX9);   					// 9-bit TX
			st_bit(rcsta, RX9);                    	// 9-bit RX
		}

		st_bit(rcsta, SPEN);         				// turn on serial interface
	#endif

	#if (RS232_262890_UART == 2)

		txsta2 = RS232_262890_TXSTA_VAL;   					// 8-bit, async, low speed, off
		spbrg2 = RS232_262890_SPBRG_VAL;   					// set the baud rate
		rcsta2 = 0;                    				// 8-bit, disabled

		if(RS232_262890_DATASIZE == 1)
		{
			st_bit(txsta2, TX9);   					// 9-bit TX
			st_bit(rcsta2, RX9);                    // 9-bit RX
		}

		st_bit(rcsta2, SPEN);         				// turn on serial interface
	#endif

	#ifdef RS232_262890_HARDWARE
		set_bit( RS232_262890_CTS_TRIS, RS232_262890_CTS_PIN);			//CTS is an input
		clear_bit( RS232_262890_RTS_TRIS, RS232_262890_RTS_PIN);		//RTS is an output
		set_bit( RS232_262890_RTS_PORT, RS232_262890_RTS_PIN); 			//not ready to accept data
	#endif


	//Interrupt-Initialisierungs-Kode
	option_reg = 0xC0;


	//MCRL freigeben
	//Output: 0 -> A0
	trisa = trisa & 0xfe;
	if (0)
		porta = (porta & 0xfe) | 0x01;
	else
		porta = porta & 0xfe;


	//Variablen initialisiseren
	//Berechnung:
	//  RetVal0 = 0
	//  ZaehlerBasis = 0
	//  TMP1 = 0
	//  TMP2 = 0
	//  AbfrZ = 0
	//  ZwangAktiv = 0
	//  SchaltzeitAktiv = 0
	//  SchaltzeitAktivZW = 0
	//  PumpeEin = 0
	//  Betrieb_EINAUS = 1
	//  Flankenmerker = 0
	//  Zeit1Min = 0
	//  Zeit20Min = 0
	//  PumpeDTEinAus = 0
	//  SW1 = 0
	//  SW2 = 0
	//  RS232_32 = 0
	//  RS232_33 = 0
	//  RS232_34 = 0
	//  RS232_35 = 0
	//  RS232_36 = 0
	//  RS232_37 = 0
	//  RS232_38 = 0
	//  RS232_39 = 0
	//  RS232_40 = 0
	//  RS232_41 = 0
	//  FehlerVar = 0
	//  LEDZEIT = 0
	FCV_RETVAL0 = 0;
	FCV_ZAEHLERBASIS = 0;
	FCV_TMP1 = 0;
	FCV_TMP2 = 0;
	FCV_ABFRZ = 0;
	FCV_ZWANGAKTIV = 0;
	FCV_SCHALTZEITAKTIV = 0;
	FCV_SCHALTZEITAKTIVZW = 0;
	FCV_PUMPEEIN = 0;
	FCV_BETRIEB_EINAUS = 1;
	FCV_FLANKENMERKER = 0;
	FCV_ZEIT1MIN = 0;
	FCV_ZEIT20MIN = 0;
	FCV_PUMPEDTEINAUS = 0;
	FCV_SW1 = 0;
	FCV_SW2 = 0;
	FCV_RS232_32 = 0;
	FCV_RS232_33 = 0;
	FCV_RS232_34 = 0;
	FCV_RS232_35 = 0;
	FCV_RS232_36 = 0;
	FCV_RS232_37 = 0;
	FCV_RS232_38 = 0;
	FCV_RS232_39 = 0;
	FCV_RS232_40 = 0;
	FCV_RS232_41 = 0;
	FCV_FEHLERVAR = 0;
	FCV_LEDZEIT = 0;
	

	//Variablen vorbesetzen
	//C-Kode:
	FCV_RS232_32 = 0;
	FCV_RS232_33 = 0;
	FCV_RS232_34 = 216; // Byte Basisjahr LowByte (D8h => 216d);
	FCV_RS232_35 = 7;	// Byte Basisjahr HighByte (07h => (7*256)=1792);
	FCV_RS232_36 = 0;
	FCV_RS232_37 = 0;
	FCV_RS232_38 = 0;
	FCV_RS232_39 = 0;
	FCV_RS232_40 = 28;	// Schwellwert fÃ¼r Schalt-Temperatur E im 24512 (<28Â°C)
	FCV_RS232_41 = 35;	// Schwellwert fÃ¼r Schalt-Temperatur A im 24512 (>35Â°C)


	//I2C initialisieren
	//Aufruf Komponenten-Makro: I2C_Master(0)::MI2C_Init
	FCD_I2C_Master0_MI2C_Init();


	//String Variable leeren
	//String Manipulation:
	//  Wochentag = "          "
	FCI_CONCATENATE("          ",10,"",0,FCV_WOCHENTAG,FCSZ_WOCHENTAG);
	

	//LCD Initialisieren
	//Aufruf Komponenten-Makro: LCDDisplay(0)::Start
	FCD_LCDDisplay0_Start();


	//Interrupt
	//Interrupt: Enable TMR0
	cr_bit(option_reg,T0CS);
	st_bit(option_reg,T0SE);
	option_reg = (option_reg & 0xF0) | 0x06;
	st_bit(intcon,GIE);
	st_bit(intcon, T0IE);


	//Interrupt
	//Interrupt: Enable RS232Interrupt
	st_bit(intcon,GIE);
	intcon.PEIE = 1; // Enable peripheral interrupts
	intcon.GIE = 1; // Enable global interrupts
	pie1.RCIE = 1; // Enable USART receive interrupts
	rcsta=0x90;
	pir1=0x00;



	//rcreg Register erstmal löschen
	//C-Kode:
	FCV_TMP1 = rcreg;
	FCV_TMP1 = 0;



	//
	//Verbindungspunkt: [A]: A
FCC_Main_A:
;


	//Jahreszahlrechnung auf Basisbezug
	//C-Kode:
	FCV_SCHALTJAHRBASIS = (FCV_RS232_35 * 256);
	FCV_SCHALTJAHRBASIS = FCV_SCHALTJAHRBASIS + FCV_RS232_34;



	//RS 232 Variablen beschreiben
	//Makro-Aufruf: RS232_Var_beschr
	FCM_RS232_Var_beschr();


	//Switch
	//Switch (Icon für switch..case): RS232_33?
	switch (FCV_RS232_33)
	{
		case 1:
		{
			//Kommentar:
			//Register 02 beschreiben


			//Variable kopieren
			//C-Kode:
			//  kopieren
			FCV_TMP1 = FCV_RS232_32;




			//Überwachung
			//C-Kode:
			// Ã?berwachung auf > 59 Sekunden -> nicht mÃ¶glich !
			if (FCV_TMP1 > 59) 
			{
			FCV_TMP1 = 59;
			}



			//Dec->BCD
			//Berechnung:
			//  dec_t = TMP1/10
			//  dec_u = TMP1 MOD 10
			//  TMP1 = (dec_t << 4)
			//  TMP1 = TMP1 + dec_u
			FCV_DEC_T = FCV_TMP1/10;
			FCV_DEC_U = FCV_TMP1 % 10;
			FCV_TMP1 = (FCV_DEC_T << 4);
			FCV_TMP1 = FCV_TMP1 + FCV_DEC_U;
			

			//Call Macro
			//Makro-Aufruf: Daten_RTC_setzen(0xA2, TMP1, 0x02)
			FCM_Daten_RTC_setzen(0xA2, FCV_TMP1, 0x02);


			//Löschen
			//C-Kode:
			// Variablen wieder lÃ¶schen
			FCV_RS232_32 = 0;
			FCV_RS232_33 = 0;
			FCV_TMP1 = 0;
			FCV_TMP2 = 0;



			break;
		}

		case 2:
		{
			//Kommentar:
			//Register 03 beschreiben


			//Variable kopieren
			//C-Kode:
			//  kopieren
			FCV_TMP1 = FCV_RS232_32;



			//Überwachung
			//C-Kode:
			// Ã?berwachung auf > 59 Minuten -> nicht mÃ¶glich !
			if (FCV_TMP1 > 59) 
			{
			FCV_TMP1 = 59;
			}



			//Dec->BCD
			//Berechnung:
			//  dec_t = TMP1/10
			//  dec_u = TMP1 MOD 10
			//  TMP1 = (dec_t << 4)
			//  TMP1 = TMP1 + dec_u
			FCV_DEC_T = FCV_TMP1/10;
			FCV_DEC_U = FCV_TMP1 % 10;
			FCV_TMP1 = (FCV_DEC_T << 4);
			FCV_TMP1 = FCV_TMP1 + FCV_DEC_U;
			

			//Call Macro
			//Makro-Aufruf: Daten_RTC_setzen(0xA2, TMP1, 0x03)
			FCM_Daten_RTC_setzen(0xA2, FCV_TMP1, 0x03);


			//Löschen
			//C-Kode:
			// Variablen wieder lÃ¶schen
			FCV_RS232_32 = 0;
			FCV_RS232_33 = 0;
			FCV_TMP1 = 0;
			FCV_TMP2 = 0;


			break;
		}

		case 3:
		{
			//Kommentar:
			//Register 04 beschreiben


			//Variable kopieren
			//C-Kode:
			//  kopieren
			FCV_TMP1 = FCV_RS232_32;




			//Überwachung und Ausblendung Stundenkennung
			//C-Kode:
			// Ã?berwachung auf > 23 Stunden -> nicht mÃ¶glich !
			if (FCV_TMP1 > 23) 
			{
			FCV_TMP1 = 23;
			}

			// Stundenkennung rausfiltern 00xx xxxx
			FCV_TMP1 = FCV_TMP1 & 0x3F; 


			//Dec->BCD
			//Berechnung:
			//  dec_t = TMP1/10
			//  dec_u = TMP1 MOD 10
			//  TMP1 = (dec_t << 4)
			//  TMP1 = TMP1 + dec_u
			FCV_DEC_T = FCV_TMP1/10;
			FCV_DEC_U = FCV_TMP1 % 10;
			FCV_TMP1 = (FCV_DEC_T << 4);
			FCV_TMP1 = FCV_TMP1 + FCV_DEC_U;
			

			//Call Macro
			//Makro-Aufruf: Daten_RTC_setzen(0xA2, TMP1, 0x04)
			FCM_Daten_RTC_setzen(0xA2, FCV_TMP1, 0x04);


			//Löschen
			//C-Kode:
			// Variablen wieder lÃ¶schen
			FCV_RS232_32 = 0;
			FCV_RS232_33 = 0;
			FCV_TMP1 = 0;
			FCV_TMP2 = 0;


			break;
		}

		case 4:
		{
			//Kommentar:
			//Register 05 beschreiben


			//Variable kopieren
			//C-Kode:
			//  kopieren
			FCV_TMP1 = FCV_RS232_32;




			//Überwachung
			//C-Kode:
			// Ã?berwachung auf > und plausible Werte
			// Hierzu wird die Variable geteilt und dann Ã¼berwacht
			// und wieder zusammengefÃ¼gt

			FCV_TMP2 = FCV_TMP1 & 0xF0; // HÃ¶herwertiger Teil Bit 4...7
			FCV_TMP1 = FCV_TMP1 & 0x0F; // Niederwertiger Teil Bit 0...3

			if (FCV_TMP2 > 240)
			{
			FCV_TMP2 = 240;
			}

			if (FCV_TMP1 > 9)
			{
			FCV_TMP1 = 9;
			}




			//Dec->BCD (nur L-Word)
			//Berechnung:
			//  dec_t = TMP1/10
			//  dec_u = TMP1 MOD 10
			//  TMP1 = (dec_t << 4)
			//  TMP1 = TMP1 + dec_u
			FCV_DEC_T = FCV_TMP1/10;
			FCV_DEC_U = FCV_TMP1 % 10;
			FCV_TMP1 = (FCV_DEC_T << 4);
			FCV_TMP1 = FCV_TMP1 + FCV_DEC_U;
			

			//C Code
			//C-Kode:
			// Teilvariablen wieder zusammenfÃ¼gen
			FCV_TMP1 = FCV_TMP2 | FCV_TMP1;



			//Call Macro
			//Makro-Aufruf: Daten_RTC_setzen(0xA2, TMP1, 0x05)
			FCM_Daten_RTC_setzen(0xA2, FCV_TMP1, 0x05);


			//Löschen
			//C-Kode:
			// Variablen wieder lÃ¶schen
			FCV_RS232_32 = 0;
			FCV_RS232_33 = 0;
			FCV_TMP1 = 0;
			FCV_TMP2 = 0;


			break;
		}

		case 5:
		{
			//Kommentar:
			//Register 06 beschreiben


			//Variable kopieren
			//C-Kode:
			//  kopieren
			FCV_TMP1 = FCV_RS232_32;




			//Überwachung
			//C-Kode:
			// Ã?berwachung auf > und plausible Werte
			// Hierzu wird die Variable geteilt und dann Ã¼berwacht
			// und wieder zusammengefÃ¼gt

			FCV_TMP2 = FCV_TMP1 & 0xF0; // HÃ¶herwertiger Teil Bit 4...7
			FCV_TMP1 = FCV_TMP1 & 0x0F; // Niederwertiger Teil Bit 0...3

			if (FCV_TMP2 > 208)
			{
			FCV_TMP2 = 208;
			}

			if (FCV_TMP1 > 9)
			{
			FCV_TMP1 = 9;
			}




			//Dec->BCD
			//Berechnung:
			//  dec_t = TMP1/10
			//  dec_u = TMP1 MOD 10
			//  TMP1 = (dec_t << 4)
			//  TMP1 = TMP1 + dec_u
			FCV_DEC_T = FCV_TMP1/10;
			FCV_DEC_U = FCV_TMP1 % 10;
			FCV_TMP1 = (FCV_DEC_T << 4);
			FCV_TMP1 = FCV_TMP1 + FCV_DEC_U;
			

			//C Code
			//C-Kode:
			// Teilvariablen wieder zusammenfÃ¼gen
			FCV_TMP1 = FCV_TMP2 | FCV_TMP1;



			//Call Macro
			//Makro-Aufruf: Daten_RTC_setzen(0xA2, TMP1, 0x06)
			FCM_Daten_RTC_setzen(0xA2, FCV_TMP1, 0x06);


			//Löschen
			//C-Kode:
			// Variablen wieder lÃ¶schen
			FCV_RS232_32 = 0;
			FCV_RS232_33 = 0;
			FCV_TMP1 = 0;
			FCV_TMP2 = 0;


			break;
		}

		case 255:
		{
			//Kommentar:
			//Neustart des PIC ausführen


			//Call Component Macro
			//Aufruf Komponenten-Makro: LCDDisplay(0)::Clear
			FCD_LCDDisplay0_Clear();


			//Call Component Macro
			//Aufruf Komponenten-Makro: LCDDisplay(0)::PrintString("*** NEUSTART ***")
			FCD_LCDDisplay0_PrintString("*** NEUSTART ***",16);


			//Löschen
			//C-Kode:
			// Variablen wieder lÃ¶schen
			FCV_RS232_32 = 0;
			FCV_RS232_33 = 0;



			//Delay
			//Warten: 1 s
			delay_s(1);


			//Output
			//Output: 1 -> A0
			trisa = trisa & 0xfe;
			if (1)
				porta = (porta & 0xfe) | 0x01;
			else
				porta = porta & 0xfe;


			//Kommentar:
			//Ab hier passiert ein Master-Reset mit MCRL,
			//da braucht nicht mehr gelöscht zu werden.


			break;
		}

		case 254:
		{
			//Kommentar:
			//Register für die Schaltzeiten beschreiben


			//C Code
			//C-Kode:
			FCV_TMP1 = FCV_RS232_36; // Std
			FCV_TMP2 = FCV_RS232_37; // Min
			FCV_TMP3 = FCV_RS232_38; // LSB
			FCV_TMP4 = FCV_RS232_39; // MSB



			//EEPROM beschreiben
			//Makro-Aufruf: Daten_EEPROM_WR(TMP4, TMP3, 0xA0, TMP1, TMP2)
			FCM_Daten_EEPROM_WR(FCV_TMP4, FCV_TMP3, 0xA0, FCV_TMP1, FCV_TMP2);


			//Löschen
			//C-Kode:
			FCV_TMP1 = 0; // Std
			FCV_TMP2 = 0; // Min
			FCV_TMP3 = 0; // LSB
			FCV_TMP4 = 0; // MSB
			FCV_RS232_32 = 0;
			FCV_RS232_33 = 0;
			FCV_RS232_36 = 0;
			FCV_RS232_37 = 0;
			FCV_RS232_38 = 0;
			FCV_RS232_39 = 0;


			break;
		}

		case 253:
		{
			//Kommentar:
			//Register für die Schaltzeiten auslesen
			//Übergeben vom PC wird nur die MSB/LSB der Startadresse.
			//Der PIC senden dann die Schaltzeiten ab dieser Adresse zurück.


			//C Code
			//C-Kode:
			FCV_TMP3 = FCV_RS232_38; // LSB // Wochentagszahl (alle 256 Bytes)
			FCV_TMP4 = FCV_RS232_39; // MSB // Offset innerhalb des Wochentag (+ 1Byte)
			FCV_TMP = 1; // TemporÃ¤re Variable besetzen



			//Connection Point
			//Verbindungspunkt: [C]: C
FCC_Main_C:
;


			//EEPROM auslesen
			//Makro-Aufruf: RetVal=Daten_EEPROM_RD(TMP4, TMP3, 0xA0)
			FCV_RETVAL = FCM_Daten_EEPROM_RD(FCV_TMP4, FCV_TMP3, 0xA0);


			//Call Component Macro
			//Aufruf Komponenten-Makro: RS232(0)::SendRS232Char(RetVal)
			FCD_RS2320_SendRS232Char(FCV_RETVAL);


			//Decision
			//Entscheidung: Tmp = 25?
			if (FCV_TMP == 25)
			{
			} else {
				//Calculation
				//Berechnung:
				//  Tmp = Tmp + 1
				//  TMP4 = TMP4 + 1
				FCV_TMP = FCV_TMP + 1;
				FCV_TMP4 = FCV_TMP4 + 1;
				

				//Goto Connection Point
				//Gehe zum Verbindungspunkt: [C]: C
				goto FCC_Main_C;


			}


			//Löschen
			//C-Kode:
			FCV_TMP3 = 0; // LSB
			FCV_TMP4 = 0; // MSB
			FCV_RS232_32 = 0;
			FCV_RS232_33 = 0;
			FCV_RS232_38 = 0;
			FCV_RS232_39 = 0;


			break;
		}

	}


	//Decision
	//Entscheidung: Takt_1s = 1?
	if (FCV_TAKT_1S == 1)
	{
		//RTC auslesen
		//Makro-Aufruf: RetVal0=Daten_RTC_auslesen(0xA2)
		FCV_RETVAL0 = FCM_Daten_RTC_auslesen(0xA2);


		//Call Component Macro
		//Aufruf Komponenten-Makro: LCDDisplay(0)::Cursor(0, 0)
		FCD_LCDDisplay0_Cursor(0, 0);


		//Zeit zusammenbasteln
		//String Manipulation:
		//  Sek = ToString$(RTC_sec_1)
		//  ZSek = ToString$(RTC_sec_10)
		//  Min = ToString$(RTC_min_1)
		//  ZMin = ToString$(RTC_min_10)
		//  Std = ToString$(RTC_std_1)
		//  ZStd = ToString$(RTC_std_10)
		//  Sek = ZSek + Sek
		//  Min = ZMin + Min
		//  Std = ZStd + Std
		//  Zeit = Min + ":" + Sek
		//  Zeit = Std + ":" + Zeit
		//  MIN_SCH = StringToInt$(Min)
		//  STD_SCH = StringToInt$(Std)
		FCI_TOSTRING(FCV_RTC_SEC_1,FCV_SEK,FCSZ_SEK);
		FCI_TOSTRING(FCV_RTC_SEC_10,FCV_ZSEK,FCSZ_ZSEK);
		FCI_TOSTRING(FCV_RTC_MIN_1,FCV_MIN,FCSZ_MIN);
		FCI_TOSTRING(FCV_RTC_MIN_10,FCV_ZMIN,FCSZ_ZMIN);
		FCI_TOSTRING(FCV_RTC_STD_1,FCV_STD,FCSZ_STD);
		FCI_TOSTRING(FCV_RTC_STD_10,FCV_ZSTD,FCSZ_ZSTD);
		FCI_CONCATENATE(FCV_ZSEK,FCSZ_ZSEK,FCV_SEK,FCSZ_SEK,FCV_SEK,FCSZ_SEK);
		FCI_CONCATENATE(FCV_ZMIN,FCSZ_ZMIN,FCV_MIN,FCSZ_MIN,FCV_MIN,FCSZ_MIN);
		FCI_CONCATENATE(FCV_ZSTD,FCSZ_ZSTD,FCV_STD,FCSZ_STD,FCV_STD,FCSZ_STD);
		FCI_CONCATENATE(FCV_MIN,FCSZ_MIN,":",1,FCI_TMP_STR,20);
		FCI_CONCATENATE(FCI_TMP_STR,20,FCV_SEK,FCSZ_SEK,FCV_ZEIT,FCSZ_ZEIT);
		FCI_CONCATENATE(FCV_STD,FCSZ_STD,":",1,FCI_TMP_STR,20);
		FCI_CONCATENATE(FCI_TMP_STR,20,FCV_ZEIT,FCSZ_ZEIT,FCV_ZEIT,FCSZ_ZEIT);
		FCV_MIN_SCH = FCI_STRING_TO_INT(FCV_MIN,FCSZ_MIN);
		FCV_STD_SCH = FCI_STRING_TO_INT(FCV_STD,FCSZ_STD);
		

		//Datum zusammenbasteln
		//String Manipulation:
		//  Tag = ToString$(RTC_Tag_1)
		//  ZTag = ToString$(RTC_Tag_10)
		//  Mon1 = ToString$(RTC_Mon_1)
		//  ZMon = ToString$(RTC_Mon_10)
		//  Tag = ZTag + Tag
		//  Mon1 = ZMon + Mon1
		//  Datum = Tag + "." + Mon1
		//  Jahr = ToString$(RTC_Jahr)
		//  Datum = Datum + "." + Jahr
		FCI_TOSTRING(FCV_RTC_TAG_1,FCV_TAG,FCSZ_TAG);
		FCI_TOSTRING(FCV_RTC_TAG_10,FCV_ZTAG,FCSZ_ZTAG);
		FCI_TOSTRING(FCV_RTC_MON_1,FCV_MON1,FCSZ_MON1);
		FCI_TOSTRING(FCV_RTC_MON_10,FCV_ZMON,FCSZ_ZMON);
		FCI_CONCATENATE(FCV_ZTAG,FCSZ_ZTAG,FCV_TAG,FCSZ_TAG,FCV_TAG,FCSZ_TAG);
		FCI_CONCATENATE(FCV_ZMON,FCSZ_ZMON,FCV_MON1,FCSZ_MON1,FCV_MON1,FCSZ_MON1);
		FCI_CONCATENATE(FCV_TAG,FCSZ_TAG,".",1,FCI_TMP_STR,20);
		FCI_CONCATENATE(FCI_TMP_STR,20,FCV_MON1,FCSZ_MON1,FCV_DATUM,FCSZ_DATUM);
		FCI_TOSTRING(FCV_RTC_JAHR,FCV_JAHR,FCSZ_JAHR);
		FCI_CONCATENATE(FCV_DATUM,FCSZ_DATUM,".",1,FCI_TMP_STR,20);
		FCI_CONCATENATE(FCI_TMP_STR,20,FCV_JAHR,FCSZ_JAHR,FCV_DATUM,FCSZ_DATUM);
		

		//Call Component Macro
		//Aufruf Komponenten-Makro: LCDDisplay(0)::PrintString(Zeit)
		FCD_LCDDisplay0_PrintString(FCV_ZEIT,FCSZ_ZEIT);


		//Call Component Macro
		//Aufruf Komponenten-Makro: LCDDisplay(0)::Cursor(0, 1)
		FCD_LCDDisplay0_Cursor(0, 1);


		//Call Component Macro
		//Aufruf Komponenten-Makro: LCDDisplay(0)::PrintString(Wochentag)
		FCD_LCDDisplay0_PrintString(FCV_WOCHENTAG,FCSZ_WOCHENTAG);


		//Call Component Macro
		//Aufruf Komponenten-Makro: LCDDisplay(0)::Cursor(0, 2)
		FCD_LCDDisplay0_Cursor(0, 2);


		//Call Component Macro
		//Aufruf Komponenten-Makro: LCDDisplay(0)::PrintString(Datum)
		FCD_LCDDisplay0_PrintString(FCV_DATUM,FCSZ_DATUM);


		//1.EIN_AUS
		//Makro-Aufruf: PmpFRG_SchZt(RTC_Wochentag, LM75_am_Bedienpanel_H, 0, MIN_SCH, STD_SCH, 0)
		FCM_PmpFRG_SchZt(FCV_RTC_WOCHENTAG, FCV_LM75_AM_BEDIENPANEL_H, 0, FCV_MIN_SCH, FCV_STD_SCH, 0);


		//2.EIN_AUS
		//Makro-Aufruf: PmpFRG_SchZt(RTC_Wochentag, LM75_am_Bedienpanel_H, 4, MIN_SCH, STD_SCH, 0)
		FCM_PmpFRG_SchZt(FCV_RTC_WOCHENTAG, FCV_LM75_AM_BEDIENPANEL_H, 4, FCV_MIN_SCH, FCV_STD_SCH, 0);


		//3.EIN_AUS
		//Makro-Aufruf: PmpFRG_SchZt(RTC_Wochentag, LM75_am_Bedienpanel_H, 8, MIN_SCH, STD_SCH, 0)
		FCM_PmpFRG_SchZt(FCV_RTC_WOCHENTAG, FCV_LM75_AM_BEDIENPANEL_H, 8, FCV_MIN_SCH, FCV_STD_SCH, 0);


		//4.EIN_AUS
		//Makro-Aufruf: PmpFRG_SchZt(RTC_Wochentag, LM75_am_Bedienpanel_H, 12, MIN_SCH, STD_SCH, 0)
		FCM_PmpFRG_SchZt(FCV_RTC_WOCHENTAG, FCV_LM75_AM_BEDIENPANEL_H, 12, FCV_MIN_SCH, FCV_STD_SCH, 0);


		//5.EIN_AUS
		//Makro-Aufruf: PmpFRG_SchZt(RTC_Wochentag, LM75_am_Bedienpanel_H, 16, MIN_SCH, STD_SCH, 1)
		FCM_PmpFRG_SchZt(FCV_RTC_WOCHENTAG, FCV_LM75_AM_BEDIENPANEL_H, 16, FCV_MIN_SCH, FCV_STD_SCH, 1);


		//6.EIN_AUS
		//Makro-Aufruf: PmpFRG_SchZt(RTC_Wochentag, LM75_am_Bedienpanel_H, 20, MIN_SCH, STD_SCH, 1)
		FCM_PmpFRG_SchZt(FCV_RTC_WOCHENTAG, FCV_LM75_AM_BEDIENPANEL_H, 20, FCV_MIN_SCH, FCV_STD_SCH, 1);


		//Calculation
		//Berechnung:
		//  Takt_1s = 0
		FCV_TAKT_1S = 0;
		

		//Call Component Macro
		//Aufruf Komponenten-Makro: LCDDisplay(0)::Cursor(13, 0)
		FCD_LCDDisplay0_Cursor(13, 0);


		//Call Component Macro
		//Aufruf Komponenten-Makro: LCDDisplay(0)::PrintString("   ")
		FCD_LCDDisplay0_PrintString("   ",3);


		//Decision
		//Entscheidung: SchaltzeitAktiv = 1?
		if (FCV_SCHALTZEITAKTIV == 1)
		{
			//Call Component Macro
			//Aufruf Komponenten-Makro: LCDDisplay(0)::Cursor(15, 0)
			FCD_LCDDisplay0_Cursor(15, 0);


			//Call Component Macro
			//Aufruf Komponenten-Makro: LCDDisplay(0)::PrintString("F")
			FCD_LCDDisplay0_PrintString("F",1);


		}


		//Decision
		//Entscheidung: ZwangAktiv= 1?
		if (FCV_ZWANGAKTIV== 1)
		{
			//Call Component Macro
			//Aufruf Komponenten-Makro: LCDDisplay(0)::Cursor(15, 0)
			FCD_LCDDisplay0_Cursor(15, 0);


			//ZZZ
			//Aufruf Komponenten-Makro: LCDDisplay(0)::PrintString("Z")
			FCD_LCDDisplay0_PrintString("Z",1);


		}


		//Decision
		//Entscheidung: Zeit1Min <> 0?
		if (FCV_ZEIT1MIN != 0)
		{
			//C Code
			//C-Kode:
			FCV_PUMPEEIN.2 = 1; // Zwang Ein Aus vom Panel (1Min)



			//Calculation
			//Berechnung:
			//  Zeit1Min = Zeit1Min - 1
			FCV_ZEIT1MIN = FCV_ZEIT1MIN - 1;
			

			//MMM
			//Aufruf Komponenten-Makro: LCDDisplay(0)::Cursor(14, 0)
			FCD_LCDDisplay0_Cursor(14, 0);


			//Call Component Macro
			//Aufruf Komponenten-Makro: LCDDisplay(0)::PrintNumber(Zeit1Min)
			FCD_LCDDisplay0_PrintNumber(FCV_ZEIT1MIN);


		} else {
			//C Code
			//C-Kode:
			FCV_PUMPEEIN.2 = 0; // Zwang Ein Aus vom Panel (1Min)



		}


		//Decision
		//Entscheidung: Zeit20Min <> 0?
		if (FCV_ZEIT20MIN != 0)
		{
			//C Code
			//C-Kode:
			FCV_PUMPEDTEINAUS = 1; // DeltaT Ein vom Panel (20Min)



			//Calculation
			//Berechnung:
			//  Zeit20Min = Zeit20Min - 1
			FCV_ZEIT20MIN = FCV_ZEIT20MIN - 1;
			

			//Call Component Macro
			//Aufruf Komponenten-Makro: LCDDisplay(0)::Cursor(13, 0)
			FCD_LCDDisplay0_Cursor(13, 0);


			//Call Component Macro
			//Aufruf Komponenten-Makro: LCDDisplay(0)::PrintNumber(Zeit20Min)
			FCD_LCDDisplay0_PrintNumber(FCV_ZEIT20MIN);


		} else {
			//C Code
			//C-Kode:
			FCV_PUMPEDTEINAUS = 0; // DeltaT Ein vom Panel (5Min)



		}


	}


	//Decision
	//Entscheidung: Takt_65ms = 1?
	if (FCV_TAKT_65MS == 1)
	{
		//Calculation
		//Berechnung:
		//  Takt_65ms = 0
		FCV_TAKT_65MS = 0;
		

		//Kommentar:
		//Panel bearbeiten
		//Einlesen / Ausgeben


		//PanelTastenEinlesen
		//Makro-Aufruf: PanelTastenEinlesen
		FCM_PanelTastenEinlesen();


		//PanelLEDsAusgeben
		//Makro-Aufruf: PanelLEDsAusgeben
		FCM_PanelLEDsAusgeben();


		//Kommentar:
		//Temperaturen einlesen


		//Temperaturen einlesen
		//Makro-Aufruf: TemperaturenEinlesen
		FCM_TemperaturenEinlesen();


		//Unplausible Temperaturen melden
		//C-Kode:
		if(FCV_LM75_AM_BEDIENPANEL_H > (FCV_LM75_AM_BOILER_H + 5))
		{
		FCV_FEHLERVAR.5 = 1;
		}



		//Pumpe ein wenn Übertemperatur
		//C-Kode:
		if(FCV_LM75_AM_BOILER_H > 85)
		{
		FCV_PUMPEEIN.3 = 1; // Zwang Ein wegen Ã?bertemperatur
		FCD_LCDDisplay0_Cursor(14, 0);
		FCD_LCDDisplay0_PrintString("U",1);
		FCV_FEHLERVAR.6 = 1;
		}

		if(FCV_LM75_AM_BOILER_H < 82)
		{
		FCV_PUMPEEIN.3 = 0; // wieder ausschalten
		}


		//Kommentar:
		//STÖRUNG - LED auf Platine ansteuern


		//Decision
		//Entscheidung: FehlerVar <> 0?
		if (FCV_FEHLERVAR != 0)
		{
			//Output
			//Output: 0 -> C2
			trisc = trisc & 0xfb;
			if (0)
				portc = (portc & 0xfb) | 0x04;
			else
				portc = portc & 0xfb;


			//Call Component Macro
			//Aufruf Komponenten-Makro: LCDDisplay(0)::Cursor(0, 4)
			FCD_LCDDisplay0_Cursor(0, 4);


			//Call Component Macro
			//Aufruf Komponenten-Makro: LCDDisplay(0)::Cursor(0, 4)
			FCD_LCDDisplay0_Cursor(0, 4);


			//nnn
			//Aufruf Komponenten-Makro: LCDDisplay(0)::PrintString("Fehler:         ")
			FCD_LCDDisplay0_PrintString("Fehler:         ",16);


			//Call Component Macro
			//Aufruf Komponenten-Makro: LCDDisplay(0)::Cursor(8, 4)
			FCD_LCDDisplay0_Cursor(8, 4);


			//Call Component Macro
			//Aufruf Komponenten-Makro: LCDDisplay(0)::PrintNumber(FehlerVar)
			FCD_LCDDisplay0_PrintNumber(FCV_FEHLERVAR);


		} else {
			//Output
			//Output: 1 -> C2
			trisc = trisc & 0xfb;
			if (1)
				portc = (portc & 0xfb) | 0x04;
			else
				portc = portc & 0xfb;


		}


	}


	//Goto Connection Point
	//Gehe zum Verbindungspunkt: [A]: A
	goto FCC_Main_A;


	mainendloop: goto mainendloop;
}

void MX_INTERRUPT_MACRO(void)
{
	//Handler code for [TMR0]
	#ifndef MX_INTHANDLER_intcon_T0IF
	#define MX_INTHANDLER_intcon_T0IF
	if (ts_bit(intcon, T0IF) && ts_bit(intcon, T0IE))
	{
		FCM_Timer_Zeitscheiben_Bearbeitung();
		cr_bit(intcon, T0IF);
	}
	#else
	#warning "This interrupt has previously been enabled, so the macro <Timer_Zeitscheiben_Bearbeitung> may never get called."
	#endif


	//Handler code for [RS232Interrupt]
	if (pir1 & (1 << RCIF))
	{
	FCM_Reaktion_auf_RS232(); // call selected macro
	clear_bit(pir1, RCIF); // clear interrupt
	}

}



