#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include "ADC.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;
  VREFSC = 0x82;  //Tight Regulation 
  //ADCCFG1 = 0x1F;           High speed, /1 long sample, 16 bit, async clock
  ADCCFG1 = _16B_MASK | ADCCFG1_ADIV_MASK;
  ADCSC3 = 0x87;           // Calibration, one conversion. with HW averging , 32 samples
  SetBus24MHz_FEI(); 
  MCGTRM = storedTRIM ; // fINT trimed to   31250  Hz 

  EnableInterrupts; /* enable interrupts */

  PDBMOD = 0xffff;
  PDBIDLY = 65535 ; // Effective after writting PDBSC_DACTOE = 1, delay depends on bus speed.
  PDBSC_LDOK = 1   ;// Load value of PDBDLYn from buffers to registers
  PDBC1_TRIGSEL=7  ;// Software triggered 
  PDBSC_TOS =2 ; // needed for either Back to Back or Channel delay
  PDBSC_PDBIE = 0 ; // PDB interrupt disable
  PDBC2 = 0xFE ;    // Back to back triggers ADC conversion. SW trigger not yet started
  PDBCHEN = 0xFF;   // Eneable output to related ADC n channels
  PDBC1_CONT =0  ;  // 0= SingleShot Mode (good for polling) . 1 continuous mode (good for interrupt driven)
  PDBSC_PDBEN =1 ;  // Enable PDB module
  PDBC1_PRESCALER = 0; 
  PDBC1_MULT = 0 ;  

  ADCSC1A = (26 | ADCSC1A_AIENA_MASK);		// enable interrupt
  ADCSC1B = (26 | ADCSC1B_AIENB_MASK);		// enable interrupt
  ADCSC1C = (26 | ADCSC1C_AIENC_MASK);		// enable interrupt
  ADCSC1D = (26 | ADCSC1D_AIEND_MASK);		// enable interrupt
  ADCSC1E = (26 | ADCSC1E_AIENE_MASK);		// enable interrupt
  ADCSC1F=  (26 | ADCSC1F_AIENF_MASK);		// enable interrupt
  ADCSC1G = (26 | ADCSC1G_AIENG_MASK);		// enable interrupt
  ADCSC1H = (26 | ADCSC1H_AIENH_MASK);		// enable interrupt
  //ADCCFG2_ADACKEN = 1 ;   Enabled as
  ADCSC2_ADTRG = 1 ; // Hardhare 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)
    {
    	LED1 ^= 1;
    }
	  __RESET_WATCHDOG(); /* feeds the dog */
  }
}
