/* Copyright Robert Olsson */ #include #include #include #include #include #include #include "params.h" #include "rss2.h" #include "contiki.h" #include "adc.h" #include "rss2.h" uint16_t adc_read(uint8_t pin) { uint16_t volt = 0; int i; ADMUX = pin; /* ADC pin PA0-PA7 -> 0-7 */ ADCSRB &= ~(1 << MUX5); /* Needs to write before ADMUX pp 418 */ ADMUX |= (1 << REFS1) | (1 << REFS0); /* 1.6 */ /* Maximal Track and Hold time */ ADCSRA = (1 << ADPS2) | (0 << ADPS1) | (1 << ADPS0); /* Prescaler /32 */ ADCSRA |= (1 << ADEN); /* Enable the ADC */ while(!(ADCSRB & (1 << AVDDOK))) ; /* Wait for AVDD ok */ while(!(ADCSRB & (1 << REFOK))) ; /* Wait for ref ok */ /* Ignore first result */ ADCSRA |= (1 << ADSC); while(ADCSRA & _BV(ADSC)) { } ADCW = 0; #define RES 4 for(i = 0; i < RES; i++) { /* Start the conversion */ ADCSRA |= (1 << ADSC); /* Wait for conversion */ while(ADCSRA & (1 << ADSC)) { } volt += ADCW; } ADMUX = 0; /* turn off internal vref */ volt = volt / RES; /* Disable the ADC to save power */ ADCSRA &= ~_BV(ADEN); return volt; } double adc_read_v_in(void) { /* Special treatment for v_in. Schottky voltage drop add */ return ((double)adc_read(AV_IN)) * V_IN_FACTOR_SCHOTTKY + SCHOTTKY_DROP; } double adc_read_a1(void) { return ((double)adc_read(A1)) * V_IN_FACTOR; } double adc_read_a2(void) { return ((double)adc_read(A2)) * V_IN_FACTOR; }