// Rutinas de lectura conversor A/D ADC0838
// Provee funciones de lectura en modo:
// - Canal individual terminado (Single-Ended)
// - Diferencial (Dif)

#define AD_CK pin_A0    // Clock
#define AD_CS pin_A1    // Chip Select
#define AD_DI pin_A2    // Data In (MUX Channel Selector)
#define AD_DO pin_A3    // Data Out
#define AD_SARS pin_B6  // Shift Enable (MSB o LSB firts mode)
#define SGL 1           // Single-Ended Mode
#define DIF 0           // Diferential Mode

int adc_result, MUX;

void  Clock() {
      delay_us(2);
      output_high(AD_CK);
      delay_us(2);
      output_low(AD_CK);
      delay_us(2);
}

void set_adc(int ch, short mode) {

       int i=0;
       if(mode==SGL) {
       switch(ch)    {
         case 0: MUX= 8; break;        // MUX is 4 bit width
         case 1: MUX=12; break;
         case 2: MUX= 9; break;
         case 3: MUX=13; break;
         case 4: MUX=10; break;
         case 5: MUX=14; break;
         case 6: MUX=11; break;
         case 7: MUX=15; break;
         }
         }
         else  {
         switch(ch) {
         case 0: MUX=0; break;
         case 1: MUX=4; break;
         case 2: MUX=1; break;
         case 3: MUX=5; break;
         case 4: MUX=2; break;
         case 5: MUX=6; break;
         case 6: MUX=3; break;
         case 7: MUX=7; break;
         }
         }

       output_low(AD_CK);
       delay_us(2);
       output_high(AD_CS);             //CS=1, disable ADC0838
       delay_us(10);
       output_low(AD_CS);              //CS=0, enable  ADC0838
       delay_us(10);
       output_high(AD_DI);             //Start BIT
       delay_us(10);
       Clock();
       //output_low(AD_DI);
       //output_high(AD_SE);

       for (i=0;i<4;i++) {             //Send MUX word into ADC0838
       if((MUX & 0x8)==0)  {           //does is 0 Comparamos el bit 4 de MUX con 8 (1000) para saber
         output_low(AD_DI);            //qué estado aplicamos a AD_DI. Luego desplazamos
         }
         else {                        //MUX a la izquierda y repetimos la comparacion.
         output_high(AD_DI);           //Total 4 comparaciones.
         }
         MUX<<= 1;
         Clock();

         }
         //Clock();
         
}

void read_adc() {
    int i=0;
  //while(AD_SARS==1) {
    for (i=0;i<8;++i) {
         Clock();
         delay_us(3);
         shift_left(&adc_result, 1, input(AD_DO));
         }
         //output_low(AD_SE);
         output_high(AD_CS);
         //return(adc_result);
//}
}



































