Fixed ADC routines not correctly returning the last result when multiple channels were read.

Fixed ADC routines failing to read the extended channels (Channels 8 to 13, Internal Temperature Sensor) on the U4 series USB AVR parts.
This commit is contained in:
Dean Camera 2010-03-13 10:14:51 +00:00
parent aca7863350
commit 4f9dd142e7
2 changed files with 33 additions and 22 deletions

View File

@ -116,36 +116,36 @@
//@{ //@{
/** MUX mask define for the ADC0 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ /** 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. */ /** 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__)) #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. /** 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. * \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. /** 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. * \note Note available on all AVR models.
*/ */
#define ADC_CHANNEL3 0x03 #define ADC_CHANNEL3 (0x03 << MUX0)
#endif #endif
/** MUX mask define for the ADC4 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ /** 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. */ /** 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. */ /** 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. */ /** 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. */ /** 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
@ -155,44 +155,44 @@
* *
* \note Note available on all AVR models. * \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. /** 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. * \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. /** 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. * \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. /** 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. * \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. /** 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. * \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. /** 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. * \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 /** MUX mask define for the internal temperature sensor channel of the ADC. See \ref ADC_StartReading and
* \ref ADC_GetChannelReading. * \ref ADC_GetChannelReading.
* *
* \note Note available on all AVR models. * \note Note available on all AVR models.
*/ */
#define ADC_INT_TEMP_SENS 0x27 #define ADC_INT_TEMP_SENS ((1 << 8) | (0x07 << MUX0))
#endif #endif
//@} //@}
@ -224,7 +224,8 @@
*/ */
static inline bool ADC_IsReadingComplete(void); 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 * \return The result of the last ADC conversion
*/ */
@ -236,9 +237,9 @@
#define ADC_GetStatus() ((ADCSRA & (1 << ADEN)) ? true : false) #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 #endif
/* Inline Functions: */ /* Inline Functions: */
@ -290,10 +291,17 @@
* *
* \param[in] MUXMask Mask comprising of an ADC channel mask, 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) static inline void ADC_StartReading(const uint16_t MUXMask)
{ {
ADMUX = 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); ADCSRA |= (1 << ADSC);
} }
@ -302,8 +310,8 @@
* *
* \param[in] MUXMask Mask comprising of an ADC channel mask, 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 uint16_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)
{ {
ADC_StartReading(MUXMask); ADC_StartReading(MUXMask);

View File

@ -22,7 +22,10 @@
* <b>Fixed:</b> * <b>Fixed:</b>
* - Fixed software PDI/TPI programming mode in the AVRISP project not correctly toggling just the clock pin * - Fixed software PDI/TPI programming mode in the AVRISP project not correctly toggling just the clock pin
* - Fixed TWI_StartTransmission() corrupting the contents of the GPIOR0 register * - Fixed TWI_StartTransmission() corrupting the contents of the GPIOR0 register
* - Fix TWI driver not aborting when faced with no response after attempting to address a device on the bus * - Fixed TWI driver not aborting when faced with no response after attempting to address a device on the bus
* - Fixed ADC routines not correctly returning the last result when multiple channels were read
* - Fixed ADC routines failing to read the extended channels (Channels 8 to 13, Internal Temperature Sensor) on the
* U4 series USB AVR parts
* *
* \section Sec_ChangeLog100219 Version 100219 * \section Sec_ChangeLog100219 Version 100219
* *