/* A/D contverter 
   25.5.00
 */

#include "H8.h"

#ifndef   AD_H_DEFINED
#define   AD_H_DEFINED

/* Section 12, A/D Converter */ 
#define ADDRA       *((volatile word *) 0xffe0) /* s. 199  */
#define ADDRB       *((volatile word *) 0xffe2) 
#define ADDRC       *((volatile word *) 0xffe4) 
#define ADDRD       *((volatile word *) 0xffe6) 

#define AN0         0
#define AN1         1
#define AN2         2
#define AN3         3
#define AN4         4
#define AN5         5
#define AN6         6
#define AN7         7

#define ADCSR       *((volatile byte *) 0xffe8) /* s. 200 */


/* Return the converted analog value on pin = 0,1, ... ,7. */
uint16 ConvertADChannel( byte pin )
{ 
  uint16 ADvalue;
 
  /* Select AD channel given by the value of pin, 
     all other bits are cleared, i.e.
     clear end flag, disable interrupts, use single 
     conversion mode and conversion time 266 states.
   */
  ADCSR  = pin;   
  /* Start conversion */
  ADCSR |= bit5;
  /* Wait for end of conversion */
  while ( !(ADCSR & bit7) );
  /* Clear end of conversion flag */
  ADCSR &= ~bit7;

  switch ( pin ) {
  case 0:  ADvalue = ADDRA; break;
  case 1:  ADvalue = ADDRB; break;
  case 2:  ADvalue = ADDRC; break;
  case 3:  ADvalue = ADDRD; break;
  case 4:  ADvalue = ADDRA; break;
  case 5:  ADvalue = ADDRB; break;
  case 6:  ADvalue = ADDRC; break;
  case 7:  ADvalue = ADDRD; break;

  default: ADvalue = 0;
  }
 
  /* Shift the 10 bit value to an integer in [0..1023] */
  return (ADvalue >> 6);
}

#endif /* AD_H_DEFINED */
