Atmega-88 ADC in Free-Running-Mode, wandelt nur 1x

Gast #7115765
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
Gast #7115831
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 :)
Gast #7115905
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren