ADC auswertung

Gast #1891562
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
#1891896
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.
Gast #1897652
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
#1897678
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.
Gast #1897943
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  ;

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