Main Page   Compound List   File List   Compound Members   File Members  

a2d.c

Go to the documentation of this file.
00001 
00002 //*****************************************************************************
00003 //
00004 // File Name    : 'a2d.c'
00005 // Title                        : Analog-to-digital converter functions
00006 // Author               : Pascal Stang - Copyright (C) 2002
00007 // Created              : 4/08/2002
00008 // Revised              : 4/30/2002
00009 // Version              : 1.1
00010 // Target MCU   : Atmel AVR series
00011 // Editor Tabs  : 3
00012 //
00013 // This code is distributed under the GNU Public License
00014 //              which can be found at http://www.gnu.org/licenses/gpl.txt
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 // global variables
00026 
00027 // software flag used to indicate when
00028 // the conversion is complete
00029 volatile unsigned char a2dCompleteFlag;
00030 
00031 // interrupt handler for ADC complete interrupt
00032 SIGNAL(SIG_ADC)
00033 {
00034         // set the a2d conversion flag
00035         // to indicate "complete"
00036         a2dCompleteFlag = TRUE;
00037 }
00038 
00039 // functions
00040 void a2dInit(void)
00041 {
00042         sbi(ADCSR, ADEN);                                               // enable ADC (turn on ADC power)
00043         cbi(ADCSR, ADFR);                                               // default to single sample convert mode
00044         a2dSetPrescaler(ADC_PRESCALE);  // set default prescaler
00045         a2dSetReference(ADC_REFERENCE); // set default reference
00046 
00047    sbi(ADCSR, ADIE);                                            // enable ADC interrupts
00048                 
00049         a2dCompleteFlag = FALSE;                        // clear conversion complete flag
00050         sei();                                                                  // turn on interrupts (if not already on)
00051 }
00052 
00053 void a2dOff(void)
00054 {
00055         cbi(ADCSR, ADIE);                                               // disable ADC interrupts
00056         cbi(ADCSR, ADEN);                                               // disable ADC (turn off ADC power)
00057 }
00058 
00059 void a2dSetPrescaler(unsigned char prescale)
00060 {
00061         // configure A2D converter clock division (prescaling)
00062         outp( ((inp(ADCSR) & ~ADC_PRESCALE_MASK) | prescale), ADCSR);
00063 }
00064 
00065 void a2dSetReference(unsigned char ref)
00066 {
00067         // configure A2D converter voltage reference
00068         outp( ((inp(ADMUX) & ~ADC_REFERENCE_MASK) | (ref<<6)), ADMUX);
00069 }
00070 
00071 unsigned short a2dConvert10bit(unsigned char ch)
00072 {
00073         a2dCompleteFlag = FALSE;        // clear conversion complete flag
00074         outp((inp(ADMUX) & ~ADC_MUX_MASK) | (ch & ADC_MUX_MASK), ADMUX);        // set channel
00075         sbi(ADCSR, ADIF);                               // clear hardware "conversion complete" flag 
00076         sbi(ADCSR, ADSC);                               // start conversion
00077         while(!a2dCompleteFlag);        // wait until conversion complete
00078 
00079         // CAUTION: MUST READ ADCL BEFORE ADCH!!!
00080         return (inp(ADCL) | (inp(ADCH)<<8));    // read ADC (full 10 bits);
00081 }
00082 
00083 unsigned char a2dConvert8bit(unsigned char ch)
00084 {
00085         a2dCompleteFlag = FALSE;        // clear conversion complete flag
00086         outp((inp(ADMUX) & ~ADC_MUX_MASK) | (ch & ADC_MUX_MASK), ADMUX);        // set channel
00087         sbi(ADCSR, ADIF);                               // clear hardware "conversion complete" flag
00088         sbi(ADCSR, ADSC);                               // start conversion
00089         asm volatile ("nop");
00090         while(!a2dCompleteFlag);        // wait until conversion complete
00091         //while( bit_is_clear(ADCSR, ADIF) );   // wait until conversion complete
00092 
00093         // CAUTION: MUST READ ADCL BEFORE ADCH!!!
00094         return (((inp(ADCL)>>2 & 0x3F) | (inp(ADCH)<<6 & 0xC0)));       // return ADC MSB byte
00095 }
00096 

Generated at Fri Oct 25 15:36:37 2002 for avrlib by doxygen1.2.8.1 written by Dimitri van Heesch, © 1997-2001