ADC_AVR8.h 17.5 KB
Newer Older
 Dean Camera committed May 08, 2010 1 2 /* LUFA Library  Dean Camera committed Jan 01, 2011 3  Copyright (C) Dean Camera, 2011.  4   Dean Camera committed May 08, 2010 5  dean [at] fourwalledcubicle [dot] com  Dean Camera committed Oct 28, 2010 6  www.lufa-lib.org  Dean Camera committed May 08, 2010 7 8 9 */ /*  Dean Camera committed Jan 01, 2011 10  Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)  Dean Camera committed May 08, 2010 11   12  Permission to use, copy, modify, distribute, and sell this  Dean Camera committed May 08, 2010 13  software and its documentation for any purpose is hereby granted  14  without fee, provided that the above copyright notice appear in  Dean Camera committed May 08, 2010 15  all copies and that both that the copyright notice and this  16 17 18  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 May 08, 2010 19 20 21 22 23 24 25 26 27 28 29 30 31  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 19, 2011 32  * \brief ADC Peripheral Driver (AVR8)  Dean Camera committed May 08, 2010 33  *  Dean Camera committed Aug 31, 2010 34 35  * On-chip Analogue-to-Digital converter (ADC) driver for supported U4, U6 and U7 model AVRs that contain an ADC * peripheral internally.  Dean Camera committed May 08, 2010 36 37 38 39 40 41  * * \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. */ /** \ingroup Group_ADC  Dean Camera committed Feb 19, 2011 42  * \defgroup Group_ADC_AVR8 ADC Peripheral Driver (AVR8)  Dean Camera committed May 08, 2010 43  *  Dean Camera committed Feb 19, 2011 44  * \section Sec_ModDescription Module Description  Dean Camera committed Aug 31, 2010 45 46  * On-chip Analogue-to-Digital converter (ADC) driver for supported U4, U6 and U7 model AVRs that contain an ADC * peripheral internally.  Dean Camera committed May 08, 2010 47 48 49 50  * * \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 Dec 26, 2010 51 52 53 54  * \section Sec_ExampleUsage Example Usage * The following snippet is an example of how this module may be used within a typical * application. *  Dean Camera committed Dec 26, 2010 55  * \code  Dean Camera committed Jun 01, 2011 56  * // Initialize the ADC driver before first use  Dean Camera committed Dec 26, 2010 57 58 59 60 61 62 63 64 65 66 67  * ADC_Init(ADC_FREE_RUNNING | ADC_PRESCALE_32); * * // Must setup the ADC channel to read beforehand * ADC_SetupChannel(1); * * // Perform a single conversion of the ADC channel 1 * ADC_GetChannelReading(ADC_REFERENCE_AVCC | ADC_RIGHT_ADJUSTED | ADC_CHANNEL1); * printf("Conversion Result: %d\r\n", ADC_GetResult()); * * // Start reading ADC channel 1 in free running (continuous conversion) mode * ADC_StartReading(ADC_REFERENCE_AVCC | ADC_RIGHT_ADJUSTED | ADC_CHANNEL1);  Dean Camera committed Jul 06, 2011 68 69 70 71 72  * for (;;) * { * while (!(ADC_IsReadingComplete())) {}; * printf("Conversion Result: %d\r\n", ADC_GetResult()); * }  Dean Camera committed Dec 26, 2010 73 74  * \endcode *  Dean Camera committed May 08, 2010 75 76  * @{ */  77   Dean Camera committed Feb 19, 2011 78 79 #ifndef __ADC_AVR8_H__ #define __ADC_AVR8_H__  Dean Camera committed May 08, 2010 80 81 82  /* Includes: */ #include "../../../Common/Common.h"  83   Dean Camera committed May 08, 2010 84 85 86 87 88 89 90 91 92 93  /* Enable C linkage for C++ Compilers: */ #if defined(__cplusplus) extern "C" { #endif /* Preprocessor Checks: */ #if !defined(__INCLUDE_FROM_ADC_H) #error Do not include this file directly. Include LUFA/Drivers/Peripheral/ADC.h instead. #endif  Dean Camera committed Feb 19, 2011 94 95 96 97 98 99 100  #if !(defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || \ defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__) || \ defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || \ defined(__AVR_ATmega32U6__)) #error The ADC peripheral driver is not currently available for your selected microcontroller model. #endif  Dean Camera committed Jan 16, 2011 101 102 103 104 105 106 107  /* Private Interface - For use in library only: */ #if !defined(__DOXYGEN__) /* Macros: */ #define _ADC_GET_MUX_MASK2(y) ADC_CHANNEL ## y #define _ADC_GET_MUX_MASK(y) _ADC_GET_MUX_MASK2(y) #endif  Dean Camera committed May 08, 2010 108  /* Public Interface - May be used in end-application: */  109  /* Macros: */  Dean Camera committed Oct 28, 2010 110 111  /** \name ADC Reference Configuration Masks */ //@{  Dean Camera committed May 08, 2010 112  /** Reference mask, for using the voltage present at the AVR's AREF pin for the ADC reference. */  113  #define ADC_REFERENCE_AREF 0  Dean Camera committed May 08, 2010 114 115  /** Reference mask, for using the voltage present at the AVR's AVCC pin for the ADC reference. */  116  #define ADC_REFERENCE_AVCC (1 << REFS0)  Dean Camera committed May 08, 2010 117 118  /** Reference mask, for using the internally generated 2.56V reference voltage as the ADC reference. */  119  #define ADC_REFERENCE_INT2560MV ((1 << REFS1) | (1 << REFS0))  Dean Camera committed Oct 28, 2010 120 121 122 123  //@} /** \name ADC Result Adjustment Configuration Masks */ //@{  Dean Camera committed May 08, 2010 124  /** Left-adjusts the 10-bit ADC result, so that the upper 8 bits of the value returned by the  Dean Camera committed Jan 08, 2011 125  * \ref ADC_GetResult() macro contain the 8 most significant bits of the result.  Dean Camera committed Oct 13, 2010 126  */  127  #define ADC_LEFT_ADJUSTED (1 << ADLAR)  Dean Camera committed May 08, 2010 128 129  /** Right-adjusts the 10-bit ADC result, so that the lower 8 bits of the value returned by the  Dean Camera committed Jan 08, 2011 130  * \ref ADC_GetResult() macro contain the 8 least significant bits of the result.  Dean Camera committed Oct 13, 2010 131  */  132  #define ADC_RIGHT_ADJUSTED (0 << ADLAR)  Dean Camera committed Oct 28, 2010 133  //@}  134   Dean Camera committed Oct 28, 2010 135 136  /** \name ADC Mode Configuration Masks */ //@{  Dean Camera committed May 08, 2010 137  /** Sets the ADC mode to free running, so that conversions take place continuously as fast as the ADC  Dean Camera committed Oct 13, 2010 138 139  * is capable of at the given input clock speed. */  140  #define ADC_FREE_RUNNING (1 << ADATE)  Dean Camera committed May 08, 2010 141 142  /** Sets the ADC mode to single conversion, so that only a single conversion will take place before  Dean Camera committed Oct 13, 2010 143 144  * the ADC returns to idle. */  145  #define ADC_SINGLE_CONVERSION (0 << ADATE)  Dean Camera committed Oct 28, 2010 146 147 148 149  //@} /** \name ADC Prescaler Configuration Masks */ //@{  Dean Camera committed May 08, 2010 150  /** Sets the ADC input clock to prescale by a factor of 2 the AVR's system clock. */  151  #define ADC_PRESCALE_2 (1 << ADPS0)  Dean Camera committed May 08, 2010 152 153  /** Sets the ADC input clock to prescale by a factor of 4 the AVR's system clock. */  154  #define ADC_PRESCALE_4 (1 << ADPS1)  Dean Camera committed May 08, 2010 155 156  /** Sets the ADC input clock to prescale by a factor of 8 the AVR's system clock. */  157  #define ADC_PRESCALE_8 ((1 << ADPS0) | (1 << ADPS1))  Dean Camera committed May 08, 2010 158 159  /** Sets the ADC input clock to prescale by a factor of 16 the AVR's system clock. */  160  #define ADC_PRESCALE_16 (1 << ADPS2)  Dean Camera committed May 08, 2010 161 162  /** Sets the ADC input clock to prescale by a factor of 32 the AVR's system clock. */  163  #define ADC_PRESCALE_32 ((1 << ADPS2) | (1 << ADPS0))  Dean Camera committed May 08, 2010 164 165  /** Sets the ADC input clock to prescale by a factor of 64 the AVR's system clock. */  166  #define ADC_PRESCALE_64 ((1 << ADPS2) | (1 << ADPS1))  Dean Camera committed May 08, 2010 167 168  /** Sets the ADC input clock to prescale by a factor of 128 the AVR's system clock. */  169  #define ADC_PRESCALE_128 ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0))  Dean Camera committed Oct 28, 2010 170  //@}  171   Dean Camera committed Oct 28, 2010 172  /** \name ADC MUX Masks */  Dean Camera committed May 08, 2010 173  //@{  Dean Camera committed Jan 08, 2011 174  /** MUX mask define for the ADC0 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). */  175  #define ADC_CHANNEL0 (0x00 << MUX0)  Dean Camera committed May 08, 2010 176   Dean Camera committed Jan 08, 2011 177  /** MUX mask define for the ADC1 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). */  178  #define ADC_CHANNEL1 (0x01 << MUX0)  Dean Camera committed May 08, 2010 179   Dean Camera committed Nov 24, 2011 180  #if (!(defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__)) || defined(__DOXYGEN__))  Dean Camera committed Jan 08, 2011 181  /** MUX mask define for the ADC2 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading().  Dean Camera committed May 08, 2010 182 183 184  * * \note Not available on all AVR models. */  185  #define ADC_CHANNEL2 (0x02 << MUX0)  Dean Camera committed May 08, 2010 186   Dean Camera committed Jan 08, 2011 187  /** MUX mask define for the ADC3 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading().  Dean Camera committed May 08, 2010 188 189 190  * * \note Not available on all AVR models. */  191  #define ADC_CHANNEL3 (0x03 << MUX0)  Dean Camera committed May 08, 2010 192 193  #endif  Dean Camera committed Jan 08, 2011 194  /** MUX mask define for the ADC4 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). */  195  #define ADC_CHANNEL4 (0x04 << MUX0)  Dean Camera committed May 08, 2010 196   Dean Camera committed Jan 08, 2011 197  /** MUX mask define for the ADC5 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). */  198  #define ADC_CHANNEL5 (0x05 << MUX0)  Dean Camera committed May 08, 2010 199   Dean Camera committed Jan 08, 2011 200  /** MUX mask define for the ADC6 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). */  201  #define ADC_CHANNEL6 (0x06 << MUX0)  Dean Camera committed May 08, 2010 202 203  /** MUX mask define for the ADC7 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */  204  #define ADC_CHANNEL7 (0x07 << MUX0)  Dean Camera committed May 08, 2010 205 206  #if (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || defined(__DOXYGEN__))  Dean Camera committed Jan 08, 2011 207  /** MUX mask define for the ADC8 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading().  Dean Camera committed May 08, 2010 208 209 210  * * \note Not available on all AVR models. */  211  #define ADC_CHANNEL8 ((1 << 8) | (0x00 << MUX0))  Dean Camera committed May 08, 2010 212   Dean Camera committed Jan 08, 2011 213  /** MUX mask define for the ADC9 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading().  Dean Camera committed May 08, 2010 214 215 216  * * \note Not available on all AVR models. */  217  #define ADC_CHANNEL9 ((1 << 8) | (0x01 << MUX0))  Dean Camera committed May 08, 2010 218   Dean Camera committed Jan 08, 2011 219  /** MUX mask define for the ADC10 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading().  Dean Camera committed May 08, 2010 220 221 222  * * \note Not available on all AVR models. */  223  #define ADC_CHANNEL10 ((1 << 8) | (0x02 << MUX0))  Dean Camera committed May 08, 2010 224   Dean Camera committed Jan 08, 2011 225  /** MUX mask define for the ADC11 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading().  Dean Camera committed May 08, 2010 226 227 228  * * \note Not available on all AVR models. */  229  #define ADC_CHANNEL11 ((1 << 8) | (0x03 << MUX0))  Dean Camera committed May 08, 2010 230   Dean Camera committed Jan 08, 2011 231  /** MUX mask define for the ADC12 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading().  Dean Camera committed May 08, 2010 232 233 234  * * \note Not available on all AVR models. */  235  #define ADC_CHANNEL12 ((1 << 8) | (0x04 << MUX0))  Dean Camera committed May 08, 2010 236   Dean Camera committed Jan 08, 2011 237  /** MUX mask define for the ADC13 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading().  Dean Camera committed May 08, 2010 238 239 240  * * \note Not available on all AVR models. */  241  #define ADC_CHANNEL13 ((1 << 8) | (0x05 << MUX0))  Dean Camera committed May 08, 2010 242   Dean Camera committed Jan 08, 2011 243 244  /** MUX mask define for the internal temperature sensor channel of the ADC. See \ref ADC_StartReading() and * \ref ADC_GetChannelReading().  Dean Camera committed May 08, 2010 245 246 247  * * \note Not available on all AVR models. */  248  #define ADC_INT_TEMP_SENS ((1 << 8) | (0x07 << MUX0))  Dean Camera committed May 08, 2010 249  #endif  Dean Camera committed Jan 16, 2011 250   Dean Camera committed Nov 24, 2011 251 252 253  /** 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 << MUX0)  Dean Camera committed Jan 16, 2011 254 255 256 257 258 259 260 261  /** Retrieves the ADC MUX mask for the given ADC channel number. * * \note This macro will only work correctly on channel numbers that are compile-time * constants defined by the preprocessor. * * \param[in] Channel Index of the ADC channel whose MUX mask is to be retrieved. */ #define ADC_GET_CHANNEL_MASK(Channel) _ADC_GET_MUX_MASK(Channel)  Dean Camera committed May 08, 2010 262  //@}  263   Dean Camera committed May 08, 2010 264 265 266 267 268 269 270 271 272  /* 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. * * \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. * \n\n *  Dean Camera committed Jan 08, 2011 273  * \note The channel number must be specified as an integer, and not a \c ADC_CHANNEL* mask.  Dean Camera committed May 08, 2010 274  *  Dean Camera committed Aug 31, 2010 275  * \param[in] ChannelIndex ADC channel number to set up for conversions.  Dean Camera committed May 08, 2010 276  */  Dean Camera committed Aug 31, 2010 277  static inline void ADC_SetupChannel(const uint8_t ChannelIndex)  Dean Camera committed May 08, 2010 278 279 280  { #if (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || \ defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__) || \  281  defined(__AVR_ATmega32U6__))  Dean Camera committed Aug 31, 2010 282 283  DDRF &= ~(1 << ChannelIndex); DIDR0 |= (1 << ChannelIndex);  Dean Camera committed May 08, 2010 284  #elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__))  Dean Camera committed Aug 31, 2010 285  if (ChannelIndex < 8)  Dean Camera committed May 08, 2010 286  {  Dean Camera committed Aug 31, 2010 287 288  DDRF &= ~(1 << ChannelIndex); DIDR0 |= (1 << ChannelIndex);  Dean Camera committed May 08, 2010 289  }  Dean Camera committed Aug 31, 2010 290  else if (ChannelIndex == 8)  Dean Camera committed May 08, 2010 291 292 293 294  { DDRD &= ~(1 << 4); DIDR2 |= (1 << 0); }  Dean Camera committed Aug 31, 2010 295  else if (ChannelIndex < 11)  Dean Camera committed May 08, 2010 296  {  Dean Camera committed Aug 31, 2010 297 298  DDRD &= ~(1 << (ChannelIndex - 3)); DIDR2 |= (1 << (ChannelIndex - 8));  Dean Camera committed May 08, 2010 299 300 301  } else {  Dean Camera committed Aug 31, 2010 302 303  DDRB &= ~(1 << (ChannelIndex - 7)); DIDR2 |= (1 << (ChannelIndex - 8));  Dean Camera committed May 08, 2010 304 305 306  } #endif }  307   Dean Camera committed Jun 16, 2010 308  /** De-configures the given ADC channel, re-enabling digital I/O mode instead of analog. This  Dean Camera committed May 18, 2010 309 310 311 312 313 314 315  * function sets the associated port pin as an input and re-enabled the digital portion of * the I/O. * * \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. * \n\n *  Dean Camera committed Jan 08, 2011 316  * \note The channel number must be specified as an integer, and not a \c ADC_CHANNEL* mask.  Dean Camera committed May 18, 2010 317  *  Dean Camera committed Aug 31, 2010 318  * \param[in] ChannelIndex ADC channel number to set up for conversions.  Dean Camera committed May 18, 2010 319  */  Dean Camera committed Aug 31, 2010 320  static inline void ADC_DisableChannel(const uint8_t ChannelIndex)  Dean Camera committed May 18, 2010 321 322 323  { #if (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || \ defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__) || \  324  defined(__AVR_ATmega32U6__))  Dean Camera committed Aug 31, 2010 325 326  DDRF &= ~(1 << ChannelIndex); DIDR0 &= ~(1 << ChannelIndex);  Dean Camera committed May 18, 2010 327  #elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__))  Dean Camera committed Aug 31, 2010 328  if (ChannelIndex < 8)  Dean Camera committed May 18, 2010 329  {  Dean Camera committed Aug 31, 2010 330 331  DDRF &= ~(1 << ChannelIndex); DIDR0 &= ~(1 << ChannelIndex);  Dean Camera committed May 18, 2010 332  }  Dean Camera committed Aug 31, 2010 333  else if (ChannelIndex == 8)  Dean Camera committed May 18, 2010 334 335 336 337  { DDRD &= ~(1 << 4); DIDR2 &= ~(1 << 0); }  Dean Camera committed Aug 31, 2010 338  else if (ChannelIndex < 11)  Dean Camera committed May 18, 2010 339  {  Dean Camera committed Aug 31, 2010 340 341  DDRD &= ~(1 << (ChannelIndex - 3)); DIDR2 &= ~(1 << (ChannelIndex - 8));  Dean Camera committed May 18, 2010 342 343 344  } else {  Dean Camera committed Aug 31, 2010 345 346  DDRB &= ~(1 << (ChannelIndex - 7)); DIDR2 &= ~(1 << (ChannelIndex - 8));  Dean Camera committed May 18, 2010 347 348 349 350  } #endif }  Dean Camera committed May 08, 2010 351 352 353 354 355 356 357 358  /** Starts the reading of the given channel, but does not wait until the conversion has completed. * Once executed, the conversion status can be determined via the \ref ADC_IsReadingComplete() macro and * the result read via the \ref ADC_GetResult() macro. * * If the ADC has been initialized in free running mode, calling this function once will begin the repeated * conversions. If the ADC is in single conversion mode (or the channel to convert from is to be changed), * this function must be called each time a conversion is to take place. *  Dean Camera committed Aug 31, 2010 359  * \param[in] MUXMask ADC channel mask, reference mask and adjustment mask.  Dean Camera committed May 08, 2010 360 361 362 363  */ static inline void ADC_StartReading(const uint16_t MUXMask) { ADMUX = MUXMask;  364   Dean Camera committed May 08, 2010 365 366 367 368 369 370  #if (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || defined(__DOXYGEN__)) if (MUXMask & (1 << 8)) ADCSRB |= (1 << MUX5); else ADCSRB &= ~(1 << MUX5); #endif  371   Dean Camera committed May 08, 2010 372 373 374  ADCSRA |= (1 << ADSC); }  Dean Camera committed Jul 22, 2010 375 376 377 378 379 380 381 382 383 384  /** 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 * complete and ready to be read out with \ref ADC_GetResult(). */ static inline bool ADC_IsReadingComplete(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool ADC_IsReadingComplete(void) { return ((ADCSRA & (1 << ADIF)) ? true : false); }  385   Dean Camera committed Jul 22, 2010 386 387 388 389 390 391 392 393 394 395 396 397  /** Retrieves the conversion value of the last completed ADC conversion and clears the reading * completion flag. * * \return The result of the last ADC conversion as an unsigned value. */ static inline uint16_t ADC_GetResult(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint16_t ADC_GetResult(void) { ADCSRA |= (1 << ADIF); return ADC; }  Dean Camera committed May 08, 2010 398 399 400 401 402 403 404  /** Performs a complete single reading from channel, including a polling spin-loop to wait for the * conversion to complete, and the returning of the converted value. * * \note For free running mode, the automated conversions should be initialized with a single call * to \ref ADC_StartReading() to select the channel and begin the automated conversions, and * the results read directly from the \ref ADC_GetResult() instead to reduce overhead. *  Dean Camera committed Jun 17, 2010 405  * \param[in] MUXMask Mask comprising of an ADC channel mask, reference mask and adjustment mask.  Dean Camera committed Sep 22, 2011 406 407  * * \return Converted ADC result for the given ADC channel.  Dean Camera committed May 08, 2010 408 409 410 411 412  */ static inline uint16_t ADC_GetChannelReading(const uint16_t MUXMask) ATTR_WARN_UNUSED_RESULT; static inline uint16_t ADC_GetChannelReading(const uint16_t MUXMask) { ADC_StartReading(MUXMask);  413   Dean Camera committed May 08, 2010 414  while (!(ADC_IsReadingComplete()));  415   Dean Camera committed May 08, 2010 416 417 418  return ADC_GetResult(); }  Dean Camera committed Jun 01, 2011 419  /** Initializes the ADC, ready for conversions. This must be called before any other ADC operations.  Dean Camera committed Jul 22, 2010 420 421 422  * The "mode" parameter should be a mask comprised of a conversion mode (free running or single) and * prescaler masks. *  Dean Camera committed Aug 31, 2010 423  * \param[in] Mode Mask of ADC prescale and mode settings.  Dean Camera committed Jul 22, 2010 424  */  Dean Camera committed Nov 24, 2011 425 426  static inline void ADC_Init(const uint8_t Mode) ATTR_ALWAYS_INLINE; static inline void ADC_Init(const uint8_t Mode)  Dean Camera committed Jul 22, 2010 427 428 429 430 431 432 433  { ADCSRA = ((1 << ADEN) | Mode); } /** Turns off the ADC. If this is called, any further ADC operations will require a call to * \ref ADC_Init() before the ADC can be used again. */  434 435  static inline void ADC_Disable(void) ATTR_ALWAYS_INLINE; static inline void ADC_Disable(void)  Dean Camera committed Jul 22, 2010 436 437 438  { ADCSRA = 0; }  439   Dean Camera committed Jul 22, 2010 440 441  /** Indicates if the ADC is currently enabled. *  Dean Camera committed Jan 08, 2011 442  * \return Boolean \c true if the ADC subsystem is currently enabled, \c false otherwise.  Dean Camera committed Jul 22, 2010 443 444 445 446 447 448  */ static inline bool ADC_GetStatus(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool ADC_GetStatus(void) { return ((ADCSRA & (1 << ADEN)) ? true : false); }  449   Dean Camera committed May 08, 2010 450 451 452 453  /* Disable C linkage for C++ Compilers: */ #if defined(__cplusplus) } #endif  454   Dean Camera committed May 08, 2010 455 456 457 #endif /** @} */  458