From 7412e70c70dddf8d6dae0a1a777f9271fa2f56bb Mon Sep 17 00:00:00 2001 From: asterix Date: Fri, 21 Mar 2008 00:00:24 +0000 Subject: [PATCH] ADC low level implementation for avr. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@1206 38d2e660-2303-0410-9eaa-f027e97ec537 --- app/triface/hw/hw_adc.c | 109 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 app/triface/hw/hw_adc.c diff --git a/app/triface/hw/hw_adc.c b/app/triface/hw/hw_adc.c new file mode 100644 index 00000000..7b9d667b --- /dev/null +++ b/app/triface/hw/hw_adc.c @@ -0,0 +1,109 @@ +/** + * \file + * + * + * \brief ADC: Analogic to Digital Converter + * + * + * \version $Id$ + * + * \author Andrea Grandi + */ + +#include "hw_adc.h" + + +#include + +#include + +#include + +/** Set the active AI channel */ +void adc_set_active_ain(int ai) +{ + /* If number of channels is <= 4 we use the first two MUX bits */ + STATIC_ASSERT(ADC_CHANNEL_NUM <= 4); + + ai &= BV(0) | BV(1); + ADMUX &= ~BV(MUX0); + ADMUX &= ~BV(MUX1); + ADMUX |= ai; +} + +/** Initialize the ADC */ +void adc_init(void) +{ + /* Set analog IN as input */ + DDRF &= ~(BV(PF0) | BV(PF1) | BV(PF2) | BV(PF3)); + + /* Disable pull-up */ + PORTF &= ~(BV(PF0) | BV(PF1) | BV(PF2) | BV(PF3)); + + ENABLE_ADC; + adc_set_vref_avcc(); + SET_AI_ADLAR; + + /* Set the Division Factor to 128 */ + ADCSRA |= (BV(ADPS0) | BV(ADPS1) | BV(ADPS2)); +} + +/** Set the initial reference */ +void adc_set_vref_avcc(void) +{ + ADMUX &= ~BV(REFS1); + ADMUX |= BV(REFS0); +} + +/** Read the specified AI channel */ +int adc_read_ai_channel(int channel) +{ + adc_set_active_ain(channel); + timer_udelay(STABILIZING_AI_CHANNEL_TIME); + START_CONVERTION; + + while(ADCSRA & BV(ADSC)) + { + /* + * Intentionally empty loop. + * It waits the convertion to be completed by ADC + */ + } + + ADCSRA |= BV(ADIF); + + uint16_t val; + val = ADCL; + val |= (uint16_t)ADCH << 8; + + return val; +} -- 2.25.1