Forum: Mikrocontroller und Digitale Elektronik ADC auswertung


von funkeld (Gast)


Lesenswert?

ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
Was wird da oben genau gemacht, verstehe ich als Anfänger nicht.

gruss

: Verschoben durch User
von C-Tutor (Gast)


Lesenswert?

Was "&","|" und "~" machen, weisst du?

Dann zeichne es dir mal die einzelbits im ADMUX auf, und geh die 
Rechnung auf dem Papier nach (mit Zwischenschritten)

von Stefan B. (stefan) Benutzerseite


Lesenswert?


von Ralf (Gast)


Lesenswert?

> (ADMUX & ~(0x1F)
Das sorgt dafür, dass die fünf unteren Bits des Registers ADMUX gelöscht 
werden.

> (channel & 0x1F)
Und das übernimmt den Wert von channel in die fünf unteren Bits.

Zusammen verodert ergibt das das Setzen der fünf unteren Bits von ADMUX 
auf den Wert von channel, ohne die drei oberen Bits zu beeinflussen, 
selbst wenn in der Variablen channel eines der drei oberen Bits gesetzt 
wäre.

Reicht die Erklärung? :)

Ralf

von funkeld (Gast)


Lesenswert?

jup, danke ralf, jetzt habe ich es geschnallt.

gruss

von funkeld (Gast)


Lesenswert?

http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC

ADPS2  ADPS1  ADPS0  Vorteiler

0  0  0  2
0  0  1  2
0  1  0  4
0  1  1  8
1  0  0  16
1  0  1  32
1  1  0  64
1  1  1  128

Upps...,warum taucht da der Vorteiler mit der "2" zweimal auf?

hmmm.., versteh ich nicht.

gruss

von mike (Gast)


Lesenswert?

fehler...?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Eher nicht. Es zieht sich so durch viele Atmel AVR Datenblätter. Wenn 
man die Abbildung im Abschnitt Prescaling and Conversion Timing zum ADC 
Prescaler betrachtet, sieht man, dass die schnellste Frequenz CLK/2 ist. 
IMHO wollte man nur der vollständigkeithalber dokumentieren was die 
Bitkombination 0,0,0 bewirkt.

von Karl H. (kbuchegg)


Lesenswert?

funkeld schrieb:
> http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC
>
> ADPS2  ADPS1  ADPS0  Vorteiler
>
> 0  0  0  2
> 0  0  1  2
> 0  1  0  4
> 0  1  1  8
> 1  0  0  16
> 1  0  1  32
> 1  1  0  64
> 1  1  1  128
>
> Upps...,warum taucht da der Vorteiler mit der "2" zweimal auf?

Weil Atmel das so implementiert hat.

> hmmm.., versteh ich nicht.

Wenn du dir die Bits als Binärzahlen vorstellst, dann kodieren ADPS0 bis 
ADPS2 'numerisch' die Anzahl an Teilerstufen durch 2, die benutzt werden 
sollen.

   0 0 1       binär 1      2^1 = 2    oder 1 Teilerstufe
   0 1 0       binär 2      2^2 = 4    oder 2 Teilerstufen
   0 1 1       binär 3      2^3 = 8    oder 3 Teilerstufen
   etc

nur 0 ist eine Ausnahme, da Atmel es nicht als sinnvoll erachtet hat, 0 
Teilerstufen zwischen Systemtakt und ADC Takt zu schalten. Denn einen 
halbwegs vernünftigen Systemtakt vorausgesetzt (>500kHz) wäre das auf 
jeden Fall zu schnell für den ADC.

von funkeld (Gast)


Lesenswert?

hmmm. wenn ich dann den AVR mit 0,5mhz antreibe, komme ich nicht höher 
als 250khz obwohl ich gerne 400 gehabt hätte bei 0,5mhz.

gruss

von Karl H. (kbuchegg)


Lesenswert?

funkeld schrieb:
> hmmm. wenn ich dann den AVR mit 0,5mhz antreibe, komme ich nicht höher
> als 250khz obwohl ich gerne 400 gehabt hätte bei 0,5mhz.

