Forum: Mikrocontroller und Digitale Elektronik Atmega-88 ADC in Free-Running-Mode, wandelt nur 1x


von Matthias (Gast)


Lesenswert?

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

von S. Landolt (Gast)


Lesenswert?

Ob es ausschließlich daran liegt, kann ich auf die Schnelle nicht sagen, 
aber:

"... ADCL must be read first, then ADCH."

von S. Landolt (Gast)


Lesenswert?

PS:
Überhaupt: in C ist doch u_adc=ADC (oder u_adc=ADCW) möglich - dann 
kümmert sich der Compiler um solche Details.

von HildeK (Gast)


Lesenswert?

S. Landolt schrieb:
> "... ADCL must be read first, then ADCH."

... oder einfach ganz ohne die Funktion 'GET_VIO':
1
u_adc = ADC;

Man muss nicht ADCH und ADCL getrennt lesen und es dann zusammensetzen.

von Matthias (Gast)


Lesenswert?

S. Landolt schrieb:
> Ob es ausschließlich daran liegt, kann ich auf die Schnelle nicht sagen,
> aber:
>
> "... ADCL must be read first, then ADCH."

SUPER :)
Danke ;)
Genau daran lag es :)

HildeK schrieb:
> S. Landolt schrieb:
>> "... ADCL must be read first, then ADCH."
>
> ... oder einfach ganz ohne die Funktion 'GET_VIO':u_adc = ADC;
>
> Man muss nicht ADCH und ADCL getrennt lesen und es dann zusammensetzen.

Da habt ihr auch recht :)

Vielen Dank, damit ist mein Tool fast Fertig :)
Werd ich bei gelegenheit mal im Forum vorstellen :)

von Hin Wais (Gast)


Lesenswert?

Matthias schrieb:
> Werd ich bei gelegenheit mal im Forum vorstellen

Dann aber hoffentlich hast du endlich gelesen und verstanden
was hier in epischer Länge immer wieder geschrieben steht:

>>Wichtige Regeln - erst lesen, dann posten!
>>
>>..........
>>    Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.