X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=examples%2Ftriface%2Fhw%2Fhw_adc.c;fp=examples%2Ftriface%2Fhw%2Fhw_adc.c;h=8c603eb84fd0e09fe9043b4ad15737dcff79150a;hb=24c21c92d29b76a3f0de0a107f4bafef7bb0f812;hp=0000000000000000000000000000000000000000;hpb=6b7a2e7b20bc7fe05a61c17d6d96eb70c67a09c9;p=bertos.git diff --git a/examples/triface/hw/hw_adc.c b/examples/triface/hw/hw_adc.c new file mode 100644 index 00000000..8c603eb8 --- /dev/null +++ b/examples/triface/hw/hw_adc.c @@ -0,0 +1,109 @@ +/** + * \file + * + * + * \brief ADC: Analogic to Digital Converter + * + * + * \version $Id$ + * + * \author Andrea Grandi + */ + +#include "hw/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; +}