Subversion Repositories HomeAutomation

Rev

Rev 785 | Rev 793 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed

Rev 785 Rev 792
Line 9... Line 9...
9
#include "adc.h"
9
#include "adc.h"
10
#include <config.h>
10
#include <config.h>
11
/*----------------------------------------------
11
/*----------------------------------------------
12
 * Functions
12
 * Functions
13
 * --------------------------------------------*/
13
 * --------------------------------------------*/
-
 
14
 
-
 
15
 static uint8_t currrentChannel; //Used to keep the channel of the last measurement. This is used to determine if the channel needs to be changed.
14
 
16
 
15
uint8_t ADC_Init(void)
17
uint8_t ADC_Init(void)
16
{
18
{
-
 
19
    /* Enable AVcc as Voltage Reference */
-
 
20
    ADMUX |= (1<<REFS0);
-
 
21
    ADMUX &= ~(1<<REFS1);
-
 
22
 
-
 
23
    /* Right adjust the result */
-
 
24
    ADMUX &= ~(1<<ADLAR);
-
 
25
 
-
 
26
    /* Wake up ADC and enable it */
-
 
27
    PRR &= ~(1<<PRADC);
17
#if ADCHAN == 0
28
    ADCSRA |= (1<<ADEN);
-
 
29
 
-
 
30
    /* Make sure that the next ADC_Get will do an empty measurement first by setting the channel to an impossible value */
-
 
31
    currentChannel = 10;
-
 
32
   
-
 
33
    return 0;
-
 
34
}
-
 
35
 
-
 
36
/*
-
 
37
 * Start reading adc value. Channel parameter is not implemented.
-
 
38
 */
-
 
39
uint16_t ADC_Get(uint8_t channel)
-
 
40
{
-
 
41
    uint16_t adcdata;
-
 
42
   
-
 
43
    if (currentChannel != channel) //Did we use this channel the last time?
-
 
44
    {
-
 
45
        switch(channel)//If not, let's switch the admux
-
 
46
        {
-
 
47
        case 0:
18
    /* Enable ADC0 */
48
            /* Enable ADC0 */
19
    ADMUX &= ~((1<<MUX0)|(1<<MUX1)|(1<<MUX2)|(1<<MUX3));
49
            ADMUX &= ~((1<<MUX0)|(1<<MUX1)|(1<<MUX2)|(1<<MUX3));
20
#elif ADCHAN == 1
50
        case 1:
21
    /* Enable ADC1 */
51
            /* Enable ADC1 */
22
    ADMUX |= (1<<MUX0);
52
            ADMUX |= (1<<MUX0);
23
    ADMUX &= ~((1<<MUX1)|(1<<MUX2)|(1<<MUX3));
53
            ADMUX &= ~((1<<MUX1)|(1<<MUX2)|(1<<MUX3));
24
#elif ADCHAN == 2
54
        case 2:
25
    /* Enable ADC2 */
55
            /* Enable ADC2 */
26
    ADMUX |= (1<<MUX1)|;
56
            ADMUX |= (1<<MUX1)|;
27
    ADMUX &= ~((1<<MUX0)|(1<<MUX2)|(1<<MUX3));
57
            ADMUX &= ~((1<<MUX0)|(1<<MUX2)|(1<<MUX3));
28
#elif ADCHAN == 3
58
        case 3:
29
    /* Enable ADC3 */
59
            /* Enable ADC3 */
30
    ADMUX |= (1<<MUX0)|(1<<MUX1);
60
            ADMUX |= (1<<MUX0)|(1<<MUX1);
31
    ADMUX &= ~((1<<MUX2)|(1<<MUX3));
61
            ADMUX &= ~((1<<MUX2)|(1<<MUX3));
32
#elif ADCHAN == 4
62
        case 4:
33
    /* Enable ADC4 */
63
            /* Enable ADC4 */
34
    ADMUX |= (1<<MUX2);
64
            ADMUX |= (1<<MUX2);
35
    ADMUX &= ~((1<<MUX0)|(1<<MUX1)|(1<<MUX3));
65
            ADMUX &= ~((1<<MUX0)|(1<<MUX1)|(1<<MUX3));
36
#elif ADCHAN == 5
66
        case 5:
37
    /* Enable ADC5 */
67
            /* Enable ADC5 */
38
    ADMUX |= (1<<MUX0)|(1<<MUX2);
68
            ADMUX |= (1<<MUX0)|(1<<MUX2);
39
    ADMUX &= ~((1<<MUX1)|(1<<MUX3));
69
            ADMUX &= ~((1<<MUX1)|(1<<MUX3));
40
#elif ADCHAN == 6
70
        case 6:
41
    /* Enable ADC6 */
71
            /* Enable ADC6 */
42
    ADMUX |= (1<<MUX1)|(1<<MUX2);
72
            ADMUX |= (1<<MUX1)|(1<<MUX2);
43
    ADMUX &= ~((1<<MUX0)|(1<<MUX3));
73
            ADMUX &= ~((1<<MUX0)|(1<<MUX3));
44
#elif ADCHAN == 7
74
        case 7:
45
    /* Enable ADC7 (only for TQFP package) */
75
            /* Enable ADC7 (only for TQFP package) */
46
    ADMUX |= (1<<MUX0)|(1<<MUX1)|(1<<MUX2);
76
            ADMUX |= (1<<MUX0)|(1<<MUX1)|(1<<MUX2);
47
    ADMUX &= ~(1<<MUX3);
77
            ADMUX &= ~(1<<MUX3);
48
#else
78
        default:
49
    #error No adc defined
-
 
50
#endif
-
 
51
 
-
 
52
    /* Enable AVcc as Voltage Reference */
-
 
53
    ADMUX |= (1<<REFS0);
-
 
54
    ADMUX &= ~(1<<REFS1);
-
 
55
 
-
 
56
    /* Right adjust the result */
79
            //Some kind of error message?
57
    ADMUX &= ~(1<<ADLAR);
-
 
58
 
-
 
59
    /* Wake up ADC and enable it */
-
 
60
    PRR &= ~(1<<PRADC);
-
 
61
    ADCSRA |= (1<<ADEN);
-
 
62
 
-
 
63
    /* Make the first conversion (takes 25 ADC clock cycles) and throw away */
-
 
64
    ADC_Get(0);
-
 
65
   
-
 
66
    return 0;
-
 
67
}
80
        }
68
 
81
       
69
/*
-
 
70
 * Start reading adc value. Channel parameter is not implemented.
82
        currentChannel = channel;   //Update the channel for the last measurement to the one we want this time
71
 */
-
 
72
uint16_t ADC_Get(uint8_t channel)
83
        ADC_Get(channel);   //And do a dummy-read
73
{
84
    }
74
    uint16_t adcdata;
-
 
75
 
85
 
76
    /* Start measurement (takes 13 ADC clock cycles) */
86
    /* Start measurement (takes 13 ADC clock cycles) */
77
    ADCSRA |= (1<<ADSC);
87
    ADCSRA |= (1<<ADSC);
78
 
88
 
79
    while( ADCSRA & (1<<ADSC) ){ /* Wait for conversion to complete */ }
89
    while( ADCSRA & (1<<ADSC) ){ /* Wait for conversion to complete */ }