www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC auswertung


Autor: funkeld (Gast)
Datum:

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

gruss

: Verschoben durch Moderator
Autor: C-Tutor (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: funkeld (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jup, danke ralf, jetzt habe ich es geschnallt.

gruss

Autor: funkeld (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
fehler...?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: funkeld (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;)

Autor: funkeld (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
$regfile = "m644pdef.dat"
$framesize = 32
$swstack = 32
$hwstack = 64
$crystal = 16000000
$baud = 19200

Declare Sub Adc_init()
Declare Sub Adc_read()

Dim A_h As Word
Dim A_l As Byte
Dim Adc_ergeb As Word
Dim W As Byte

Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Open "COM1:" For Binary As #1

Call Adc_init()

Do

 Waitms 300
 Call Adc_read()
 Print #1 , Adc_ergeb
 Waitms 100

Loop

End

Sub Adc_init
   Set Admux.refs0
   Reset Admux.refs1                                        ' AVCC Referenzspannung nutzen

   Set Adcsra.adps0
   Set Adcsra.adps1
   Reset Adcsra.adps2                                       ' 8 Frequenzvorteiler

   Reset Adcsra.adate                                       ' Single

   Set Adcsra.aden                                          ' ADC aktivieren

   Set Adcsra.adsc
   While Adcsra.adsc = 1                                    ' eine ADC-Wandlung
   Wend
   A_l = Adcl2
   A_h = Adch2
End Sub

Sub Adc_read()
   Reset Admux.mux0
   Set Admux.mux1
   Reset Admux.mux2
   Reset Admux.mux3
   Reset Admux.mux4                                         ' PA2

   Set Adcsra.adsc
   While Adcsra.adsc = 1                                    ' eine ADC-Wandlung
   Wend

   A_l = Adcl2
   A_h = Adch2 * 256
   Adc_ergeb = A_l + A_h
End Sub


mit Bascom-originalbefehle funktioniert, also ist die Hardware 
beiderseits in Ordnung:
$regfile = "M644pdef.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 32
$framesize = 64
$baud = 19200

Dim Adcv As Word

Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Open "COM1:" For Binary As #1

Config Adc = Single , Prescaler = 8 , Reference = Avcc
Start Adc

Enable Interrupts

Waitms 500

Do

Waitms 300

Adcv = Getadc(2)
Print #1 , Adcv

Loop

End

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: funkeld (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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  ;

Autor: funkeld (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.