/** ADC2.C ********************************************************* interruptgesteuerter AD-Wandler *******************************************************************/ #include /* Register-Definitionen für 80517A CPU */ #define ADCCHAN 4 /* maximal 12 */ #define BIT8 /* oder 10 */ #define ADCL 0 /* ADC-Takt f/8 */ #ifdef BIT8 volatile unsigned char mw[ADCCHAN]; #else volatile unsigned int mw[ADCCHAN]; #endif volatile char i_chan; volatile bit i_adcrun = 0; void i_adc(void) interrupt 8 { /* Meßwert speichern */ #ifdef BIT8 mw[i_chan]=ADDATH; #else mw[i_chan]=ADDATH*256+ADDATL; #endif if (++i_chan==ADCCHAN) { EADC=0; /* Messung aller Kanäle beendet */ i_adcrun=0; return; } ADCON1 = ADCL*128+i_chan; /* Kanal einstellen */ ADDATL = 0; /* Start der nächsten Umsetzung */ } void adc_init(void) { ADEX=0; /* keine externe Wandlung */ ADM=0; /* Wandlung auf Kommando */ ADCON1=0x80; /* schnelle Wandlung, Achtung 16 MHz ist die Grenze */ } void adc_start(void) { EAL=1; i_adcrun = 1; /* Abtastzyklus ankündigen */ i_chan = 0; /* erster Kanal */ EADC=1; ADDATL=0; /* Messung starten */ } void main (void) { adc_init(); adc_start(); while (i_adcrun) { } while (1) { } }