#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include "MCG.h"
#include "ADC.h"
#include "PDB.h"


 
//const unsigned char boot@0x040A = 0x0000; //For MCF51 ONLY: bypass checksum /bootloader
// #define storedTRIM *((char*)0x03FF )  

 /* uncommented following three lines of code for S08MM128 device */
const unsigned char boot@0xFFBA = 0x00; //bypass checksum 
#define LED1_DD		PTFDD_PTFDD2 = 1
#define LED1		PTFD_PTFD2


#define storedFTRIM *((char*)0xFFAE )
#define storedTRIM *((char*)0xFFAF )



#define DCO_MUL_512    0
#define DCO_MUL_1024   1
#define DCO_MUL_1536   2 

#define DCO_MUL_608    0x10
#define DCO_MUL_1216   0x11
#define DCO_MUL_1824   0x12

#define MCGC2_BDIV_1 0 
#define MCGC2_BDIV_2 1
#define MCGC2_BDIV_4 2 
#define MCGC2_BDIV_8 3 

word ADC_result[8];  //16-bit
byte tempitem[8] ; //used to inspect all 8 ADC channel COCOn flags 
word ADC_result[8];  //16-bit
byte ADC_Flag = 0x00;
byte ADC_COCO_FLAGS = 0 ;
byte index = 0 ;
              
// Declare all functions 
void Bus20MHZ_FEI (void){
// fINT trimed to   39062.5  Hz 
MCGC2 = 0x00;
MCGTRM = storedTRIM ;
MCGC4 =  DCO_MUL_1024 ; 
MCGC2_BDIV = MCGC2_BDIV_1;
MCGC4_DRST_DRS =1; 
while (MCGSC_CLKST != MCGC1_CLKS ){}
}


void SetBus24MHz_FEI(void)
{
   MCGTRM = storedTRIM ; // fINT trimed to   31250  Hz 
   MCGC1 =0x04; //reset default; FEI mode
   MCGC2 = 0x00; //BDIV = 1. After reset typical BUS = fMCGOUT/4 = 16 MHz/4  = 4MHz
   MCGC3 = 0x01; //reset default value
   MCGC4 = 0x02; // Set FLL  = 1536 x 31.25Khz internal  = 48MHz
   while(MCGSC_CLKST !=  MCGC1_CLKS ) {} // wait till FEI is enaged
   while(! MCGSC_LOCK ){} //Ensure FLL is locked before proceed to next program
} //end of SetBus24MHz_FEI

void SetBus4MHz_FEI(void)
{
   MCGTRM = storedTRIM ; // fINT trimed to   31250  Hz 
   MCGC1 =0x04; //reset default; FEI mode
   MCGC2 = 0x40; //BDIV = 1. After reset typical BUS = fMCGOUT/4 = 16 MHz/4  = 4MHz
   MCGC3 = 0x01; //reset default value
   MCGC4 = 0x00; // Set FLL  = 512 x 31.25Khz internal  = 16MHz , bus = (16/2) /2 = 4MHz
   while(MCGSC_CLKST !=  MCGC1_CLKS ) {} // wait till FEI is enaged
   while(! MCGSC_LOCK ){} //Ensure FLL is locked before proceed to next program
} //end of SetBus4MHz_FEI 
   
void main(void) {
 int i=0;
  /* include your code here */
  LED1_DD;

  vfnMCG_Init();
  
  vfnADC_Init();
  vfnADConfigChannel(0);
  
 /* SetBus24MHz_FEI(); 
  MCGTRM = storedTRIM ; */

  EnableInterrupts; /* enable interrupts */

  vfnPDBInit();
  vfnPDBConfig(PDB_CONTINUOUS_MODE);
 

  ADCSC1A = (ADC_CH4 | ADCSC1A_AIENA_MASK);		// enable interrupt
  ADCSC1B = (ADC_CH4 | ADCSC1B_AIENB_MASK);		// enable interrupt
  ADCSC1C = (ADC_CH4 | ADCSC1C_AIENC_MASK);		// enable interrupt
  ADCSC1D = (ADC_CH4 | ADCSC1D_AIEND_MASK);		// enable interrupt
  ADCSC1E = (ADC_CH4 | ADCSC1E_AIENE_MASK);		// enable interrupt
  ADCSC1F=  (ADC_CH4 | ADCSC1F_AIENF_MASK);		// enable interrupt
  ADCSC1G = (ADC_CH4 | ADCSC1G_AIENG_MASK);		// enable interrupt
  ADCSC1H = (ADC_CH4 | ADCSC1H_AIENH_MASK);		// enable interrupt

  ADCSC2_ADTRG = 1 ; // Hardware trigger enabled. ADC conversion starts by either Back-back PDB or Channeln Delay PDB triggers
  PDBC2_SWTRIG = 1;	 // Start PDB by software trigger
  
  for(;;) 
  {
    if (ADC_COCO)
    {
    	ADC_COCO_CLEAR;
    	LED1 ^= 1;
    }
	  __RESET_WATCHDOG(); /* feeds the dog */
  }
}
