From b68f7f16499a96e85c7cef4afd9da1a5c69e6a08 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Mon, 25 Jan 2010 00:52:45 +0000 Subject: Added explicit ADC channel masks for the standard set of ADC channels, as the single-ended channel MUX masks are not equal to the channel number on some AVR models. Changed demos to use the new channel masks when using the ADC driver. --- LUFA/Drivers/Board/Temperature.c | 2 +- LUFA/Drivers/Board/Temperature.h | 9 ++-- LUFA/Drivers/Peripheral/AVRU4U6U7/ADC.h | 83 ++++++++++++++++++++++++++++++++- 3 files changed, 88 insertions(+), 6 deletions(-) (limited to 'LUFA/Drivers') diff --git a/LUFA/Drivers/Board/Temperature.c b/LUFA/Drivers/Board/Temperature.c index 748e0484f..ea12bf766 100644 --- a/LUFA/Drivers/Board/Temperature.c +++ b/LUFA/Drivers/Board/Temperature.c @@ -45,7 +45,7 @@ static const uint16_t PROGMEM Temperature_Lookup[] = { int8_t Temperature_GetTemperature(void) { - uint16_t Temp_ADC = ADC_GetChannelReading(ADC_REFERENCE_AVCC | ADC_RIGHT_ADJUSTED | TEMP_ADC_CHANNEL); + uint16_t Temp_ADC = ADC_GetChannelReading(ADC_REFERENCE_AVCC | ADC_RIGHT_ADJUSTED | TEMP_ADC_CHANNEL_MASK); if (Temp_ADC > pgm_read_word(&Temperature_Lookup[0])) return TEMP_MIN_TEMP; diff --git a/LUFA/Drivers/Board/Temperature.h b/LUFA/Drivers/Board/Temperature.h index f7f00342f..1b2baf2fb 100644 --- a/LUFA/Drivers/Board/Temperature.h +++ b/LUFA/Drivers/Board/Temperature.h @@ -79,13 +79,16 @@ /* Public Interface - May be used in end-application: */ /* Macros: */ /** ADC channel number for the temperature sensor. */ - #define TEMP_ADC_CHANNEL 0 + #define TEMP_ADC_CHANNEL 0 + /** ADC channel MUX mask for the temperature sensor. */ + #define TEMP_ADC_CHANNEL_MASK ADC_CHANNEL0 + /** Minimum returnable temperature from the \ref Temperature_GetTemperature() function. */ - #define TEMP_MIN_TEMP TEMP_TABLE_OFFSET + #define TEMP_MIN_TEMP TEMP_TABLE_OFFSET /** Maximum returnable temperature from the \ref Temperature_GetTemperature() function. */ - #define TEMP_MAX_TEMP ((TEMP_TABLE_SIZE - 1) + TEMP_TABLE_OFFSET) + #define TEMP_MAX_TEMP ((TEMP_TABLE_SIZE - 1) + TEMP_TABLE_OFFSET) /* Pseudo-Function Macros: */ #if defined(__DOXYGEN__) diff --git a/LUFA/Drivers/Peripheral/AVRU4U6U7/ADC.h b/LUFA/Drivers/Peripheral/AVRU4U6U7/ADC.h index 472e1df47..b0a9b9e80 100644 --- a/LUFA/Drivers/Peripheral/AVRU4U6U7/ADC.h +++ b/LUFA/Drivers/Peripheral/AVRU4U6U7/ADC.h @@ -108,7 +108,81 @@ /** 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)) + + //@{ + /** MUX mask define for the ADC0 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ + #define ADC_CHANNEL0 0x00 + + /** MUX mask define for the ADC1 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ + #define ADC_CHANNEL1 0x01 + + /** MUX mask define for the ADC2 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ + #define ADC_CHANNEL2 0x02 + + /** MUX mask define for the ADC3 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ + #define ADC_CHANNEL3 0x03 + + /** MUX mask define for the ADC4 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ + #define ADC_CHANNEL4 0x04 + /** MUX mask define for the ADC5 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ + #define ADC_CHANNEL5 0x05 + + /** MUX mask define for the ADC6 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ + #define ADC_CHANNEL6 0x06 + + /** MUX mask define for the ADC7 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ + #define ADC_CHANNEL7 0x07 + + /** 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. + */ + #define ADC_CHANNEL8 0x20 + + /** 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 + + /** 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 + + /** 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 + + /** 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 + + /** 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 + + /** 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 + #endif + //@} + /* Pseudo-Function Macros: */ #if defined(__DOXYGEN__) /** Initializes the ADC, ready for conversions. This must be called before any other ADC operations. @@ -159,6 +233,11 @@ * 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. + * + * \note The channel number must be specified as an integer, and NOT a ADC_CHANNELx mask. + * * \param[in] Channel ADC channel number to set up for conversions */ static inline void ADC_SetupChannel(const uint8_t Channel) @@ -196,7 +275,7 @@ * Once executed, the conversion status can be determined via the \ref ADC_IsReadingComplete() macro and * the result read via the \ref ADC_GetResult() macro. * - * \param[in] MUXMask Mask comprising of an ADC channel number, reference mask and adjustment mask + * \param[in] MUXMask Mask comprising of an ADC channel mask, reference mask and adjustment mask */ static inline void ADC_StartReading(const uint8_t MUXMask) { @@ -208,7 +287,7 @@ /** 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. * - * \param[in] MUXMask Mask comprising of an ADC channel number, reference mask and adjustment mask + * \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) -- cgit v1.2.3