//************************************************************************************
//**  
//**  File name:     C:\Documents and Settings\M\Desktop\PWM\Fan.c
//**  Title:         
//**  Description:   
//**  
//**  Generated by:  Flowcode v5.3.0.0
//**  Date:          Tuesday, August 14, 2012 17:09:41
//**  Licence:       Free version
//**  
//**        ***FREE/DEMO VERSION***
//**  
//**  
//**     NOT FOR COMMERCIAL USE
//**  
//**  http://www.matrixmultimedia.com
//**  
//************************************************************************************


#define MX_AVR

#define MX_USES_UINT8 1
#define MX_USES_SINT16 1
#define MX_USES_CHAR 0
#define MX_USES_FLOAT 0
#define MX_USES_SINT32 0
#define MX_USES_BOOL 1
#define MX_USES_UINT16 0
#define MX_USES_UINT32 0
//Defines for microcontroller
#define FC_CAL_AVR
#define MX_ADC
#define MX_ADC_TYPE_1
#define MX_ADC_BITS_10
#define MX_EE
#define MX_EE_SIZE 1024
#define MX_SPI_1
#define MX_SPI_1_MISO_PORT PORTB
#define MX_SPI_1_MISO_TRIS DDRB
#define MX_SPI_1_MISO_PIN 6
#define MX_SPI_1_MOSI_PORT PORTB
#define MX_SPI_1_MOSI_TRIS DDRB
#define MX_SPI_1_MOSI_PIN 5
#define MX_SPI_1_CLK_PORT PORTB
#define MX_SPI_1_CLK_TRIS DDRB
#define MX_SPI_1_CLK_PIN 7
#define MX_SPI_1_SS_PORT PORTB
#define MX_SPI_1_SS_TRIS DDRB
#define MX_SPI_1_SS_PIN 4
#define MX_UART_1
#define MX_UART_1_TX_PORT PORTD
#define MX_UART_1_TX_TRIS DDRD
#define MX_UART_1_TX_PIN 1
#define MX_UART_1_RX_PORT PORTD
#define MX_UART_1_RX_TRIS DDRD
#define MX_UART_1_RX_PIN 0
#define MX_MI2C
#define MX_I2C_1
#define MX_I2C_1_SDA_PORT PORTC
#define MX_I2C_1_SDA_TRIS DDRC
#define MX_I2C_1_SDA_PIN 1
#define MX_I2C_1_SCL_PORT PORTC
#define MX_I2C_1_SCL_TRIS DDRC
#define MX_I2C_1_SCL_PIN 0
#define MX_PWM
#define MX_PWMTYPE 1
#define MX_PWM_CNT 3
#define MX_PWM_TMR0_CNT 1
#define MX_PWM_TMR1_CNT 2
#define MX_PWM_PSCA1
#define MX_PWM_PSCA8
#define MX_PWM_PSCA64
#define MX_PWM_PSCA256
#define MX_PWM_PSCA1024
#define MX_PWM_1_PORT PORTB
#define MX_PWM_1_TRIS DDRB
#define MX_PWM_1_PIN 3
#define MX_PWM_2_PORT PORTD
#define MX_PWM_2_TRIS DDRD
#define MX_PWM_2_PIN 5
#define MX_PWM_3_PORT PORTD
#define MX_PWM_3_TRIS DDRD
#define MX_PWM_3_PIN 4

//Functions
#define F_CPU 20000000UL
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <avr\io.h>
#include <avr\interrupt.h>
#include <avr\eeprom.h>
#include <avr\wdt.h>

//Configuration data
#pragma DATA 0x0, 0xdf
#pragma DATA 0x1, 0xff

//Internal functions
#include "C:\Program Files\Flowcode(AVR)\v5\FCD\internals.c"

//Macro function declarations


//Variable declarations
#define FCV_TRUE (1)
#define FCV_FALSE (0)
volatile MX_SINT16 FCV_VAL1;
volatile MX_SINT16 FCV_VAL2;
volatile MX_SINT16 FCV_VAL3;




//PWM(0): //Defines:

/**** Macro Substitutions ****
a = Unique Reference
b = PWM Channel - 0=SW / 1-8=HW
c = PWM Alt Pin FCD_PWM0_Enable - 0=Standard / 1=Alt
d = PWM Period
e = PWM Prescaler 1
******************************/

//Period and Prescaler Defines
#ifndef MX_PWM_PERIOD
  #define MX_PWM_PERIOD				255
#else
  #if (MX_PWM_PERIOD != 255)
    #error "PWM period value must be the same in all PWM modules"
  #endif
#endif

#ifndef MX_PWM_PRESCALE1
  #define MX_PWM_PRESCALE1			1
#else
  #if (MX_PWM_PRESCALE1 != 1)
    #error "PWM prescale value must be the same in all PWM modules"
  #endif
#endif

//Definitions for PWM slot allocation
#ifndef	MX_PWM_REF1
			#define MX_PWM_REF1
			#define PWM_1_MX_PWM_UREF			1
			#define MX_PWM_CHANNEL_1		1
			#define MX_PWM_HWALT_1			0
