Rev 33 |
Blame |
Compare with Previous |
Last modification |
View Log
| Download
| RSS feed
/**************************************************************************//**
* \brief ADC library.
* \author Copyright (C) 2012 Julien Le Sech - www.idreammicro.com
* \version 1.0
* \date 20121029
*
* This file is part of the iDreamMicro library.
*
* This library is free software: you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any
* later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see http://www.gnu.org/licenses/
******************************************************************************/
/**************************************************************************//**
* \file adc.c
******************************************************************************/
/******************************************************************************
* Header file inclusions.
******************************************************************************/
#include "../adc.h"
#include <useful/bits.h>
#include <avr/io.h>
#include <stdint.h>
/******************************************************************************
* Public function definitions.
******************************************************************************/
/**************************************************************************//**
* \fn void adc__single_channel_initialize(adc__channel_t channel)
*
* \brief Initialize ADC.
*
* \param channel ADC channel.
******************************************************************************/
void
adc__single_channel_initialize
(
adc__channel_t channel
){
// Enable ADC.
BIT__SET(ADCSRA, ADEN);
// Clock prescaled by 16.
// If Clock speed is 16 MHz, then ADC clock = 16 MHz / 16 = 1 MHz.
ADCSRA |= 0b00000100;
// Disable Digital Input on ADC Channel 0 to reduce power consumption
DIDR0 = 0b00111111;
// Disable Left-Adjust.
ADMUX = 0b01000000;
// Select ADC channel as input.
ADMUX |= channel;
}
/**************************************************************************//**
* \fn uint16_t adc__single_channel_read(void)
*
* \brief Read ADC.
*
* \return Read value.
******************************************************************************/
uint16_t
adc__single_channel_read
(
void
){
// Start ADC Conversion.
BIT__SET(ADCSRA, ADSC);
// Wait till conversion is complete.
//while ((ADCSRA & (1 << ADIF)) != 0x10);
while (!BIT__TST(ADCSRA, ADIF));
// Read the ADC Result.
uint16_t value = ADC;
// Clear ADC Conversion Interrupt Flag.
BIT__RST(ADCSRA, ADIF);
return value;
}