ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); Was wird da oben genau gemacht, verstehe ich als Anfänger nicht. gruss
:
Verschoben durch User
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)
> (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
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
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.
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.
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
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?
>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;)
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 |
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.
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.
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 ;
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.