#else
 #ifndef	MX_PWM_REF2
			#define MX_PWM_REF2
			#define PWM_1_MX_PWM_UREF			2
			#define MX_PWM_CHANNEL_2		1
			#define MX_PWM_HWALT_2			0
 #else
  #ifndef	MX_PWM_REF3
			#define MX_PWM_REF3
			#define PWM_1_MX_PWM_UREF			3
			#define MX_PWM_CHANNEL_3		1
			#define MX_PWM_HWALT_3			0
  #else
   #ifndef	MX_PWM_REF4
			#define MX_PWM_REF4
			#define PWM_1_MX_PWM_UREF			4
			#define MX_PWM_CHANNEL_4		1
			#define MX_PWM_HWALT_4			0
   #else
    #ifndef	MX_PWM_REF5
			#define MX_PWM_REF5
			#define PWM_1_MX_PWM_UREF			5
			#define MX_PWM_CHANNEL_5		1
			#define MX_PWM_HWALT_5			0
    #else
     #ifndef	MX_PWM_REF6
			#define MX_PWM_REF6
			#define PWM_1_MX_PWM_UREF			6
			#define MX_PWM_CHANNEL_6		1
			#define MX_PWM_HWALT_6			0
     #else
      #ifndef	MX_PWM_REF7
			#define MX_PWM_REF7
			#define PWM_1_MX_PWM_UREF			7
			#define MX_PWM_CHANNEL_7		1
			#define MX_PWM_HWALT_7			0
      #else
       #ifndef	MX_PWM_REF8
			#define MX_PWM_REF8
			#define PWM_1_MX_PWM_UREF			8
			#define MX_PWM_CHANNEL_8		1
			#define MX_PWM_HWALT_8			0
       #else
        #ifndef	MX_PWM_REF9
			#define MX_PWM_REF9
			#define PWM_1_MX_PWM_UREF			9
			#define MX_PWM_CHANNEL_9		1
			#define MX_PWM_HWALT_9			0
        #else
         #ifndef	MX_PWM_REF10
			#define MX_PWM_REF10
			#define PWM_1_MX_PWM_UREF			10
			#define MX_PWM_CHANNEL_10		1
			#define MX_PWM_HWALT_10			0
         #endif
        #endif
       #endif
      #endif
     #endif
    #endif
   #endif
  #endif
 #endif
#endif

#define PWM_1_PWM_Enable_Channel		CAL_APPEND(FC_CAL_PWM_Enable_Channel_, PWM_1_MX_PWM_UREF)
#define PWM_1_PWM_Disable_Channel		CAL_APPEND(FC_CAL_PWM_Disable_Channel_, PWM_1_MX_PWM_UREF)
#define PWM_1_PWM_Set_Duty_8Bit		CAL_APPEND(FC_CAL_PWM_Set_Duty_8Bit_, PWM_1_MX_PWM_UREF)
#define PWM_1_PWM_Change_Period		CAL_APPEND(FC_CAL_PWM_Change_Period_, PWM_1_MX_PWM_UREF)
#define PWM_1_PWM_Set_Duty_10Bit		CAL_APPEND(FC_CAL_PWM_Set_Duty_10Bit_, PWM_1_MX_PWM_UREF)

extern void PWM_1_PWM_Enable_Channel ();
extern void PWM_1_PWM_Disable_Channel ();
extern void PWM_1_PWM_Set_Duty_8Bit (MX_UINT8 duty);
extern void PWM_1_PWM_Change_Period (MX_UINT8 period, MX_UINT16 prescaler);
extern void PWM_1_PWM_Set_Duty_10Bit (MX_UINT16 duty);




//PWM(0): //Macro function declarations

static void FCD_PWM0_Enable();
static void FCD_PWM0_Disable();
static void FCD_PWM0_SetDutyCycle(MX_UINT8 nDuty);
static void FCD_PWM0_ChangePeriod(MX_UINT8 nPeriodVal, MX_UINT8 nPrescalerVal);
static void FCD_PWM0_SetDutyCycle10bit(MX_SINT16 nDuty);


//PWM(1): //Defines:

/**** Macro Substitutions ****
a = Unique Reference
b = PWM Channel - 0=SW / 1-8=HW
c = PWM Alt Pin FCD_PWM1_Enable - 0=Standard / 1=Alt
d = PWM Period
e = PWM Prescaler 1
******************************/

//Period and Prescaler Defines
#ifndef MX_PWM_PERIOD
  #define MX_PWM_PERIOD				255
#else
  #if (MX_PWM_PERIOD != 255)
    #error "PWM period value must be the same in all PWM modules"
  #endif
#endif

#ifndef MX_PWM_PRESCALE1
  #define MX_PWM_PRESCALE1			1
#else
  #if (MX_PWM_PRESCALE1 != 1)
    #error "PWM prescale value must be the same in all PWM modules"
  #endif
#endif

//Definitions for PWM slot allocation
#ifndef	MX_PWM_REF1
			#define MX_PWM_REF1
			#define PWM_2_MX_PWM_UREF			1
			#define MX_PWM_CHANNEL_1		2
			#define MX_PWM_HWALT_1			0
#else
 #ifndef	MX_PWM_REF2
			#define MX_PWM_REF2
			#define PWM_2_MX_PWM_UREF			2
			#define MX_PWM_CHANNEL_2		2
			#define MX_PWM_HWALT_2			0
 #else
  #ifndef	MX_PWM_REF3
			#define MX_PWM_REF3
			#define PWM_2_MX_PWM_UREF			3
			#define MX_PWM_CHANNEL_3		2
			#define MX_PWM_HWALT_3			0
  #else
   #ifndef	MX_PWM_REF4
			#define MX_PWM_REF4
			#define PWM_2_MX_PWM_UREF			4
			#define MX_PWM_CHANNEL_4		2
			#define MX_PWM_HWALT_4			0
   #else
    #ifndef	MX_PWM_REF5
			#define MX_PWM_REF5
			#define PWM_2_MX_PWM_UREF			5
			#define MX_PWM_CHANNEL_5		2
			#define MX_PWM_HWALT_5			0
    #else
     #ifndef	MX_PWM_REF6
			#define MX_PWM_REF6
			#define PWM_2_MX_PWM_UREF			6
			#define MX_PWM_CHANNEL_6		2
			#define MX_PWM_HWALT_6			0
     #else
      #ifndef	MX_PWM_REF7
			#define MX_PWM_REF7
			#define PWM_2_MX_PWM_UREF			7
			#define MX_PWM_CHANNEL_7		2
			#define MX_PWM_HWALT_7			0
      #else
       #ifndef	MX_PWM_REF8
			#define MX_PWM_REF8
			#define PWM_2_MX_PWM_UREF			8
			#define MX_PWM_CHANNEL_8		2
			#define MX_PWM_HWALT_8			0
       #else
        #ifndef	MX_PWM_REF9
			#define MX_PWM_REF9
			#define PWM_2_MX_PWM_UREF			9
			#define MX_PWM_CHANNEL_9		2
			#define MX_PWM_HWALT_9			0
        #else
         #ifndef	MX_PWM_REF10
			#define MX_PWM_REF10
			#define PWM_2_MX_PWM_UREF			10
			#define MX_PWM_CHANNEL_10		2
			#define MX_PWM_HWALT_10			0
         #endif
        #endif
       #endif
      #endif
     #endif
    #endif
   #endif
  #endif
 #endif
