* The "mode" parameter should be a mask comprised of a conversion mode (free running or single) and
* prescaler masks.
*
- * \param[in] Mode Mask of ADC settings, including adjustment, prescale, mode and reference
+ * \param[in] Mode Mask of ADC settings, including adjustment, prescale, mode and reference.
*/
static inline void ADC_Init(uint8_t Mode);
/** 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()
+ * complete and ready to be read out with \ref ADC_GetResult().
*/
static inline bool ADC_IsReadingComplete(void);
/** 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 as an unsigned value.
*/
static inline uint16_t ADC_GetResult(void);
#else
*
* \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
+ * \param[in] Channel ADC channel number to set up for conversions.
*/
static inline void ADC_SetupChannel(const uint8_t Channel)
{
#endif
}
+ /** De-configures the given ADC channel, re-enabling digital I/O mode instead of analog. This
+ * 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
+ *
+ * \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_DisableChannel(const uint8_t Channel)
+ {
+ #if (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || \
+ defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__) || \
+ defined(__AVR_ATmega32U6__))
+ DDRF &= ~(1 << Channel);
+ DIDR0 &= ~(1 << Channel);
+ #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
+ }
+
/** 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.
* 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
+ * \param[in] MUXMask Mask comprising of an ADC channel mask, reference mask and adjustment mask.
*/
static inline void ADC_StartReading(const uint16_t MUXMask)
{
* 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
+ * \param[in] MUXMask Mask comprising of an ADC channel mask, reference mask and adjustment mask.
*/
static inline uint16_t ADC_GetChannelReading(const uint16_t MUXMask) ATTR_WARN_UNUSED_RESULT;
static inline uint16_t ADC_GetChannelReading(const uint16_t MUXMask)