X-Git-Url: http://git.linex4red.de/pub/lufa.git/blobdiff_plain/857381185d60eed2ccee7dc7b88d49d90546f8a2..fd96b288824caaa3ee4e5e03887f016de9df80cf:/LUFA/Drivers/Peripheral/AVRU4U6U7/ADC.h diff --git a/LUFA/Drivers/Peripheral/AVRU4U6U7/ADC.h b/LUFA/Drivers/Peripheral/AVRU4U6U7/ADC.h index 100f2c104..e307c4e09 100644 --- a/LUFA/Drivers/Peripheral/AVRU4U6U7/ADC.h +++ b/LUFA/Drivers/Peripheral/AVRU4U6U7/ADC.h @@ -29,6 +29,7 @@ */ /** \file + * \brief ADC peripheral driver for the U7, U6 and U4 USB AVRs. * * ADC driver for the AT90USB1287, AT90USB1286, AT90USB647, AT90USB646, ATMEGA16U4 and ATMEGA32U4 AVRs. * @@ -39,6 +40,11 @@ /** \ingroup Group_ADC * @defgroup Group_ADC_AVRU4U6U7 Series U4, U6 and U7 Model ADC Driver * + * ADC driver for the AT90USB1287, AT90USB1286, AT90USB647, AT90USB646, ATMEGA16U4 and ATMEGA32U4 AVRs. + * + * \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. + * * @{ */ @@ -57,7 +63,7 @@ #endif /* Preprocessor Checks: */ - #if !defined(INCLUDE_FROM_ADC_H) + #if !defined(__INCLUDE_FROM_ADC_H) #error Do not include this file directly. Include LUFA/Drivers/Peripheral/ADC.h instead. #endif @@ -111,83 +117,83 @@ //@{ /** MUX mask define for the ADC0 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ - #define ADC_CHANNEL0 0x00 + #define ADC_CHANNEL0 (0x00 << MUX0) /** MUX mask define for the ADC1 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ - #define ADC_CHANNEL1 0x01 + #define ADC_CHANNEL1 (0x01 << MUX0) #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. */ - #define ADC_CHANNEL2 0x02 + #define ADC_CHANNEL2 (0x02 << MUX0) /** 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. */ - #define ADC_CHANNEL3 0x03 + #define ADC_CHANNEL3 (0x03 << MUX0) #endif /** MUX mask define for the ADC4 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ - #define ADC_CHANNEL4 0x04 + #define ADC_CHANNEL4 (0x04 << MUX0) /** MUX mask define for the ADC5 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ - #define ADC_CHANNEL5 0x05 + #define ADC_CHANNEL5 (0x05 << MUX0) /** MUX mask define for the ADC6 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ - #define ADC_CHANNEL6 0x06 + #define ADC_CHANNEL6 (0x06 << MUX0) /** MUX mask define for the ADC7 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ - #define ADC_CHANNEL7 0x07 + #define ADC_CHANNEL7 (0x07 << MUX0) /** 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 + #define ADC_1100MV_BANDGAP (0x1E << MUX0) #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. */ - #define ADC_CHANNEL8 0x20 + #define ADC_CHANNEL8 ((1 << 8) | (0x00 << MUX0)) /** 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. */ - #define ADC_CHANNEL9 0x21 + #define ADC_CHANNEL9 ((1 << 8) | (0x01 << MUX0)) /** 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. */ - #define ADC_CHANNEL10 0x22 + #define ADC_CHANNEL10 ((1 << 8) | (0x02 << MUX0)) /** 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. */ - #define ADC_CHANNEL11 0x23 + #define ADC_CHANNEL11 ((1 << 8) | (0x03 << MUX0)) /** 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. */ - #define ADC_CHANNEL12 0x24 + #define ADC_CHANNEL12 ((1 << 8) | (0x04 << MUX0)) /** 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. */ - #define ADC_CHANNEL13 0x25 + #define ADC_CHANNEL13 ((1 << 8) | (0x05 << MUX0)) /** 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. */ - #define ADC_INT_TEMP_SENS 0x27 + #define ADC_INT_TEMP_SENS ((1 << 8) | (0x07 << MUX0)) #endif //@} @@ -219,7 +225,8 @@ */ static inline bool ADC_IsReadingComplete(void); - /** Retrieves the conversion value of the last completed ADC conversion. + /** Retrieves the conversion value of the last completed ADC conversion and clears the reading + * completion flag. * * \return The result of the last ADC conversion */ @@ -231,9 +238,9 @@ #define ADC_GetStatus() ((ADCSRA & (1 << ADEN)) ? true : false) - #define ADC_IsReadingComplete() (ADCSRA & (1 << ADSC)) + #define ADC_IsReadingComplete() ((ADCSRA & (1 << ADIF)) ? true : false) - #define ADC_GetResult() ADC + #define ADC_GetResult() (ADCSRA |= (1 << ADIF), ADC) #endif /* Inline Functions: */ @@ -283,11 +290,22 @@ * 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. + * * \param[in] MUXMask Mask comprising of an ADC channel mask, reference mask and adjustment mask */ - static inline void ADC_StartReading(const uint8_t MUXMask) + static inline void ADC_StartReading(const uint16_t MUXMask) { ADMUX = MUXMask; + + #if (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || defined(__DOXYGEN__)) + if (MUXMask & (1 << 8)) + ADCSB |= (1 << MUX5); + else + ADCSB &= ~(1 << MUX5); + #endif ADCSRA |= (1 << ADSC); } @@ -295,10 +313,14 @@ /** 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. + * * \param[in] MUXMask Mask comprising of an ADC channel mask, reference mask and adjustment mask */ - static inline uint16_t ADC_GetChannelReading(const uint8_t MUXMask) ATTR_WARN_UNUSED_RESULT; - static inline uint16_t ADC_GetChannelReading(const uint8_t MUXMask) + 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);