#endif

#define PWM_2_PWM_Enable_Channel		CAL_APPEND(FC_CAL_PWM_Enable_Channel_, PWM_2_MX_PWM_UREF)
#define PWM_2_PWM_Disable_Channel		CAL_APPEND(FC_CAL_PWM_Disable_Channel_, PWM_2_MX_PWM_UREF)
#define PWM_2_PWM_Set_Duty_8Bit		CAL_APPEND(FC_CAL_PWM_Set_Duty_8Bit_, PWM_2_MX_PWM_UREF)
#define PWM_2_PWM_Change_Period		CAL_APPEND(FC_CAL_PWM_Change_Period_, PWM_2_MX_PWM_UREF)
#define PWM_2_PWM_Set_Duty_10Bit		CAL_APPEND(FC_CAL_PWM_Set_Duty_10Bit_, PWM_2_MX_PWM_UREF)

extern void PWM_2_PWM_Enable_Channel ();
extern void PWM_2_PWM_Disable_Channel ();
extern void PWM_2_PWM_Set_Duty_8Bit (MX_UINT8 duty);
extern void PWM_2_PWM_Change_Period (MX_UINT8 period, MX_UINT16 prescaler);
extern void PWM_2_PWM_Set_Duty_10Bit (MX_UINT16 duty);




//PWM(1): //Macro function declarations

static void FCD_PWM1_Enable();
static void FCD_PWM1_Disable();
static void FCD_PWM1_SetDutyCycle(MX_UINT8 nDuty);
static void FCD_PWM1_ChangePeriod(MX_UINT8 nPeriodVal, MX_UINT8 nPrescalerVal);
static void FCD_PWM1_SetDutyCycle10bit(MX_SINT16 nDuty);


//PWM(2): //Defines:

/**** Macro Substitutions ****
a = Unique Reference
b = PWM Channel - 0=SW / 1-8=HW
c = PWM Alt Pin FCD_PWM2_Enable - 0=Standard / 1=Alt
d = PWM Period
e = PWM Prescaler 1
******************************/

//Period and Prescaler Defines
#ifndef MX_PWM_PERIOD
  #define MX_PWM_PERIOD				255
#else
  #if (MX_PWM_PERIOD != 255)
    #error "PWM period value must be the same in all PWM modules"
  #endif
#endif

#ifndef MX_PWM_PRESCALE1
  #define MX_PWM_PRESCALE1			1
#else
  #if (MX_PWM_PRESCALE1 != 1)
    #error "PWM prescale value must be the same in all PWM modules"
  #endif
#endif

//Definitions for PWM slot allocation
#ifndef	MX_PWM_REF1
			#define MX_PWM_REF1
			#define PWM_3_MX_PWM_UREF			1
			#define MX_PWM_CHANNEL_1		3
			#define MX_PWM_HWALT_1			0
#else
 #ifndef	MX_PWM_REF2
			#define MX_PWM_REF2
			#define PWM_3_MX_PWM_UREF			2
			#define MX_PWM_CHANNEL_2		3
			#define MX_PWM_HWALT_2			0
 #else
  #ifndef	MX_PWM_REF3
			#define MX_PWM_REF3
			#define PWM_3_MX_PWM_UREF			3
			#define MX_PWM_CHANNEL_3		3
			#define MX_PWM_HWALT_3			0
  #else
   #ifndef	MX_PWM_REF4
			#define MX_PWM_REF4
			#define PWM_3_MX_PWM_UREF			4
			#define MX_PWM_CHANNEL_4		3
			#define MX_PWM_HWALT_4			0
   #else
    #ifndef	MX_PWM_REF5
			#define MX_PWM_REF5
			#define PWM_3_MX_PWM_UREF			5
			#define MX_PWM_CHANNEL_5		3
			#define MX_PWM_HWALT_5			0
    #else
     #ifndef	MX_PWM_REF6
			#define MX_PWM_REF6
			#define PWM_3_MX_PWM_UREF			6
			#define MX_PWM_CHANNEL_6		3
			#define MX_PWM_HWALT_6			0
     #else
      #ifndef	MX_PWM_REF7
			#define MX_PWM_REF7
			#define PWM_3_MX_PWM_UREF			7
			#define MX_PWM_CHANNEL_7		3
			#define MX_PWM_HWALT_7			0
      #else
       #ifndef	MX_PWM_REF8
			#define MX_PWM_REF8
			#define PWM_3_MX_PWM_UREF			8
			#define MX_PWM_CHANNEL_8		3
			#define MX_PWM_HWALT_8			0
       #else
        #ifndef	MX_PWM_REF9
			#define MX_PWM_REF9
			#define PWM_3_MX_PWM_UREF			9
			#define MX_PWM_CHANNEL_9		3
			#define MX_PWM_HWALT_9			0
        #else
         #ifndef	MX_PWM_REF10
			#define MX_PWM_REF10
			#define PWM_3_MX_PWM_UREF			10
			#define MX_PWM_CHANNEL_10		3
			#define MX_PWM_HWALT_10			0
         #endif
        #endif
       #endif
      #endif
     #endif
    #endif
   #endif
  #endif
 #endif
#endif

