/** ADC3.C ********************************************************* interruptgesteuerter AD-Wandler periodische Messung aller Kanäle im Abstand ADCZYKLUS *******************************************************************/ #define SIMUL #include /* Register-Definitionen für 80517A CPU */ #include #define ADCCHAN 4 /* maximal 12 */ #define BIT8 /* oder 10 */ #define ADCL 0 /* ADC-Takt f/8 */ #ifdef SIMUL #define TIMER1MS (65536-10000) #define TIMER1TAG 100 #define ADCZYKLUS 10 /* 1000 = 1 s */ #else #define TIMER1MS (65536-1000) #define TIMER1TAG 1000U*60*60*24 #define ADCZYKLUS 1000 /* 1000 = 1 s */ #endif #ifdef BIT8 volatile unsigned char mw[ADCCHAN]; #else volatile unsigned int mw[ADCCHAN]; #endif volatile char i_chan; volatile bit i_adcrun = 0; volatile bit i_adcrdy = 0; volatile unsigned long i_zeit=0; void adc_start(void) { i_adcrun = 1; /* Abtastzyklus ankündigen */ i_chan = 0; /* erster Kanal */ EADC=1; ADDATL=0; /* Messung starten */ } void i_timer0 (void) interrupt 1 { TL0 = TIMER1MS % 256; TH0 = TIMER1MS / 256; i_zeit++; if (i_zeit%ADCZYKLUS==0) adc_start(); if (i_zeit==TIMER1TAG) i_zeit=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; i_adcrdy=1; return; } ADCON1 = ADCL*128+i_chan; /* Kanal einstellen */ ADDATL = 0; /* Start der nächsten Umsetzung */ } void timer0_init (void) { /* Timer 0 zählt mit 1 ms Periodendauer */ TMOD &= 0xf0; TMOD |= 0x01; TL0 = TIMER1MS % 256; TH1 = TIMER1MS / 256; TR0=1; ET0=1; } void adc_init(void) { ADEX=0; /* keine externe Wandlung */ ADM=0; /* Wandlung auf Kommando */ ADCON1=0x80; /* schnelle Wandlung, Achtung 16 MHz ist die Grenze */ }