/*
 * Copyright(C) Paul und Scherer (mct.de/mct.net)
 *
 * This example demonstrates how to...
 *
 *  ... use the ADC in burst mode.
 */

#include <stdio.h>
#include <target.h>
#include "../delay.h"

/*
 * AD0.0.. 3 (=P0.27.. 30) are continuously
 * sampled (in burst mode), and displayed.
 */
int
main(void)
{
	int ch[4] = {0};			// ADC channel results

	Intern_ad0cr = /* SEL    (Bit 0..  7) */     0x0f	// select channels
		     | /* CLKDIV (Bit 8.. 15) */   0x0f00	// pclk/(x+1) <=4.5MHz
		     | /* BURST  (Bit16     ) */  0x10000	// BURST on
		     | /* PDN    (Bit21     ) */ 0x200000;	// power up

	Intern_pinsel1 |= 0x15400000;		// enable AD0.0.. 3 pins

	while (1) {
		long adc;			// ADC data
		int n;				// channel count

		delay(1000);			// pause to smooth output

		for (n = 4; n--;) {					// read channels:
			while ((adc = Intern_ad0dr) >= 0) ;		//  wait for DONE
			ch[ /* CHN    (Bit24.. 26) */ (adc>>24)&7]	//  save
			  = /* V/VddA (Bit 6.. 15) */ (adc>> 6)&0x3ff;	//   result
		}
		printf("CH0: %4d, CH1: %4d, CH2: %4d, CH3: %4d\n",
			ch[0],
			ch[1],
			ch[2],
			ch[3]
		);
	}
}