#define PWM_3_PWM_Enable_Channel		CAL_APPEND(FC_CAL_PWM_Enable_Channel_, PWM_3_MX_PWM_UREF)
#define PWM_3_PWM_Disable_Channel		CAL_APPEND(FC_CAL_PWM_Disable_Channel_, PWM_3_MX_PWM_UREF)
#define PWM_3_PWM_Set_Duty_8Bit		CAL_APPEND(FC_CAL_PWM_Set_Duty_8Bit_, PWM_3_MX_PWM_UREF)
#define PWM_3_PWM_Change_Period		CAL_APPEND(FC_CAL_PWM_Change_Period_, PWM_3_MX_PWM_UREF)
#define PWM_3_PWM_Set_Duty_10Bit		CAL_APPEND(FC_CAL_PWM_Set_Duty_10Bit_, PWM_3_MX_PWM_UREF)

extern void PWM_3_PWM_Enable_Channel ();
extern void PWM_3_PWM_Disable_Channel ();
extern void PWM_3_PWM_Set_Duty_8Bit (MX_UINT8 duty);
extern void PWM_3_PWM_Change_Period (MX_UINT8 period, MX_UINT16 prescaler);
extern void PWM_3_PWM_Set_Duty_10Bit (MX_UINT16 duty);




//PWM(2): //Macro function declarations

static void FCD_PWM2_Enable();
static void FCD_PWM2_Disable();
static void FCD_PWM2_SetDutyCycle(MX_UINT8 nDuty);
static void FCD_PWM2_ChangePeriod(MX_UINT8 nPeriodVal, MX_UINT8 nPrescalerVal);
static void FCD_PWM2_SetDutyCycle10bit(MX_SINT16 nDuty);


//ADC(0): //Defines:

/**** Macro Substitutions ****
a = Unique Reference
b = Which ADC Channel
c = Acquisition time
d = Conversion Speed
e = VRef+ Option
f = VRef Voltage x 0.01V
******************************/

//Common Defines

#define ADC_4_MX_ADC_CHANNEL	1
#define ADC_4_MX_ADC_ACTIME	40
#define ADC_4_MX_ADC_CONVSP	5
#define ADC_4_MX_ADC_VREFOP	0
#define ADC_4_MX_ADC_VREFVOL	500

#ifndef MX_ADC_CHANNEL_1
 #define MX_ADC_CHANNEL_1			//Inform CAL ADC channel 1 is now in use.
#endif

#ifndef MX_ADC_REF					//Inform CAL ADC peripheral is now in use
 #define MX_ADC_REF
#endif

extern void FC_CAL_Enable_ADC (MX_UINT8 Channel, MX_UINT8 Conv_Speed, MX_UINT8 Vref, MX_UINT8 T_Charge);
extern MX_UINT16 FC_CAL_Sample_ADC (MX_UINT8 Sample_Mode);
extern void FC_CAL_Disable_ADC (void);




//ADC(0): //Macro function declarations

static void FCD_ADC0_SampleADC();
static MX_UINT8 FCD_ADC0_ReadAsByte();
static MX_UINT16 FCD_ADC0_ReadAsInt();
static MX_FLOAT FCD_ADC0_ReadAsVoltage();
static void FCD_ADC0_ReadAsString(MX_CHAR* FCR_RETVAL, MX_UINT8 FCR_RETVAL_SIZE);
static void FCD_ADC0_ADC_RAW_Configure_Channel();
static MX_UINT8 FCD_ADC0_ADC_RAW_Sample_Channel_Byte();
static MX_UINT16 FCD_ADC0_ADC_RAW_Sample_Channel_Int();
static MX_UINT8 FCD_ADC0_ADC_RAW_Average_Channel_Byte(MX_UINT8 NumSamples, MX_UINT8 DelayUs);
static MX_UINT16 FCD_ADC0_ADC_RAW_Average_Channel_Int(MX_UINT8 NumSamples, MX_UINT8 DelayUs);
static void FCD_ADC0_ADC_RAW_Disable_Channel();


//ADC(1): //Defines:

/**** Macro Substitutions ****
a = Unique Reference
b = Which ADC Channel
c = Acquisition time
d = Conversion Speed
e = VRef+ Option
f = VRef Voltage x 0.01V
******************************/

//Common Defines

#define ADC_5_MX_ADC_CHANNEL	0
#define ADC_5_MX_ADC_ACTIME	40
#define ADC_5_MX_ADC_CONVSP	5
#define ADC_5_MX_ADC_VREFOP	0
#define ADC_5_MX_ADC_VREFVOL	500

#ifndef MX_ADC_CHANNEL_0
 #define MX_ADC_CHANNEL_0			//Inform CAL ADC channel 0 is now in use.
#endif

#ifndef MX_ADC_REF					//Inform CAL ADC peripheral is now in use
 #define MX_ADC_REF
#endif

extern void FC_CAL_Enable_ADC (MX_UINT8 Channel, MX_UINT8 Conv_Speed, MX_UINT8 Vref, MX_UINT8 T_Charge);
extern MX_UINT16 FC_CAL_Sample_ADC (MX_UINT8 Sample_Mode);
extern void FC_CAL_Disable_ADC (void);




//ADC(1): //Macro function declarations

static void FCD_ADC1_SampleADC();
static MX_UINT8 FCD_ADC1_ReadAsByte();
static MX_UINT16 FCD_ADC1_ReadAsInt();
static MX_FLOAT FCD_ADC1_ReadAsVoltage();
static void FCD_ADC1_ReadAsString(MX_CHAR* FCR_RETVAL, MX_UINT8 FCR_RETVAL_SIZE);
static void FCD_ADC1_ADC_RAW_Configure_Channel();
static MX_UINT8 FCD_ADC1_ADC_RAW_Sample_Channel_Byte();
static MX_UINT16 FCD_ADC1_ADC_RAW_Sample_Channel_Int();
static MX_UINT8 FCD_ADC1_ADC_RAW_Average_Channel_Byte(MX_UINT8 NumSamples, MX_UINT8 DelayUs);
static MX_UINT16 FCD_ADC1_ADC_RAW_Average_Channel_Int(MX_UINT8 NumSamples, MX_UINT8 DelayUs);
static void FCD_ADC1_ADC_RAW_Disable_Channel();


