Dean Camera committed Feb 23, 2009 1 2 /* LUFA Library  Dean Camera committed Dec 30, 2009 3  Copyright (C) Dean Camera, 2010.  Dean Camera committed Feb 23, 2009 4 5 6 7 8 9  dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ /*  Dean Camera committed Dec 30, 2009 10  Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)  Dean Camera committed Feb 23, 2009 11   Dean Camera committed Dec 28, 2009 12 13 14 15 16 17 18  Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the  Dean Camera committed Feb 23, 2009 19 20 21 22 23 24 25 26 27 28 29 30 31 32  software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /** \file *  Dean Camera committed Feb 24, 2010 33  * ADC driver for the AT90USB1287, AT90USB1286, AT90USB647, AT90USB646, ATMEGA16U4 and ATMEGA32U4 AVRs.  Dean Camera committed Feb 23, 2009 34 35  * * \note This file should not be included directly. It is automatically included as needed by the ADC driver  Dean Camera committed Apr 17, 2009 36  * dispatch header located in LUFA/Drivers/Peripheral/ADC.h.  Dean Camera committed Feb 23, 2009 37 38  */  Dean Camera committed Apr 16, 2009 39 /** \ingroup Group_ADC  Dean Camera committed Feb 24, 2010 40  * @defgroup Group_ADC_AVRU4U6U7 Series U4, U6 and U7 Model ADC Driver  Dean Camera committed Apr 16, 2009 41  *  Dean Camera committed Feb 24, 2010 42  * ADC driver for the AT90USB1287, AT90USB1286, AT90USB647, AT90USB646, ATMEGA16U4 and ATMEGA32U4 AVRs.  Dean Camera committed Feb 01, 2010 43 44 45 46  * * \note This file should not be included directly. It is automatically included as needed by the ADC driver * dispatch header located in LUFA/Drivers/Peripheral/ADC.h. *  Dean Camera committed Apr 16, 2009 47 48 49  * @{ */  Dean Camera committed Feb 24, 2010 50 51 #ifndef __ADC_AVRU4U6U7_H__ #define __ADC_AVRU4U6U7_H__  Dean Camera committed Feb 23, 2009 52 53  /* Includes: */  Dean Camera committed Feb 24, 2010 54 55  #include "../../../Common/Common.h"  Dean Camera committed Feb 23, 2009 56 57 58 59 60 61 62 63 64  #include #include /* Enable C linkage for C++ Compilers: */ #if defined(__cplusplus) extern "C" { #endif /* Preprocessor Checks: */  Dean Camera committed Feb 11, 2010 65  #if !defined(__INCLUDE_FROM_ADC_H)  Dean Camera committed Apr 17, 2009 66  #error Do not include this file directly. Include LUFA/Drivers/Peripheral/ADC.h instead.  Dean Camera committed Feb 23, 2009 67 68 69  #endif /* Public Interface - May be used in end-application: */  Dean Camera committed Apr 19, 2009 70  /* Macros: */  Dean Camera committed Feb 23, 2009 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115  /** Reference mask, for using the voltage present at the AVR's AREF pin for the ADC reference. */ #define ADC_REFERENCE_AREF 0 /** Reference mask, for using the voltage present at the AVR's AVCC pin for the ADC reference. */ #define ADC_REFERENCE_AVCC (1 << REFS0) /** Reference mask, for using the internally generated 2.56V reference voltage as the ADC reference. */ #define ADC_REFERENCE_INT2560MV ((1 << REFS1)| (1 << REFS0)) /** Left-adjusts the 10-bit ADC result, so that the upper 8 bits of the value returned by the * ADC_GetResult() macro contain the 8 most significant bits of the result. */ #define ADC_LEFT_ADJUSTED (1 << ADLAR) /** Right-adjusts the 10-bit ADC result, so that the lower 8 bits of the value returned by the * ADC_GetResult() macro contain the 8 least significant bits of the result. */ #define ADC_RIGHT_ADJUSTED (0 << ADLAR) /** Sets the ADC mode to free running, so that conversions take place continuously as fast as the ADC * is capable of at the given input clock speed. */ #define ADC_FREE_RUNNING (1 << ADATE) /** Sets the ADC mode to single conversion, so that only a single conversion will take place before * the ADC returns to idle. */ #define ADC_SINGLE_CONVERSION (0 << ADATE) /** Sets the ADC input clock to prescale by a factor of 2 the AVR's system clock. */ #define ADC_PRESCALE_2 (1 << ADPS0) /** Sets the ADC input clock to prescale by a factor of 4 the AVR's system clock. */ #define ADC_PRESCALE_4 (1 << ADPS1) /** Sets the ADC input clock to prescale by a factor of 8 the AVR's system clock. */ #define ADC_PRESCALE_8 ((1 << ADPS0) | (1 << ADPS1)) /** Sets the ADC input clock to prescale by a factor of 16 the AVR's system clock. */ #define ADC_PRESCALE_16 (1 << ADPS2) /** Sets the ADC input clock to prescale by a factor of 32 the AVR's system clock. */ #define ADC_PRESCALE_32 ((1 << ADPS2) | (1 << ADPS0)) /** Sets the ADC input clock to prescale by a factor of 64 the AVR's system clock. */ #define ADC_PRESCALE_64 ((1 << ADPS2) | (1 << ADPS1)) /** Sets the ADC input clock to prescale by a factor of 128 the AVR's system clock. */ #define ADC_PRESCALE_128 ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0))  Dean Camera committed Jan 25, 2010 116 117 118  //@{ /** MUX mask define for the ADC0 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */  119  #define ADC_CHANNEL0 (0x00 << MUX0)  Dean Camera committed Jan 25, 2010 120 121  /** MUX mask define for the ADC1 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */  122  #define ADC_CHANNEL1 (0x01 << MUX0)  Dean Camera committed Jan 25, 2010 123   Dean Camera committed Jan 25, 2010 124 125 126 127 128  #if !(defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || defined(__DOXYGEN__)) /** MUX mask define for the ADC2 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. * * \note Note available on all AVR models. */  129  #define ADC_CHANNEL2 (0x02 << MUX0)  Dean Camera committed Jan 25, 2010 130 131 132 133 134  /** MUX mask define for the ADC3 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. * * \note Note available on all AVR models. */  135  #define ADC_CHANNEL3 (0x03 << MUX0)  Dean Camera committed Jan 25, 2010 136  #endif  Dean Camera committed Jan 25, 2010 137 138  /** MUX mask define for the ADC4 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */  139  #define ADC_CHANNEL4 (0x04 << MUX0)  Dean Camera committed Feb 23, 2009 140   Dean Camera committed Jan 25, 2010 141  /** MUX mask define for the ADC5 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */  142  #define ADC_CHANNEL5 (0x05 << MUX0)  Dean Camera committed Jan 25, 2010 143 144  /** MUX mask define for the ADC6 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */  145  #define ADC_CHANNEL6 (0x06 << MUX0)  Dean Camera committed Jan 25, 2010 146 147  /** MUX mask define for the ADC7 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */  148  #define ADC_CHANNEL7 (0x07 << MUX0)  Dean Camera committed Jan 25, 2010 149 150 151 152 153 154 155 156 157  /** MUX mask define for the internal 1.1V bandgap channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ #define ADC_1100MV_BANDGAP 0x1E #if (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || defined(__DOXYGEN__)) /** MUX mask define for the ADC8 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. * * \note Note available on all AVR models. */  158  #define ADC_CHANNEL8 ((1 << 8) | (0x00 << MUX0))  Dean Camera committed Jan 25, 2010 159 160 161 162 163  /** MUX mask define for the ADC9 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. * * \note Note available on all AVR models. */  164  #define ADC_CHANNEL9 ((1 << 8) | (0x01 << MUX0))  Dean Camera committed Jan 25, 2010 165 166 167 168 169  /** MUX mask define for the ADC10 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. * * \note Note available on all AVR models. */  170  #define ADC_CHANNEL10 ((1 << 8) | (0x02 << MUX0))  Dean Camera committed Jan 25, 2010 171 172 173 174 175  /** MUX mask define for the ADC11 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. * * \note Note available on all AVR models. */  176  #define ADC_CHANNEL11 ((1 << 8) | (0x03 << MUX0))  Dean Camera committed Jan 25, 2010 177 178 179 180 181  /** MUX mask define for the ADC12 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. * * \note Note available on all AVR models. */  182  #define ADC_CHANNEL12 ((1 << 8) | (0x04 << MUX0))  Dean Camera committed Jan 25, 2010 183 184 185 186 187  /** MUX mask define for the ADC13 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. * * \note Note available on all AVR models. */  188  #define ADC_CHANNEL13 ((1 << 8) | (0x05 << MUX0))  Dean Camera committed Jan 25, 2010 189 190 191 192 193 194  /** MUX mask define for the internal temperature sensor channel of the ADC. See \ref ADC_StartReading and * \ref ADC_GetChannelReading. * * \note Note available on all AVR models. */  195  #define ADC_INT_TEMP_SENS ((1 << 8) | (0x07 << MUX0))  Dean Camera committed Jan 25, 2010 196 197 198  #endif //@}  Dean Camera committed Apr 19, 2009 199 200 201 202 203 204  /* Pseudo-Function Macros: */ #if defined(__DOXYGEN__) /** Initializes the ADC, ready for conversions. This must be called before any other ADC operations. * The "mode" parameter should be a mask comprised of a conversion mode (free running or single) and * prescaler masks. *  Dean Camera committed Jun 28, 2009 205  * \param[in] Mode Mask of ADC settings, including adjustment, prescale, mode and reference  Dean Camera committed Apr 19, 2009 206 207  */ static inline void ADC_Init(uint8_t Mode);  Dean Camera committed Aug 23, 2009 208   Dean Camera committed Apr 19, 2009 209  /** Turns off the ADC. If this is called, any further ADC operations will require a call to  Dean Camera committed Apr 22, 2009 210  * \ref ADC_Init() before the ADC can be used again.  Dean Camera committed Apr 19, 2009 211  */  Dean Camera committed Aug 23, 2009 212  static inline void ADC_ShutDown(void);  Dean Camera committed Apr 19, 2009 213 214 215 216 217 218 219 220 221 222  /** Indicates if the ADC is currently enabled. * * \return Boolean true if the ADC subsystem is currently enabled, false otherwise. */ static inline bool ADC_GetStatus(void); /** Indicates if the current ADC conversion is completed, or still in progress. * * \return Boolean false if the reading is still taking place, or true if the conversion is  Dean Camera committed Apr 22, 2009 223  * complete and ready to be read out with \ref ADC_GetResult()  Dean Camera committed Apr 19, 2009 224 225 226  */ static inline bool ADC_IsReadingComplete(void);  227 228  /** Retrieves the conversion value of the last completed ADC conversion and clears the reading * completion flag.  Dean Camera committed Apr 19, 2009 229 230 231 232 233 234 235  * * \return The result of the last ADC conversion */ static inline uint16_t ADC_GetResult(void); #else #define ADC_Init(mode) MACROS{ ADCSRA = ((1 << ADEN) | mode); }MACROE  Dean Camera committed Aug 23, 2009 236  #define ADC_ShutDown() MACROS{ ADCSRA = 0; }MACROE  Dean Camera committed Apr 19, 2009 237 238 239  #define ADC_GetStatus() ((ADCSRA & (1 << ADEN)) ? true : false)  240  #define ADC_IsReadingComplete() ((ADCSRA & (1 << ADIF)) ? true : false)  Dean Camera committed Apr 19, 2009 241   242  #define ADC_GetResult() (ADCSRA |= (1 << ADIF), ADC)  Dean Camera committed Apr 19, 2009 243 244  #endif  Dean Camera committed Feb 23, 2009 245 246 247 248 249  /* Inline Functions: */ /** Configures the given ADC channel, ready for ADC conversions. This function sets the * associated port pin as an input and disables the digital portion of the I/O to reduce * power consumption. *  Dean Camera committed Jan 25, 2010 250 251 252 253 254  * \note This must only be called for ADC channels with are connected to a physical port * pin of the AVR, denoted by its special alternative function ADCx. * * \note The channel number must be specified as an integer, and NOT a ADC_CHANNELx mask. *  Dean Camera committed Jun 28, 2009 255  * \param[in] Channel ADC channel number to set up for conversions  Dean Camera committed Feb 23, 2009 256 257 258  */ static inline void ADC_SetupChannel(const uint8_t Channel) {  259 260 261  #if (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || \ defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__) || \ defined(__AVR_ATmega32U6__))  Dean Camera committed Mar 27, 2009 262  DDRF &= ~(1 << Channel);  Dean Camera committed Feb 23, 2009 263  DIDR0 |= (1 << Channel);  264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285  #elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__)) if (Channel < 8) { DDRF &= ~(1 << Channel); DIDR0 |= (1 << Channel); } else if (Channel == 8) { DDRD &= ~(1 << 4); DIDR2 |= (1 << 0); } else if (Channel < 11) { DDRD &= ~(1 << (Channel - 3)); DIDR2 |= (1 << (Channel - 8)); } else { DDRB &= ~(1 << (Channel - 7)); DIDR2 |= (1 << (Channel - 8)); } #endif  Dean Camera committed Feb 23, 2009 286 287 288  } /** Starts the reading of the given channel, but does not wait until the conversion has completed.  Dean Camera committed Apr 22, 2009 289 290  * Once executed, the conversion status can be determined via the \ref ADC_IsReadingComplete() macro and * the result read via the \ref ADC_GetResult() macro.  Dean Camera committed Feb 23, 2009 291  *  Dean Camera committed Jan 25, 2010 292  * \param[in] MUXMask Mask comprising of an ADC channel mask, reference mask and adjustment mask  Dean Camera committed Feb 23, 2009 293  */  294  static inline void ADC_StartReading(const uint16_t MUXMask)  Dean Camera committed Feb 23, 2009 295 296  { ADMUX = MUXMask;  297 298 299 300 301 302 303  #if (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || defined(__DOXYGEN__)) if (MUXMask & (1 << 8)) ADCSB |= (1 << MUX5); else ADCSB &= ~(1 << MUX5); #endif  Dean Camera committed Feb 23, 2009 304 305 306 307  ADCSRA |= (1 << ADSC); }  Dean Camera committed Nov 09, 2009 308  /** Performs a complete single reading from channel, including a polling spin-loop to wait for the  Dean Camera committed Feb 23, 2009 309 310  * conversion to complete, and the returning of the converted value. *  Dean Camera committed Jan 25, 2010 311  * \param[in] MUXMask Mask comprising of an ADC channel mask, reference mask and adjustment mask  Dean Camera committed Feb 23, 2009 312  */  313 314  static inline uint16_t ADC_GetChannelReading(const uint16_t MUXMask) ATTR_WARN_UNUSED_RESULT; static inline uint16_t ADC_GetChannelReading(const uint16_t MUXMask)  Dean Camera committed Feb 23, 2009 315 316 317 318 319 320 321 322 323 324 325 326 327 328  { ADC_StartReading(MUXMask); while (!(ADC_IsReadingComplete())); return ADC_GetResult(); } /* Disable C linkage for C++ Compilers: */ #if defined(__cplusplus) } #endif #endif  Dean Camera committed Apr 16, 2009 329 330  /** @} */