Hallo Zusammen,
vielleicht habt ihr eine Idee, warum der ADC nur 1x wandelt und dann
immer dass selbe Ergebniss zurückgegeben wird.
Dabei habe ich folgenden Code
1 | #include <avr/io.h>
|
2 |
|
3 | //USES:
|
4 | //VCCIO = ADC0
|
5 | //AVCC = VCC
|
6 | //AREF = 100NF
|
7 | //V-ADC = (ADC-Value*VREF)/1024
|
8 |
|
9 | /*
|
10 | ADMUX-Reg:
|
11 | RESET-Value
|
12 | 7654 3210
|
13 | 0000 0000
|
14 | |||| |||-MUX0
|
15 | |||| ||--MUX1
|
16 | |||| |---MUX2
|
17 | |||| ----MUX3 --> USE ADC0
|
18 | |||- ----NC
|
19 | ||-- ----ADLAR --> Result is right Adjusted
|
20 | |--- ----REFS0 --> External-refference
|
21 | ---- ----REFS1
|
22 |
|
23 | USED-Value
|
24 | 7654 3210
|
25 | 0100 0000 = 0x40
|
26 | |||| |||-MUX0
|
27 | |||| ||--MUX1
|
28 | |||| |---MUX2
|
29 | |||| ----MUX3 --> USE ADC0
|
30 | |||- ----NC
|
31 | ||-- ----ADLAR --> Result is right Adjusted
|
32 | |--- ----REFS0 --> Use AVCC with external CAP at AREF-Pin
|
33 | ---- ----REFS1
|
34 |
|
35 | ADCSRA-REG:
|
36 | RESET-Value
|
37 | 7654 3210
|
38 | 0000 0000
|
39 | |||| |||-ADSP0
|
40 | |||| ||--ADSP1
|
41 | |||| |---ADSP2 --> ADC-CLK Division-factor = 2
|
42 | |||| ----ADIE --> ADC-Interrupt is disabled
|
43 | |||- ----ADIF --> Interrupt Flag, set by ADC if conversion = Completed
|
44 | ||-- ----ADATE --> No Start with trigger-signal
|
45 | |--- ----ADSC --> Conversion stopped
|
46 | ---- ----ADEN --> ADC = Disabled
|
47 |
|
48 | USED-Value
|
49 | 7654 3210
|
50 | 1110 0111 = 0xE7
|
51 | |||| |||-ADSP0
|
52 | |||| ||--ADSP1
|
53 | |||| |---ADSP2 --> ADC-CLK Division-factor = 128
|
54 | |||| ----ADIE --> ADC-Interrupt is disabled
|
55 | |||- ----ADIF --> Interrupt Flag, set by ADC if conversion = Completed
|
56 | ||-- ----ADATE --> Continous conversion start
|
57 | |--- ----ADSC --> Conversion START
|
58 | ---- ----ADEN --> ADC = ENABLED
|
59 |
|
60 | ADCSRB-REG:
|
61 | RESET-Value == USED-Value
|
62 | 7654 3210
|
63 | 0000 0000
|
64 | |||| |||-ADTS0
|
65 | |||| ||--ADTS1
|
66 | |||| |---ADTS2 --> Free-Running Mode
|
67 | |||| ----nc
|
68 | |||- ----nc
|
69 | ||-- ----nc
|
70 | |--- ----ACME --> Only for Analog-Comparator
|
71 | ---- ----nc
|
72 |
|
73 | DIDR0-REG:
|
74 | RESET-Value
|
75 | 7654 3210
|
76 | 0000 0000
|
77 | |||| |||-ADC0D --> Digital-Input-Buffer VCCINT = Enabled
|
78 | |||| ||--ADC1D --> Digital-Input-Buffer V+ = Enabled
|
79 | |||| |---ADC2D --> Digital-Input-Buffer VDD = Enabled
|
80 | |||| ----ADC3D --> Digital-Input-Buffer VCCIO = Enabled
|
81 | |||- ----ADC4D --> Digital-Input-Buffer SDA = Enabled
|
82 | ||-- ----ADC5D --> Digital-Input-Buffer SCL = Enabled
|
83 | |--- ----nc
|
84 | ---- ----nc
|
85 |
|
86 | USED-Value
|
87 | 7654 3210
|
88 | 0000 1111 = 0x0f
|
89 | |||| |||-ADC0D --> Digital-Input-Buffer VCCINT = Disabled
|
90 | |||| ||--ADC1D --> Digital-Input-Buffer V+ = Disabled
|
91 | |||| |---ADC2D --> Digital-Input-Buffer VDD = Disabled
|
92 | |||| ----ADC3D --> Digital-Input-Buffer VCCIO = Disabled
|
93 | |||- ----ADC4D --> Digital-Input-Buffer SDA = Enabled
|
94 | ||-- ----ADC5D --> Digital-Input-Buffer SCL = Enabled
|
95 | |--- ----nc
|
96 | ---- ----nc
|
97 |
|
98 | */
|
99 |
|
100 | void INIT_ADC()
|
101 | {
|
102 | DIDR0 = 0x0F;
|
103 | ADMUX = 0x40;
|
104 | ADCSRB = 0x00; // = Reset-Value
|
105 | ADCSRA = 0xE7; // Start continous conv
|
106 | }
|
107 |
|
108 | uint16_t GET_VIO()
|
109 | {
|
110 | uint16_t u_adc = 0x0000;
|
111 | u_adc = ADCH;
|
112 | u_adc = (u_adc << 8);
|
113 | u_adc |= ADCL;
|
114 | //result = 10Bit
|
115 | return u_adc;
|
116 | }
|
Es scheint als wäre er im Free-Running Mode, jedoch liefert er nur
einmal ein (Korrektes) Ergebniss, dann jedoch niemals mehr ein neues.
Free-Running bedeutet schon dass er durchgehend wandlet, oder?
Schöne Grüße, ware echt Prima wenn mich jemand auf die Spur bringen
könnte.
Grüße, Matthias