//ADC(2): //Defines:

/**** Macro Substitutions ****
a = Unique Reference
b = Which ADC Channel
c = Acquisition time
d = Conversion Speed
e = VRef+ Option
f = VRef Voltage x 0.01V
******************************/

//Common Defines

#define ADC_6_MX_ADC_CHANNEL	2
#define ADC_6_MX_ADC_ACTIME	40
#define ADC_6_MX_ADC_CONVSP	5
#define ADC_6_MX_ADC_VREFOP	0
#define ADC_6_MX_ADC_VREFVOL	500

#ifndef MX_ADC_CHANNEL_2
 #define MX_ADC_CHANNEL_2			//Inform CAL ADC channel 2 is now in use.
#endif

#ifndef MX_ADC_REF					//Inform CAL ADC peripheral is now in use
 #define MX_ADC_REF
#endif

extern void FC_CAL_Enable_ADC (MX_UINT8 Channel, MX_UINT8 Conv_Speed, MX_UINT8 Vref, MX_UINT8 T_Charge);
extern MX_UINT16 FC_CAL_Sample_ADC (MX_UINT8 Sample_Mode);
extern void FC_CAL_Disable_ADC (void);




//ADC(2): //Macro function declarations

static void FCD_ADC2_SampleADC();
static MX_UINT8 FCD_ADC2_ReadAsByte();
static MX_UINT16 FCD_ADC2_ReadAsInt();
static MX_FLOAT FCD_ADC2_ReadAsVoltage();
static void FCD_ADC2_ReadAsString(MX_CHAR* FCR_RETVAL, MX_UINT8 FCR_RETVAL_SIZE);
static void FCD_ADC2_ADC_RAW_Configure_Channel();
static MX_UINT8 FCD_ADC2_ADC_RAW_Sample_Channel_Byte();
static MX_UINT16 FCD_ADC2_ADC_RAW_Sample_Channel_Int();
static MX_UINT8 FCD_ADC2_ADC_RAW_Average_Channel_Byte(MX_UINT8 NumSamples, MX_UINT8 DelayUs);
static MX_UINT16 FCD_ADC2_ADC_RAW_Average_Channel_Int(MX_UINT8 NumSamples, MX_UINT8 DelayUs);
static void FCD_ADC2_ADC_RAW_Disable_Channel();



//PWM(0): //Macro implementations


static void FCD_PWM0_Enable()
{
	
		PWM_1_PWM_Change_Period (MX_PWM_PERIOD, MX_PWM_PRESCALE1);
		PWM_1_PWM_Enable_Channel ();

}

static void FCD_PWM0_Disable()
{
	
		PWM_1_PWM_Disable_Channel();

}

static void FCD_PWM0_SetDutyCycle(MX_UINT8 nDuty)
{
	
		PWM_1_PWM_Set_Duty_8Bit(nDuty);

}

static void FCD_PWM0_ChangePeriod(MX_UINT8 nPeriodVal, MX_UINT8 nPrescalerVal)
{
	
		PWM_1_PWM_Change_Period (nPeriodVal, nPrescalerVal);

}

static void FCD_PWM0_SetDutyCycle10bit(MX_SINT16 nDuty)
{
	
		PWM_1_PWM_Set_Duty_10Bit(nDuty);

}



//PWM(1): //Macro implementations


static void FCD_PWM1_Enable()
{
	
		PWM_2_PWM_Change_Period (MX_PWM_PERIOD, MX_PWM_PRESCALE1);
		PWM_2_PWM_Enable_Channel ();

}

static void FCD_PWM1_Disable()
{
	
		PWM_2_PWM_Disable_Channel();

}

static void FCD_PWM1_SetDutyCycle(MX_UINT8 nDuty)
{
	
		PWM_2_PWM_Set_Duty_8Bit(nDuty);

}

static void FCD_PWM1_ChangePeriod(MX_UINT8 nPeriodVal, MX_UINT8 nPrescalerVal)
{
	
		PWM_2_PWM_Change_Period (nPeriodVal, nPrescalerVal);

}

static void FCD_PWM1_SetDutyCycle10bit(MX_SINT16 nDuty)
{
	
		PWM_2_PWM_Set_Duty_10Bit(nDuty);

}



//PWM(2): //Macro implementations


static void FCD_PWM2_Enable()
{
	
		PWM_3_PWM_Change_Period (MX_PWM_PERIOD, MX_PWM_PRESCALE1);
		PWM_3_PWM_Enable_Channel ();

}

static void FCD_PWM2_Disable()
{
	
		PWM_3_PWM_Disable_Channel();

}

static void FCD_PWM2_SetDutyCycle(MX_UINT8 nDuty)
{
	
		PWM_3_PWM_Set_Duty_8Bit(nDuty);

}

static void FCD_PWM2_ChangePeriod(MX_UINT8 nPeriodVal, MX_UINT8 nPrescalerVal)
{
	
		PWM_3_PWM_Change_Period (nPeriodVal, nPrescalerVal);

}

static void FCD_PWM2_SetDutyCycle10bit(MX_SINT16 nDuty)
{
	
		PWM_3_PWM_Set_Duty_10Bit(nDuty);

}



//ADC(0): //Macro implementations


static void FCD_ADC0_SampleADC()
{
	
	    //unused

}

static MX_UINT8 FCD_ADC0_ReadAsByte()
{
	
		MX_UINT8 retVal;

		//Configure & Enable ADC Channel
		FC_CAL_Enable_ADC ( ADC_4_MX_ADC_CHANNEL , ADC_4_MX_ADC_CONVSP , ADC_4_MX_ADC_VREFOP , ADC_4_MX_ADC_ACTIME );

		retVal = FC_CAL_Sample_ADC( 0 );				//Perform Sample - Return as byte

		FC_CAL_Disable_ADC ();

		return (retVal);

}

