/** ADC.C ********************************************************** interruptgesteuerter AD-Wandler MACRO WAIT1 WAIT2´WAIT4 WAIT8 WAIT16 Wartezyklen in Mikrosekunden __C51__ kann sowohl mit KEIL als auch mit BORLAND kompiliert werden mit BORLAND werden Zufallsdaten generiert LOCAL mw[ADCCHAN] Meßwerte nach einer Interrupt-Messung i_chan Kanalnummer i_adcrun Inerrupt-Messung läuft i_adc() Interrupt-Service-Routine PUBLIC adc_init() Initialisierung des ADC adc8() Messen und Ablesen eines ADC-Kanals (ohne Interrupt) adc_start() Einleiten einer Interrupt-Messung adc_read() Ablesen eines ADC-Kanals (nach Interrupt-Messung) *******************************************************************/ #include "adc.h" #ifdef __C51__ #include #define WAIT1 _nop_() #define WAIT2 WAIT1;WAIT1 #define WAIT4 WAIT2;WAIT2 #define WAIT8 WAIT4;WAIT4 #define WAIT16 WAIT8;WAIT8 #else #include #define WAIT1 #define WAIT2 #define WAIT4 #define WAIT8 #define WAIT16 #endif /** LOCAL **********************************************************/ #ifdef BIT8 volatile unsigned char xdata mw[ADCCHAN]; #else volatile unsigned int xdata mw[ADCCHAN]; #endif volatile char xdata i_chan; volatile bit i_adcrun = 0; #ifdef __C51__ void i_adc(void) interrupt 8 #else void i_adc(void) #endif { /* 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 */ } /** PUBLIC **********************************************************/ void adc_start (void) { #ifdef __C51__ i_adcrun = 1; /* Abtastzyklus ankündigen */ i_chan = 0; /* erster Kanal */ EADC=1; EAL=1; ADDATL=0; /* Messung starten */ #else unsigned char i; for(i=0; i