/** ADC.C ********************************************************** ******************************************************************** verschiedene Abfrageversionen mit Polling */ #include /* Register-Definitionen für 80552 CPU */ void adc_init(void) { ADEX=0; /* keine externe Wandlung */ ADM=0; /* Wandlung auf Kommando */ ADCON1=0x80; /* schnelle Wandlung, Achtung 16 MHz ist die Grenze */ } /* adc dauert 85 us */ unsigned int adc(char chan) { union { unsigned int ui; struct { unsigned char h; unsigned char l; }uc; }iorc; ADCON0 &= 0xf8; /* alten Kanal löschen */ ADCON0 |= chan; /* neuen Kanal setzen */ ADDATL = 0; /* Start der Umsetzung */ do /* Warten auf Ende der Konversion */ { } while (BSY); iorc.uc.l=ADDATL; iorc.uc.h=ADDATH; iorc.ui>>=6; return iorc.ui; } /* adc1 verzichtet auf das korrekte Zahlenformat und benötigt dadurch nur 36 us */ unsigned int adc1(char chan) { union { unsigned int ui; struct { unsigned char h; unsigned char l; }uc; }iorc; ADCON0 &= 0xf8; /* alten Kanal löschen */ ADCON0 |= chan; /* neuen Kanal setzen */ ADDATL = 0; /* Start der Umsetzung */ do /* Warten auf Ende der Konversion */ { } while (BSY); iorc.uc.l=ADDATL; iorc.uc.h=ADDATH; return iorc.ui; } /* adc2 beschränkt sich auf eine 8-Bit-Messung und benötigt nur 20 us */ unsigned char adc2(char chan) { ADCON0 &= 0xf8; /* alten Kanal löschen */ ADCON0 |= chan; /* neuen Kanal setzen */ ADDATL = 0; /* Start der Umsetzung */ do /* Warten auf Ende der Konversion */ { } while (BSY); return ADDATH; } void main (void) { unsigned int mess; adc_init(); while (1) { mess=adc(0); mess=adc1(0); mess=adc2(0); } }