static MX_UINT16 FCD_ADC0_ReadAsInt()
{
	
		MX_UINT16 retVal;

		//Configure & Enable ADC Channel
		FC_CAL_Enable_ADC ( ADC_4_MX_ADC_CHANNEL , ADC_4_MX_ADC_CONVSP , ADC_4_MX_ADC_VREFOP , ADC_4_MX_ADC_ACTIME );

		retVal = FC_CAL_Sample_ADC( 1 );				//Perform Sample - Return as MX_UINT16

		FC_CAL_Disable_ADC ();

		return (retVal);

}

static MX_FLOAT FCD_ADC0_ReadAsVoltage()
{
	
		MX_UINT16 iSample;
		MX_FLOAT fSample, fVoltage, fVperDiv;

		//Configure & Enable ADC Channel
		FC_CAL_Enable_ADC ( ADC_4_MX_ADC_CHANNEL , ADC_4_MX_ADC_CONVSP , ADC_4_MX_ADC_VREFOP , ADC_4_MX_ADC_ACTIME );

	  #ifdef MX_ADC_BITS_8
		iSample = FC_CAL_Sample_ADC( 0 );								//Perform Sample - Return as byte
	  #else
		iSample = FC_CAL_Sample_ADC( 1 );								//Perform Sample - Return as MX_UINT16
	  #endif

	  	FC_CAL_Disable_ADC ();											//Switch off ADC peripheral
		fVoltage = flt_fromi( ADC_4_MX_ADC_VREFVOL );						//Convert reference voltage count to floating point (0 - 500 x 10mV)
		fVoltage = flt_mul(fVoltage, 0.01);								//Convert reference voltage count to actual voltage (0 - 5)

	  #ifdef MX_ADC_BITS_8
		fVperDiv = flt_mul(fVoltage, 0.00390625);						//Convert actual voltage to voltage per division (VRef / 256)
	  #endif
	  #ifdef MX_ADC_BITS_10
		fVperDiv = flt_mul(fVoltage, 0.000976);							//Convert actual voltage to voltage per division (VRef / 1024)
	  #endif
	  #ifdef MX_ADC_BITS_12
		fVperDiv = flt_mul(fVoltage, 0.00024414);						//Convert actual voltage to voltage per division (VRef / 4096)
	  #endif

		fSample = flt_fromi(iSample);									//Convert to floating point variable
		fVoltage = flt_mul(fSample, fVperDiv);							//Calculate floating point voltage

		return (fVoltage);

}

static void FCD_ADC0_ReadAsString(MX_CHAR* FCR_RETVAL, MX_UINT8 FCR_RETVAL_SIZE)
{
	
		MX_FLOAT fVoltage;

		fVoltage = FCD_ADC0_ReadAsVoltage();
		FCI_FLOAT_TO_STRING(fVoltage, 2, FCR_RETVAL, FCR_RETVAL_SIZE);	//Convert to String

}

static void FCD_ADC0_ADC_RAW_Configure_Channel()
{
	
		//Configure & Enable ADC Channel
		FC_CAL_Enable_ADC ( ADC_4_MX_ADC_CHANNEL , ADC_4_MX_ADC_CONVSP , ADC_4_MX_ADC_VREFOP , ADC_4_MX_ADC_ACTIME );

}

static MX_UINT8 FCD_ADC0_ADC_RAW_Sample_Channel_Byte()
{
	
		return FC_CAL_Sample_ADC( 0 );									//Perform Sample - Return as byte

}

static MX_UINT16 FCD_ADC0_ADC_RAW_Sample_Channel_Int()
{
	
		return FC_CAL_Sample_ADC( 1 );									//Perform Sample - Return as MX_UINT16

}

static MX_UINT8 FCD_ADC0_ADC_RAW_Average_Channel_Byte(MX_UINT8 NumSamples, MX_UINT8 DelayUs)
{
	
		MX_UINT32 average = 0;
		MX_UINT8 count;

		for (count=0; count<NumSamples; count++)
		{
			average = average + FC_CAL_Sample_ADC( 0 );					//Perform Sample - Return as byte - add to average

			if (DelayUs)
				delay_us(DelayUs);										//If delay is not 0 then pause between samples
		}
		average = average / count;

		return (average & 0xFF);										//Return average as byte

}

static MX_UINT16 FCD_ADC0_ADC_RAW_Average_Channel_Int(MX_UINT8 NumSamples, MX_UINT8 DelayUs)
{
	
		MX_UINT32 average = 0;
		MX_UINT8 count;

		for (count=0; count<NumSamples; count++)
		{
			average = average + FC_CAL_Sample_ADC( 1 );					//Perform Sample - Return as MX_UINT16 - add to average

			if (DelayUs)
				delay_us(DelayUs);										//If delay is not 0 then pause between samples
		}
		average = average / count;

		return (average & 0x1FFF);										//Return average as MX_SINT16

}

static void FCD_ADC0_ADC_RAW_Disable_Channel()
{
	
		FC_CAL_Disable_ADC ();											//Disable ADC Channel

}



//ADC(1): //Macro implementations


static void FCD_ADC1_SampleADC()
{
	
	    //unused

}

static MX_UINT8 FCD_ADC1_ReadAsByte()
{
	
		MX_UINT8 retVal;

		//Configure & Enable ADC Channel
		FC_CAL_Enable_ADC ( ADC_5_MX_ADC_CHANNEL , ADC_5_MX_ADC_CONVSP , ADC_5_MX_ADC_VREFOP , ADC_5_MX_ADC_ACTIME );

		retVal = FC_CAL_Sample_ADC( 0 );				//Perform Sample - Return as byte

		FC_CAL_Disable_ADC ();

		return (retVal);

}

static MX_UINT16 FCD_ADC1_ReadAsInt()
{
	
		MX_UINT16 retVal;

		//Configure & Enable ADC Channel
		FC_CAL_Enable_ADC ( ADC_5_MX_ADC_CHANNEL , ADC_5_MX_ADC_CONVSP , ADC_5_MX_ADC_VREFOP , ADC_5_MX_ADC_ACTIME );

		retVal = FC_CAL_Sample_ADC( 1 );				//Perform Sample - Return as MX_UINT16

		FC_CAL_Disable_ADC ();

		return (retVal);

}