Sags nicht mir.
Beschwer dich bei Atmel.

Bereite dich aber schon mal auf die Gegenfrage vor:
Was machst du mit einem Messergebnis alle 1.2 CPU-Takte? Wie und wo 
speicherst du das weg?

von holger (Gast)


Lesenswert?

>wenn ich dann den AVR mit 0,5mhz antreibe,

Das macht keinen Spass. Da bist du ja alt und grau
bevor der überhaupt einen Portpin setzen kann;)

von funkeld (Gast)


Lesenswert?

Babe in Bascom mal den ADC  nachempfunden aus dem AVR-WinAVR-TUT mit 
einem Sharpsensor.
Bekomme aber aus dem ADCL2 und ADCH2 nur die "2".
Welcher fehler liegt hier vor:
1
$regfile = "m644pdef.dat"
2
$framesize = 32
3
$swstack = 32
4
$hwstack = 64
5
$crystal = 16000000
6
$baud = 19200
7
8
Declare Sub Adc_init()
9
Declare Sub Adc_read()
10
11
Dim A_h As Word
12
Dim A_l As Byte
13
Dim Adc_ergeb As Word
14
Dim W As Byte
15
16
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
17
Open "COM1:" For Binary As #1
18
19
Call Adc_init()
20
21
Do
22
23
 Waitms 300
24
 Call Adc_read()
25
 Print #1 , Adc_ergeb
26
 Waitms 100
27
28
Loop
29
30
End
31
32
Sub Adc_init
33
   Set Admux.refs0
34
   Reset Admux.refs1                                        ' AVCC Referenzspannung nutzen
35
36
   Set Adcsra.adps0
37
   Set Adcsra.adps1
38
   Reset Adcsra.adps2                                       ' 8 Frequenzvorteiler
39
40
   Reset Adcsra.adate                                       ' Single
41
42
   Set Adcsra.aden                                          ' ADC aktivieren
43
44
   Set Adcsra.adsc
45
   While Adcsra.adsc = 1                                    ' eine ADC-Wandlung
46
   Wend
47
   A_l = Adcl2
48
   A_h = Adch2
49
End Sub
50
51
Sub Adc_read()
52
   Reset Admux.mux0
53
   Set Admux.mux1
54
   Reset Admux.mux2
55
   Reset Admux.mux3
56
   Reset Admux.mux4                                         ' PA2
57
58
   Set Adcsra.adsc
59
   While Adcsra.adsc = 1                                    ' eine ADC-Wandlung
60
   Wend
61
62
   A_l = Adcl2
63
   A_h = Adch2 * 256
64
   Adc_ergeb = A_l + A_h
65
End Sub


mit Bascom-originalbefehle funktioniert, also ist die Hardware 
beiderseits in Ordnung:
1
$regfile = "M644pdef.dat"
2
$crystal = 16000000
3
$hwstack = 32
4
$swstack = 32
5
$framesize = 64
6
$baud = 19200
7
8
Dim Adcv As Word
9
10
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
11
Open "COM1:" For Binary As #1
12
13
Config Adc = Single , Prescaler = 8 , Reference = Avcc
14
Start Adc
15
16
Enable Interrupts
17
18
Waitms 500
19
20
Do
21
22
Waitms 300
23
24
Adcv = Getadc(2)
25
Print #1 , Adcv
26
27
Loop
28
29
End

von Karl H. (kbuchegg)


Lesenswert?

Ohne jetzt Bascom an dieser Stelle zu kennen

   A_l = Adcl2
   A_h = Adch2

aber der Teil kommt mir Spanisch vor. Warum Adcl2 bzw. Adch2?

Der Mega hat doch nur einen ADC. Welchen Sinn soll es haben da hinten 
jetzt noch eine 2 anzuhängen?

   A_l = Adcl
   A_h = Adch

Das wär für mich logisch und nachvollziehbar.

von Karl H. (kbuchegg)


Lesenswert?

Und PS:
was hat die Frage im GCC Forum verloren?

