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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 | |
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 |
|
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 |
|
82 | currentChannel = channel; //Update the channel for the last measurement to the one we want this time |
| 71 | */ |
- | |
| 72 |
|
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 */ } |