static MX_FLOAT FCD_ADC1_ReadAsVoltage()
{
	
		MX_UINT16 iSample;
		MX_FLOAT fSample, fVoltage, fVperDiv;

		//Configure & Enable ADC Channel
		FC_CAL_Enable_ADC ( ADC_5_MX_ADC_CHANNEL , ADC_5_MX_ADC_CONVSP , ADC_5_MX_ADC_VREFOP , ADC_5_MX_ADC_ACTIME );

	  #ifdef MX_ADC_BITS_8
		iSample = FC_CAL_Sample_ADC( 0 );								//Perform Sample - Return as byte
	  #else
		iSample = FC_CAL_Sample_ADC( 1 );								//Perform Sample - Return as MX_UINT16
	  #endif

	  	FC_CAL_Disable_ADC ();											//Switch off ADC peripheral
		fVoltage = flt_fromi( ADC_5_MX_ADC_VREFVOL );						//Convert reference voltage count to floating point (0 - 500 x 10mV)
		fVoltage = flt_mul(fVoltage, 0.01);								//Convert reference voltage count to actual voltage (0 - 5)

	  #ifdef MX_ADC_BITS_8
		fVperDiv = flt_mul(fVoltage, 0.00390625);						//Convert actual voltage to voltage per division (VRef / 256)
	  #endif
	  #ifdef MX_ADC_BITS_10
		fVperDiv = flt_mul(fVoltage, 0.000976);							//Convert actual voltage to voltage per division (VRef / 1024)
	  #endif
	  #ifdef MX_ADC_BITS_12
		fVperDiv = flt_mul(fVoltage, 0.00024414);						//Convert actual voltage to voltage per division (VRef / 4096)
	  #endif

		fSample = flt_fromi(iSample);									//Convert to floating point variable
		fVoltage = flt_mul(fSample, fVperDiv);							//Calculate floating point voltage

		return (fVoltage);

}

static void FCD_ADC1_ReadAsString(MX_CHAR* FCR_RETVAL, MX_UINT8 FCR_RETVAL_SIZE)
{
	
		MX_FLOAT fVoltage;

		fVoltage = FCD_ADC1_ReadAsVoltage();
		FCI_FLOAT_TO_STRING(fVoltage, 2, FCR_RETVAL, FCR_RETVAL_SIZE);	//Convert to String

}

static void FCD_ADC1_ADC_RAW_Configure_Channel()
{
	
		//Configure & Enable ADC Channel
		FC_CAL_Enable_ADC ( ADC_5_MX_ADC_CHANNEL , ADC_5_MX_ADC_CONVSP , ADC_5_MX_ADC_VREFOP , ADC_5_MX_ADC_ACTIME );

}

static MX_UINT8 FCD_ADC1_ADC_RAW_Sample_Channel_Byte()
{
	
		return FC_CAL_Sample_ADC( 0 );									//Perform Sample - Return as byte

}

static MX_UINT16 FCD_ADC1_ADC_RAW_Sample_Channel_Int()
{
	
		return FC_CAL_Sample_ADC( 1 );									//Perform Sample - Return as MX_UINT16

}

static MX_UINT8 FCD_ADC1_ADC_RAW_Average_Channel_Byte(MX_UINT8 NumSamples, MX_UINT8 DelayUs)
{
	
		MX_UINT32 average = 0;
		MX_UINT8 count;

		for (count=0; count<NumSamples; count++)
		{
			average = average + FC_CAL_Sample_ADC( 0 );					//Perform Sample - Return as byte - add to average

			if (DelayUs)
				delay_us(DelayUs);										//If delay is not 0 then pause between samples
		}
		average = average / count;

		return (average & 0xFF);										//Return average as byte

}

static MX_UINT16 FCD_ADC1_ADC_RAW_Average_Channel_Int(MX_UINT8 NumSamples, MX_UINT8 DelayUs)
{
	
		MX_UINT32 average = 0;
		MX_UINT8 count;

		for (count=0; count<NumSamples; count++)
		{
			average = average + FC_CAL_Sample_ADC( 1 );					//Perform Sample - Return as MX_UINT16 - add to average

			if (DelayUs)
				delay_us(DelayUs);										//If delay is not 0 then pause between samples
		}
		average = average / count;

		return (average & 0x1FFF);										//Return average as MX_SINT16

}

static void FCD_ADC1_ADC_RAW_Disable_Channel()
{
	
		FC_CAL_Disable_ADC ();											//Disable ADC Channel

}



//ADC(2): //Macro implementations


static void FCD_ADC2_SampleADC()
{
	
	    //unused

}

static MX_UINT8 FCD_ADC2_ReadAsByte()
{
	
		MX_UINT8 retVal;

		//Configure & Enable ADC Channel
		FC_CAL_Enable_ADC ( ADC_6_MX_ADC_CHANNEL , ADC_6_MX_ADC_CONVSP , ADC_6_MX_ADC_VREFOP , ADC_6_MX_ADC_ACTIME );

		retVal = FC_CAL_Sample_ADC( 0 );				//Perform Sample - Return as byte

		FC_CAL_Disable_ADC ();

		return (retVal);

}

static MX_UINT16 FCD_ADC2_ReadAsInt()
{
	
		MX_UINT16 retVal;

		//Configure & Enable ADC Channel
		FC_CAL_Enable_ADC ( ADC_6_MX_ADC_CHANNEL , ADC_6_MX_ADC_CONVSP , ADC_6_MX_ADC_VREFOP , ADC_6_MX_ADC_ACTIME );

		retVal = FC_CAL_Sample_ADC( 1 );				//Perform Sample - Return as MX_UINT16

		FC_CAL_Disable_ADC ();

		return (retVal);

}