Wenn du BASCOM Fragen hast, dann stell sie bitte im µC+Elektronik Forum. 
Dort gehören sie hin.

von funkeld (Gast)


Lesenswert?

die Register (PA0-PA7 als ADC0 - ADC7) sind so in der dat beschrieben, 
PA2 wird dann als ADCH2 angesprochen:

; ***** AD_CONVERTER *****************
; ADMUX - The ADC multiplexer Selection Register
MUX0  = 0  ; Analog Channel and Gain Selection Bits
MUX1  = 1  ; Analog Channel and Gain Selection Bits
MUX2  = 2  ; Analog Channel and Gain Selection Bits
MUX3  = 3  ; Analog Channel and Gain Selection Bits
MUX4  = 4  ; Analog Channel and Gain Selection Bits
ADLAR  = 5  ; Left Adjust Result
REFS0  = 6  ; Reference Selection Bit 0
REFS1  = 7  ; Reference Selection Bit 1

; ADCSRA - The ADC Control and Status register A
ADPS0  = 0  ; ADC  Prescaler Select Bits
ADPS1  = 1  ; ADC  Prescaler Select Bits
ADPS2  = 2  ; ADC  Prescaler Select Bits
ADIE  = 3  ; ADC Interrupt Enable
ADIF  = 4  ; ADC Interrupt Flag
ADATE  = 5  ; ADC  Auto Trigger Enable
ADSC  = 6  ; ADC Start Conversion
ADEN  = 7  ; ADC Enable

; ADCSRB - The ADC Control and Status register B
ADTS0  = 0  ; ADC Auto Trigger Source bit 0
ADTS1  = 1  ; ADC Auto Trigger Source bit 1
ADTS2  = 2  ; ADC Auto Trigger Source bit 2
;.equ  ACME  = 6  ;

; ADCH - ADC Data Register High Byte
ADCH0  = 0  ; ADC Data Register High Byte Bit 0
ADCH1  = 1  ; ADC Data Register High Byte Bit 1
ADCH2  = 2  ; ADC Data Register High Byte Bit 2
ADCH3  = 3  ; ADC Data Register High Byte Bit 3
ADCH4  = 4  ; ADC Data Register High Byte Bit 4
ADCH5  = 5  ; ADC Data Register High Byte Bit 5
ADCH6  = 6  ; ADC Data Register High Byte Bit 6
ADCH7  = 7  ; ADC Data Register High Byte Bit 7

; ADCL - ADC Data Register Low Byte
ADCL0  = 0  ; ADC Data Register Low Byte Bit 0
ADCL1  = 1  ; ADC Data Register Low Byte Bit 1
ADCL2  = 2  ; ADC Data Register Low Byte Bit 2
ADCL3  = 3  ; ADC Data Register Low Byte Bit 3
ADCL4  = 4  ; ADC Data Register Low Byte Bit 4
ADCL5  = 5  ; ADC Data Register Low Byte Bit 5
ADCL6  = 6  ; ADC Data Register Low Byte Bit 6
ADCL7  = 7  ; ADC Data Register Low Byte Bit 7

; DIDR0 - Digital Input Disable Register
ADC0D  = 0  ;
ADC1D  = 1  ;
ADC2D  = 2  ;
ADC3D  = 3  ;
ADC4D  = 4  ;
ADC5D  = 5  ;
ADC6D  = 6  ;
ADC7D  = 7  ;

von funkeld (Gast)


Lesenswert?

Wenn du BASCOM Fragen hast, dann stell sie bitte im µC+Elektronik Forum.
Dort gehören sie hin......

dann schieb sie mal rüber.

danke.

von Karl H. (kbuchegg)


Lesenswert?

funkeld schrieb:
> die Register (PA0-PA7 als ADC0 - ADC7) sind so in der dat beschrieben,
> PA2 wird dann als ADCH2 angesprochen:

Ach, echt?

Also ich les da, dass

> ADCH2  = 2  ; ADC Data Register High Byte Bit 2

dass ADCH2 das 2.te Bit vom Ergebnis-Register ADCH ist.

Bit!
Nicht Byte!

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.