00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <io.h>
00019 #include <sig-avr.h>
00020 #include <interrupt.h>
00021
00022 #include "global.h"
00023 #include "a2d.h"
00024
00025
00026
00027
00028
00029 volatile unsigned char a2dCompleteFlag;
00030
00031
00032 SIGNAL(SIG_ADC)
00033 {
00034
00035
00036 a2dCompleteFlag = TRUE;
00037 }
00038
00039
00040 void a2dInit(void)
00041 {
00042 sbi(ADCSR, ADEN);
00043 cbi(ADCSR, ADFR);
00044 a2dSetPrescaler(ADC_PRESCALE);
00045 a2dSetReference(ADC_REFERENCE);
00046
00047 sbi(ADCSR, ADIE);
00048
00049 a2dCompleteFlag = FALSE;
00050 sei();
00051 }
00052
00053 void a2dOff(void)
00054 {
00055 cbi(ADCSR, ADIE);
00056 cbi(ADCSR, ADEN);
00057 }
00058
00059 void a2dSetPrescaler(unsigned char prescale)
00060 {
00061
00062 outp( ((inp(ADCSR) & ~ADC_PRESCALE_MASK) | prescale), ADCSR);
00063 }
00064
00065 void a2dSetReference(unsigned char ref)
00066 {
00067
00068 outp( ((inp(ADMUX) & ~ADC_REFERENCE_MASK) | (ref<<6)), ADMUX);
00069 }
00070
00071 unsigned short a2dConvert10bit(unsigned char ch)
00072 {
00073 a2dCompleteFlag = FALSE;
00074 outp((inp(ADMUX) & ~ADC_MUX_MASK) | (ch & ADC_MUX_MASK), ADMUX);
00075 sbi(ADCSR, ADIF);
00076 sbi(ADCSR, ADSC);
00077 while(!a2dCompleteFlag);
00078
00079
00080 return (inp(ADCL) | (inp(ADCH)<<8));
00081 }
00082
00083 unsigned char a2dConvert8bit(unsigned char ch)
00084 {
00085 a2dCompleteFlag = FALSE;
00086 outp((inp(ADMUX) & ~ADC_MUX_MASK) | (ch & ADC_MUX_MASK), ADMUX);
00087 sbi(ADCSR, ADIF);
00088 sbi(ADCSR, ADSC);
00089 asm volatile ("nop");
00090 while(!a2dCompleteFlag);
00091
00092
00093
00094 return (((inp(ADCL)>>2 & 0x3F) | (inp(ADCH)<<6 & 0xC0)));
00095 }
00096