#include <p30fxxxx.h>
#include "..\h\adconv.h"
#include "..\h\adc12.h"

unsigned char ADNum;                // aktuális A/D csatorna (0..7)
unsigned int  ADVal[8];

/********************************************************************
*       Function Name:  ADInit                                      *
********************************************************************/
void ADInit(void) {
  unsigned int Channel, PinConfig, Scanselect, Adcon3_reg, Adcon2_reg, Adcon1_reg;

  ADCON1bits.ADON = 0; /* turn off ADC */
  Channel = ADC_CH0_POS_SAMPLEA_AN1 &
            ADC_CH0_NEG_SAMPLEA_NVREF &
            ADC_CH0_POS_SAMPLEB_AN0 &
            ADC_CH0_NEG_SAMPLEB_NVREF;
  SetChanADC12(Channel);
  ConfigIntADC12(ADC_INT_DISABLE);

#ifndef __ICD2
  PinConfig  = ENABLE_AN0_ANA & ENABLE_AN1_ANA &
               ENABLE_AN2_ANA & ENABLE_AN3_ANA &
               ENABLE_AN5_ANA & ENABLE_AN6_ANA &
               ENABLE_AN7_ANA & ENABLE_AN8_ANA ;
  Scanselect = SKIP_SCAN_AN4 & SKIP_SCAN_AN9 &
               SKIP_SCAN_AN10 & SKIP_SCAN_AN11 &
               SKIP_SCAN_AN12 & SKIP_SCAN_AN13 &
               SKIP_SCAN_AN14 & SKIP_SCAN_AN15 ;
  Adcon2_reg = ADC_VREF_AVDD_AVSS &
               ADC_SCAN_ON &
               ADC_ALT_BUF_OFF &
               ADC_ALT_INPUT_OFF &
               ADC_SAMPLES_PER_INT_8;
#else
  PinConfig  = ENABLE_AN0_ANA & ENABLE_AN1_ANA &
               ENABLE_AN2_ANA & ENABLE_AN3_ANA &
               ENABLE_AN5_ANA & ENABLE_AN8_ANA ;
  Scanselect = SKIP_SCAN_AN4 & SKIP_SCAN_AN6 &
               SKIP_SCAN_AN7 & SKIP_SCAN_AN9 &
               SKIP_SCAN_AN10 & SKIP_SCAN_AN11 &
               SKIP_SCAN_AN12 & SKIP_SCAN_AN13 &
               SKIP_SCAN_AN14 & SKIP_SCAN_AN15 ;
  Adcon2_reg = ADC_VREF_AVDD_AVSS &
               ADC_SCAN_ON &
               ADC_ALT_BUF_OFF &
               ADC_ALT_INPUT_OFF &
               ADC_SAMPLES_PER_INT_6;
#endif

  Adcon3_reg = ADC_SAMPLE_TIME_31 &
               ADC_CONV_CLK_SYSTEM &
               ADC_CONV_CLK_31Tcy;
  Adcon1_reg = ADC_MODULE_ON &
               ADC_IDLE_CONTINUE &
               ADC_FORMAT_INTG &
               ADC_CLK_AUTO &
               ADC_AUTO_SAMPLING_OFF &
               ADC_SAMP_OFF ;
  OpenADC12(Adcon1_reg, Adcon2_reg, Adcon3_reg, PinConfig, Scanselect);

  ADCON1bits.ASAM = 1;
  while(BusyADC12());    // vár amíg 1 lesz

  ADVal[0] = ADCBUF0; ADVal[1] = ADCBUF1;
  ADVal[2] = ADCBUF2; ADVal[3] = ADCBUF3;
  ADVal[4] = ADCBUF4; ADVal[5] = ADCBUF5;
  ADVal[6] = ADCBUF6; ADVal[7] = ADCBUF7;
}

/********************************************************************
*       Function Name:  ADPolling                                   *
********************************************************************/
void ADPolling(void) {
  unsigned int ADVal;

  if(BusyADC12()) return;     // ha A/D konverzió még folyamatban van

  switch(ADNum) {
    case (0): ADVal = ADCBUF0;
              break;
    case (1): ADVal = ADCBUF1;
              break;
    case (2): ADVal = ADCBUF2;
              break;
    case (3): ADVal = ADCBUF3;
              break;
    case (4): ADVal = ADCBUF4;
              break;
    case (5): ADVal = ADCBUF5;
              break;
    case (6): ADVal = ADCBUF6;
              break;
    case (7): ADVal = ADCBUF7;
              break;
  } 

  ...

  if(ADNum == 7) {
    ADCON1bits.ASAM = 1;
    ADNum = 0;
  }
  else ADNum++;
}