static MX_FLOAT FCD_ADC2_ReadAsVoltage()
{
	
		MX_UINT16 iSample;
		MX_FLOAT fSample, fVoltage, fVperDiv;

		//Configure & Enable ADC Channel
		FC_CAL_Enable_ADC ( ADC_6_MX_ADC_CHANNEL , ADC_6_MX_ADC_CONVSP , ADC_6_MX_ADC_VREFOP , ADC_6_MX_ADC_ACTIME );

	  #ifdef MX_ADC_BITS_8
		iSample = FC_CAL_Sample_ADC( 0 );								//Perform Sample - Return as byte
	  #else
		iSample = FC_CAL_Sample_ADC( 1 );								//Perform Sample - Return as MX_UINT16
	  #endif

	  	FC_CAL_Disable_ADC ();											//Switch off ADC peripheral
		fVoltage = flt_fromi( ADC_6_MX_ADC_VREFVOL );						//Convert reference voltage count to floating point (0 - 500 x 10mV)
		fVoltage = flt_mul(fVoltage, 0.01);								//Convert reference voltage count to actual voltage (0 - 5)

	  #ifdef MX_ADC_BITS_8
		fVperDiv = flt_mul(fVoltage, 0.00390625);						//Convert actual voltage to voltage per division (VRef / 256)
	  #endif
	  #ifdef MX_ADC_BITS_10
		fVperDiv = flt_mul(fVoltage, 0.000976);							//Convert actual voltage to voltage per division (VRef / 1024)
	  #endif
	  #ifdef MX_ADC_BITS_12
		fVperDiv = flt_mul(fVoltage, 0.00024414);						//Convert actual voltage to voltage per division (VRef / 4096)
	  #endif

		fSample = flt_fromi(iSample);									//Convert to floating point variable
		fVoltage = flt_mul(fSample, fVperDiv);							//Calculate floating point voltage

		return (fVoltage);

}

static void FCD_ADC2_ReadAsString(MX_CHAR* FCR_RETVAL, MX_UINT8 FCR_RETVAL_SIZE)
{
	
		MX_FLOAT fVoltage;

		fVoltage = FCD_ADC2_ReadAsVoltage();
		FCI_FLOAT_TO_STRING(fVoltage, 2, FCR_RETVAL, FCR_RETVAL_SIZE);	//Convert to String

}

static void FCD_ADC2_ADC_RAW_Configure_Channel()
{
	
		//Configure & Enable ADC Channel
		FC_CAL_Enable_ADC ( ADC_6_MX_ADC_CHANNEL , ADC_6_MX_ADC_CONVSP , ADC_6_MX_ADC_VREFOP , ADC_6_MX_ADC_ACTIME );

}

static MX_UINT8 FCD_ADC2_ADC_RAW_Sample_Channel_Byte()
{
	
		return FC_CAL_Sample_ADC( 0 );									//Perform Sample - Return as byte

}

static MX_UINT16 FCD_ADC2_ADC_RAW_Sample_Channel_Int()
{
	
		return FC_CAL_Sample_ADC( 1 );									//Perform Sample - Return as MX_UINT16

}

static MX_UINT8 FCD_ADC2_ADC_RAW_Average_Channel_Byte(MX_UINT8 NumSamples, MX_UINT8 DelayUs)
{
	
		MX_UINT32 average = 0;
		MX_UINT8 count;

		for (count=0; count<NumSamples; count++)
		{
			average = average + FC_CAL_Sample_ADC( 0 );					//Perform Sample - Return as byte - add to average

			if (DelayUs)
				delay_us(DelayUs);										//If delay is not 0 then pause between samples
		}
		average = average / count;

		return (average & 0xFF);										//Return average as byte

}

static MX_UINT16 FCD_ADC2_ADC_RAW_Average_Channel_Int(MX_UINT8 NumSamples, MX_UINT8 DelayUs)
{
	
		MX_UINT32 average = 0;
		MX_UINT8 count;

		for (count=0; count<NumSamples; count++)
		{
			average = average + FC_CAL_Sample_ADC( 1 );					//Perform Sample - Return as MX_UINT16 - add to average

			if (DelayUs)
				delay_us(DelayUs);										//If delay is not 0 then pause between samples
		}
		average = average / count;

		return (average & 0x1FFF);										//Return average as MX_SINT16

}

static void FCD_ADC2_ADC_RAW_Disable_Channel()
{
	
		FC_CAL_Disable_ADC ();											//Disable ADC Channel

}

#include "C:\Program Files\Flowcode(AVR)\v5\CAL\includes.c"

//Macro implementations


int main()
{
	//Initialization
	MCUCSR=0x00;
	wdt_disable();


	//Interrupt initialization code
	
	//Loop
	//Loop: While 1
	while (1)
	{

		//Call Component Macro
		//Call Component Macro: Val1=ReadAsInt()
		FCV_VAL1 = FCD_ADC0_ReadAsInt();

		//Call Component Macro
		//Call Component Macro: Val2=ReadAsInt()
		FCV_VAL2 = FCD_ADC1_ReadAsInt();

		//Call Component Macro
		//Call Component Macro: Val3=ReadAsInt()
		FCV_VAL3 = FCD_ADC2_ReadAsInt();

		//Call Component Macro
		//Call Component Macro: Enable()
		FCD_PWM0_Enable();

		//Call Component Macro
		//Call Component Macro: SetDutyCycle10bit(Val1)
		FCD_PWM0_SetDutyCycle10bit(FCV_VAL1);

		//Call Component Macro
		//Call Component Macro: Enable()
		FCD_PWM1_Enable();

		//Call Component Macro
		//Call Component Macro: SetDutyCycle10bit(Val2)
		FCD_PWM1_SetDutyCycle10bit(FCV_VAL2);

		//Call Component Macro
		//Call Component Macro: Enable()
		FCD_PWM2_Enable();

		//Call Component Macro
		//Call Component Macro: SetDutyCycle10bit(Val3)
		FCD_PWM2_SetDutyCycle10bit(FCV_VAL3);


	}

	mainendloop: goto mainendloop;
}



