MHVLib  20111011
An efficiency oriented runtime library for AVR microcontrollers
A:/eclipse/mhvlib/MHV_AD.h
Go to the documentation of this file.
00001 /* Copyright (c) 2011, Make, Hack, Void Inc
00002  * All rights reserved.
00003  *
00004  * Redistribution and use in source and binary forms, with or without
00005  * modification, are permitted provided that the following conditions are met:
00006  *  * Redistributions of source code must retain the above copyright
00007  *    notice, this list of conditions and the following disclaimer.
00008  *  * Redistributions in binary form must reproduce the above copyright
00009  *    notice, this list of conditions and the following disclaimer in the
00010  *    documentation and/or other materials provided with the distribution.
00011  *  * Neither the name of the Make, Hack, Void nor the
00012  *    names of its contributors may be used to endorse or promote products
00013  *    derived from this software without specific prior written permission.
00014  *
00015  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
00016  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
00017  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00018  * DISCLAIMED. IN NO EVENT SHALL MAKE, HACK, VOID BE LIABLE FOR ANY
00019  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
00020  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00021  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
00022  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00023  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00024  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00025  */
00026 
00027 #ifndef MHV_AD_H_
00028 #define MHV_AD_H_
00029 
00030 #include <MHV_io.h>
00031 
00032 // Maximum value of the ADC
00033 #define MHV_AD_MAX      1024
00034 
00035 enum mhv_ad_prescaler {
00036         MHV_AD_PRESCALER_2   = 1,
00037         MHV_AD_PRESCALER_4   = 2,
00038         MHV_AD_PRESCALER_8   = 3,
00039         MHV_AD_PRESCALER_16  = 4,
00040         MHV_AD_PRESCALER_32  = 5,
00041         MHV_AD_PRESCALER_64  = 6,
00042         MHV_AD_PRESCALER_128 = 7
00043 };
00044 typedef enum mhv_ad_prescaler MHV_AD_PRESCALER;
00045 
00046 // helper macros for adc trigger functions
00047 #define MHV_AD_REFERENCE (ADMUX & 0xF0)
00048 #ifdef __AVR_ATmega1280__
00049 #define MHV_AD_CHANNEL ((ADMUX & 0x0F) | (ADCSRB & _BV(MUX5)))
00050 #else
00051 #define MHV_AD_CHANNEL (ADMUX & 0x0F)
00052 #endif
00053 
00054 // trigger func takes uint16_t parm value
00055 #define MHV_AD_ASSIGN_INTERRUPT(adcTrigger) \
00056 ISR(ADC_vect) { \
00057         adcTrigger(ADC); \
00058 }
00059 
00060 // Enable/Disable interrupts for busyRead
00061 #define MHV_AD_ENABLE_INTERRUPT         ADCSRA |= _BV(ADIE)
00062 #define MHV_AD_DISABLE_INTERRUPT        ADCSRA &= ~_BV(ADIE)
00063 
00064 // Enable/Disable the ADC
00065 #define MHV_AD_ENABLE \
00066         do { \
00067                 MHV_AD_PRR &= ~_BV(PRADC); \
00068                 ADCSRA |= _BV(ADEN); \
00069         } while (0)
00070 
00071 #define MHV_AD_DISABLE \
00072         do { \
00073                 MHV_AD_PRR |= _BV(PRADC); \
00074                 ADCSRA |= _BV(ADEN); \
00075         } while (0)
00076 
00077 uint16_t mhv_ad_busyRead(uint8_t channel, uint8_t reference);
00078 void mhv_ad_asyncRead(uint8_t channel, uint8_t reference);
00079 void mhv_ad_setPrescaler(MHV_AD_PRESCALER prescaler);
00080 
00081 #endif /* MHV_AD_H_ */